Bereitstellung eines Vertrags aus einer Multisig-Wallet

Ich habe mit Mist ein Multisig-Wallet erstellt, weiß aber nicht, wie ich einen Vertrag von der Wallet-Adresse aus bereitstellen soll. Ist es überhaupt möglich? Wenn ja, wie geht das?

Was ist hier das Ziel? Es ist wahrscheinlich möglich, einen Vertrag mit einem Multisig-Wallet bereitzustellen, aber die Gaskosten werden enorm sein, da Sie die Vertragsdaten in der Multisig-Transaktion speichern, genehmigen und dann den Vertrag bereitstellen müssen. Das Konto, das einen Vertrag bereitstellt, erhält keine Sonderberechtigungen, es sei denn, der Vertrag gibt sie ihm, und Sie könnten den Vertrag ziemlich einfach ändern, damit Sie festlegen können, wer Sonderberechtigungen erhält, anstatt anzunehmen, dass sie an den Deployer gehen. Ich würde den Vertrag einfach mit Standardschlüsseln bereitstellen und dem Multisig-Vertrag spezielle Berechtigungen zuweisen.

Antworten (4)

Es wäre möglich, ein Multisig-Wallet mit etwas Fingerspitzengefühl zu nutzen, vorausgesetzt, der Multisig-Vertrag kann beliebige Funktionen in anderen Verträgen aufrufen.

Da die meisten Multisigs selbst keinen Vertrag erstellen können, wird eine helfende Hand benötigt. Ein "Factory"-Vertrag könnte zuerst manuell bereitgestellt werden (von jedem/jedem). Es würde die Vorlage des zu erstellenden Vertrags und eine Funktion enthalten, z function deployInstance() .... Ein Multisig könnte diese Funktion aufrufen. Dies würde normalerweise dazu führen, dass Multisig Eigentümerrechte erwirbt.

Dies würde die Kosten einer einmaligen Bereitstellung verdoppeln, aber es wäre erledigt.

Es ist erwähnenswert, dass es praktisch sein kann, von einem normalen EOA aus bereitzustellen und dann das Eigentum an der Multisig zu übertragen, wenn das Ziel des Endzustands darin besteht, dass die Multisig Eigentümer ist. Übertragbarkeit ist eine Eigenschaft des Bereitstellungsvertrags, aber nicht ungewöhnlich oder unangemessen.

Ich hoffe es hilft.

Es hängt von der Multisig-Wallet ab, die Sie verwenden, aber höchstwahrscheinlich nein.

Es gibt 2 Fälle:

  • Fall 1: Sie kennen den zu implementierenden Smart Contract B aus Smart Contract A, BEVOR Sie A bereitstellen
  • Fall 2: Sie kennen nur den Smart Contract B, um A bereitzustellen, NACHDEM Sie A bereitgestellt haben

Fall 1

Dies ist der häufigste Fall und der einzige Fall, in dem Sie nur Solidity verwenden können. Wenn Sie Ihren Smart Contract A schreiben, müssen Sie B importieren oder B in derselben Datei definieren. In einer Funktion können Sie eine Instanz von B wie folgt erstellen:

B b = new B()

Fall 2

Solidität allein reicht in diesem Fall nicht aus. Sie müssen verwenden assembly, was eine Art Notausstieg ist, der von Solidity bereitgestellt wird, damit Sie angeben können, welchen EVM-Opcode Sie ausführen möchten. Dies ist die flexibelste Art, das EVM von Solidity zu verwenden, aber es ist auch riskant, weil Sie sich aufhängen können.

Das wäre der Ablauf:

  1. Kompilieren Sie den Smart Contract in Bytecode
  2. Übergeben Sie diesen Bytecode als Argument einer Funktion an den Smart Contract
  3. Verwenden Sie in dieser Funktion, assemblyum den CREATEOpcode aufzurufen, und übergeben Sie ihm den Bytecode

Dies ist theoretisch möglich, obwohl nicht alle Implementierungen von Multisig-Wallets dies zulassen. Die Vertragserstellung wird durch Opcodes durchgeführt, die sich von den Opcodes unterscheiden, die zum Ausführen normaler Transaktionen verwendet werden, weshalb die Vertragserstellung nicht als gewöhnliche Transaktion strukturiert werden kann. ABDK Multisig Wallet ist ein Beispiel für eine Multisig-Wallet mit der Möglichkeit zur Vertragserstellung.

Dies ist möglich, indem diese Funktion mit den richtigen Parametern aufgerufen wird:

    // Outside-visible transact entry point. Executes transaction immediately if below daily spend limit.
    // If not, goes into multisig process. We provide a hash on return to allow the sender to provide
    // shortcuts for the other confirmations (allowing them to avoid replicating the _to, _value
    // and _data arguments). They still get the option of using them if they want, anyways.
    function execute(address _to, uint _value, bytes _data) external onlyowner returns (bytes32 _r)

In den _toParameter geben Sie eine neue Adresse für den Vertrag ein (normalerweise wird sie deterministisch aus einem Satz von Parametern berechnet , aber ich weiß nicht, ob sie obligatorisch ist ) und im _dataFeld müssen Sie die ABI Ihres Vertrags codieren .

Die execute()immer ausgeführte EVM- CALLAnweisung. Ein Vertragsabschluss ist damit nicht möglich.
@PawełBylica danke! Könnten wir den Vertrag ändern, um einen anderen Opcode aufzurufen, und dann funktioniert es?
Nein. Sie benötigen zumindest eine andere Funktion ähnlich der execute(), die CREATEauf den bereitgestellten Bytes aufgerufen wird. Möglicherweise müssen Sie auch die Inline-Assemblierung verwenden.