Wie generiert solc den Bytecode für einen Vertrag?

Ich hatte es satt, meinen web3-Bereitstellungstext zu remixen und zu kopieren und einzufügen, also versuche ich, ein Python-Skript zu schreiben, das diesen Bereitstellungstest für mich generiert. Eines der Felder im Instanziierungscode sind jedoch Daten, und es enthält eine Bytecode-Darstellung des Vertrags. Wie kann ich diesen Bytecode auch generieren? Ich kann py-solc aus irgendeinem Grund nicht verwenden (wenn ich von solc import * eingebe, erhalte ich einen ModuleNotFound-Fehler). Wenn ich diesen Bytecode also manuell neu erstellen könnte, wäre das großartig.

Hier ist ein Beispiel dafür, was ich versuche:

für Smart Contract "Storage.sol" unten:

pragma solidity ^0.4.0;

contract Storage {
    uint storedData;
    address lastSetter;
    function set(uint x) public {
        storedData = x;
        lastSetter = msg.sender;
    }

    function get() public constant returns (uint) {
        return storedData;
    }

    function getLastSetter() public constant returns (address) {
      return lastSetter;
    }
}

Remix generiert diese web3-Bereitstellung:

var storageContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"getLastSetter","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]);
var storage = storageContract.new(
   {
     from: web3.eth.accounts[0], 
     data: * long hex number *, 
     gas: '4700000'
   }, function (e, contract){
    console.log(e, contract);
    if (typeof contract.address !== 'undefined') {
         console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
    }
 })

Mein Skript kann dies tun:

var storageContract = web3.eth.contract([{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","outputs":[],"payable":false,"stateMutability":"type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[],"payable":false,"stateMutability":"type":"function"},{"constant":true,"inputs":[],"name":"getLastSetter","outputs":[],"payable":false,"stateMutability":"type":"function"},])
var storage = storageContract.new(
    {
        from: web3.eth.accounts[0],
        data: '',
        gas: '470000'
    }, function(e, contract){
        console.log(e, contract);
        if (typeof contract.address != 'undefined') {
          console.log('Contract successfully mined. address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
    }
})

(Ich finde immer noch die Statemutability (was ist das überhaupt?) Und auch das Output-Parsing, aber das ist eine Frage für einen anderen Tag)

Zusammenfassend versuche ich, ein Python-Skript zu schreiben, das von der Solidität bis zum Text-Remix „web3 deploy“ reicht, der generiert wird. Wie kann ich das erforderliche Bytecode-Feld generieren?

Bearbeiten: Ich habe in den sauren Apfel gebissen und meine Installation von py-solc erneut in Angriff genommen. Habe es diesmal richtig gemacht; Ich habe versehentlich pip2.x statt pip3.x installiert. Ich würde immer noch gerne wissen, wie py-solc den Bytecode generiert, aber das Projekt funktioniert wissen. Vielen Dank für Ihre Hilfe

Sie sollten ein Framework wie Populus oder Truffle verwenden , um die Bereitstellung zu automatisieren.
@Ismael Ich könnte das tun, aber wie könnte ich dieses Tool zum Laufen bringen? Ich habe Trüffel verwendet, fand aber den Test- und Bereitstellungsprozess umständlich und langsam, während es mir schneller gehen würde, wenn ich in der Lage wäre, einen bereitstellbaren Web3-Text zu erstellen und ihn in Geth zu werfen

Antworten (1)

Sie müssen den Solidity-Compiler (solc) verwenden, um Ihren Solidity-Code in Bytecode zu kompilieren. Wenn Sie Remix oder nicht verwenden können py-solc, können Sie versuchen, es einfach solcdirekt zu installieren und sich darauf einzulassen. Aber ich würde empfehlen, herauszufinden, was bei Ihrer py-solcInstallation schief gelaufen ist. Ich benutze py-solcund finde es ziemlich einfach zu bedienen.

BEARBEITEN

Die ABI (der Teil, der „stateMutability“ enthält) wird auch vom Solidity-Compiler ausgegeben.

Danke! Ich werde nachsehen, was passiert ist. Ich habe einen ModuleNotFound-Fehler erhalten, also habe ich es wahrscheinlich nicht an der richtigen Stelle installiert