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?
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:
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()
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:
assembly
um den CREATE
Opcode aufzurufen, und übergeben Sie ihm den BytecodeDies 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 _to
Parameter 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 _data
Feld müssen Sie die ABI Ihres Vertrags codieren .
execute()
immer ausgeführte EVM- CALL
Anweisung. Ein Vertragsabschluss ist damit nicht möglich.execute()
, die CREATE
auf den bereitgestellten Bytes aufgerufen wird. Möglicherweise müssen Sie auch die Inline-Assemblierung verwenden.
AusIV