Übergeben von Konstruktorargumenten beim Bereitstellen des Vertrags aus Bytecode

Ich versuche, einen Vertrag über MyEtherWallet aus Bytecode bereitzustellen , der durch Browser-Solidität generiert wurde. Ich habe meine Brieftasche mit einem privaten Schlüssel entsperrt, aber keine Möglichkeit gefunden, Parameter an den Konstruktor des Vertrags zu übergeben. Wie kann ich das machen?

Dies lässt mich bezweifeln, dass ich alle Funktionen meines Vertrags von MyEtherWallet aus aufrufen kann, wie ich es mit Mist konnte.
Ich verwende MyEtherWallet als Ersatz für Mist, da ich dadurch keine Blockchain-Daten herunterladen kann. Ich bin mir jedoch nicht sicher, ob dies als Ersatz für Mist für die Bereitstellung und den Zugriff auf Verträge funktioniert.

Bearbeiten 1: Selbst beim Bereitstellen eines Vertrags aus Mist mit Bytecode gibt es keine Möglichkeit, einen Kontakt auszuwählen und Parameter an den Vertrag zu übergeben. Während der Bereitstellung des Vertrags aus dem Quellcode funktioniert dies wie erwartet.

Antworten (4)

Wenn Sie sich die Dokumentation von Web3 ansehen, erhalten Sie den vollständigen Bereitstellungsbytecode mit:

  var bytecodeWithParam = MyContract.new.getData (
     param1,
     param2,
     {data: compiledByteCode});

Diesen bytecodeWithParam fügen Sie in das Feld " bytecodeWithParam " ein. Wenn Sie es sich genauer ansehen, sehen Sie am Ende die 32-Byte- param2 param1 und param2 .

Was ist MyContrac hier? Ich denke, die Schritte sind Teil der Bereitstellung des Vertrags von geth. Ich habe kein Geth (oder wenn ich mit der Befehlszeile nicht vertraut bin). Ich habe meinen Vertrag vom Solidity-Compiler kompiliert, er hat mir einen kompilierten Bytecode gegeben. Wie geht es jetzt weiter?
So erstellen Sie MyContract mit der Ausgabe des Solidity Compilers: github.com/ethereum/wiki/wiki/JavaScript-API#returns-48
Warum sollte ich web3.js verwenden? Ich habe meinen Vertrag beispielsweise mit Trüffel kompiliert und möchte ihn mit MyEtherWallet bereitstellen. Wie kann ich Parameter an den Vertragskonstruktor übergeben?

Erstellen Sie mit ethereumlib-js eine Transaktion ohne Adresse.

Das Datenfeld <smartcontract code><parameters of constructor> : <smartcontract code><parameters of constructor>

Die <parameters of constructor> werden als https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI#argument-encoding codiert

ZB Vertragscode:

 pragma solidity ^0.4.4; contract User { uint age; function User(uint _age) public { age = _age; } } 

Kompilieren Sie es, erhalten Sie Binärcode:

 0x60606040523415600e57600080fd5b5b60016000555b5b60368060236000396000f30060606040525b600080fd00a165627a7a72305820320c27c3dd64a117b2c58da94ee3ac9ad9ae923fa87b4e9ed89a7291dd16b7430029 

Transaktion erstellen:

 var EthereumTx = require('ethereumjs-tx'); var privateKey = Buffer.from('xxyyzz', 'hex'); const txParams = { nonce: '0x00', gasPrice: '0x09184e72a000', gasLimit: '0x2DC6C0', data: '0x60606040523415600e57600080fd5b604051602080606f833981016040528080519150505b60008190555b505b60368060396000396000f30060606040525b600080fd00a165627a7a72305820ad0318d19ac274c1f3db9f2953f4631a745431e13641a6f5ca294cf9fb8ba3fc00290000000000000000000000000000000000000000000000000000000000000001' } const tx = new EthereumTx(txParams) tx.sign(privateKey) const serializedTx = tx.serialize(); console.log(serializedTx.toString('hex')); 

Push-Rohtransaktion zum Netzwerk. Erledigt :)

Wenn Sie eine neuere Version von web3 verwenden (z. B. Version 1.0.0):

  // example solidity code function ContractName(address _arg1, uint256 _arg2, uint256 _arg3) public { arg1 = _arg1; arg2 = _arg2; arg3 = _arg3; } 

Verwenden Sie web3.eth.abi.encodeParameter () oder web3.eth.abi.encodeParameters () , um Ihre Parameter zu codieren und am Ende Ihres Bytecodes zu verketten.

 const Web3 = require("web3"); const solc = require("solc"); // compile the solidity code let compiled = solc.compile(source); // save public interface of contract let abi = JSON.parse(compiled.contracts[":ContractName"].interface) // create var with contract let CrowdFunding = new web3.eth.Contract(abi); let bytecodeWithParameters = compiled.contracts[':ContractName'].bytecode + web3.eth.abi.encodeParameters(['address', 'uint256', 'uint256'], ['0x08cf02070bb9f167556c677da58e6678bbe871fc', '100000000000000000', '10000']).slice(2); // slice(2) because we want to remove the '0x' at the beginning. 

Jetzt können Sie unter https://www.myetherwallet.com/#contracts bytecodeWithParameters eingeben, um es beispielsweise mit seinen Parametern bereitzustellen.

"Oder"? Sprechen Sie Deutsch? :) :)
Ja, sowas gehört länger;)

Dies ist wirklich eine MyEtherWallet-spezifische Frage.

Wenn Sie einen Vertrag über MyEtherWallet bereitstellen, wird nur Bytecode übergeben. Es gibt keinen Punkt, an dem Sie Ihre Parameter einfügen können.

Um MyEtherWallet dafür zu verwenden, sollten Sie die Parameterwerte in Ihrer Quelle fest codieren, bevor Sie sie zu Bytecode kompilieren.

Damit der Standard-Wahlvertrag 5 Vorschläge in einem Vertrag enthält ... Machen Sie den vorhandenen parametrisierten Konstruktor zu einer privaten Funktion, fügen Sie einen neuen parameterlosen Konstruktor hinzu, der ihn mit dem Parametersatz aufruft ...

Es ist nicht perfekt, aber ziemlich klar und erledigt den Job!

  // Parameterless constructor - 5 proposals constructor() public { construct_ballot(5); } /// Create a new ballot with $(_numProposals) different proposals. function construct_ballot (uint8 _numProposals) private { chairperson = msg.sender; voters[chairperson].weight = 1; proposals.length = _numProposals; } 

Schneiden Sie dann den Bytecode aus dem Compiler-Tool Ihrer Wahl aus und fügen Sie ihn in MyEtherWallet ein.

ps. Ich denke, Sie könnten die '5' (oder was auch immer Ihre Parameter sind) im Bytecode finden und im MyEtherWallet-Bytecode-Textfeld nach Bedarf manuell bearbeiten, wenn Sie nicht jedes Mal (!) Zum Compiler zurückkehren möchten.