Offline unterzeichneter Vertrag wirft „Überschreitung des Blockgaslimits“. Warum kann ich nicht bereitstellen?

Ich versuche, einen Smart Contract auf der Ethereum-Blockchain bereitzustellen, indem ich die Transaktion auf einem Offline-Computer signiere und dann den Bytecode zur Bereitstellung an ein Online-System übertrage. Aus diesem Grund kann ich den aktuellen Gaspreis und die Gaslimits nicht in Echtzeit abfragen.

Ich erhalte die Meldung „ Fehler: Zurückgegebener Fehler: Blockiergasgrenze überschritten “.

Ich glaube, der Preis für die Bereitstellung eines Vertrags basiert eher darauf, wie viele Funktionen ausgeführt und wie viele Ressourcen verwendet werden, und daher ist die Größe möglicherweise zu grob, um zu sagen, was los ist, aber meine ist: 3984 Bytes.

Ich habe derzeit mein Gaslimit auf 1.200.000 (1,2 Millionen) und meinen Gaspreis auf 2 Gwei (2.000.000.000 oder 2 Milliarden) eingestellt. Hinweis: Ich habe es gerade ausprobiert und es schlägt mit einem Gaslimit von 500.000 fehl! WTF??

Ich verstehe nicht, wie ich das Blocklimit überschreite, wenn https://ethstats.net/ durchgehend ein Blocklimit von rund 8.000.000 (8 Millionen) meldet.

Ich verwende mehrere Solidity-Quelldateien, die ich in die einlese sol_input_array, und ziele dann auf die Hauptdatei ab, die mit der parent_file_and_objectZeichenfolge auf die Funktionen des Abhängigen zurückgreift.

Es scheint im Internet mehr Fragen als Antworten zu diesem speziellen Fehler zu geben, also könnten wir vielleicht an einer erschöpfenden Liste zusammenarbeiten, damit dieser Fehler nicht so verwirrend ist, wenn wir darauf stoßen!

~$ geth version
Geth
Version: 1.8.2-stable
Architecture: amd64
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.10
Operating System: darwin
GOPATH=
GOROOT=/usr/local/opt/go/libexec

Daten der Projektversion:

Node:             v9.10.0
web3:             web3@1.0.0-beta.33
file-system (fs): mac:fs@0.0.1-security  linux: file-system@2.2.2
solc:             solc@0.4.21
ethereumjs-tx:    ethereumjs-tx@1.3.4 

Hier ist meine Vertragsunterzeichnungsfunktion:

function compile_and_sign_transaction_offline (p_key, address, gasPriceHex, parent_file_and_object){

    var privateKey = new Buffer(p_key, 'hex')

    const compiled_contract = solc.compile({sources: sol_input_array}, 1); 
    const bytecode = compiled_contract.contracts[parent_file_and_object].bytecode;
    const contractData = '0x' + bytecode;

    //I have currently have been testing gas prices of 1.2-3 Gwei
    const gasLimitHex = '0x124F80';     //1,200,000 gas

    const rawTx = { 
        nonce: 0x00,  
        gasPrice: gasPriceHex,
        gasLimit: gasLimitHex,
        data: contractData,
        from: address 
    };  

    const tx = new Tx(rawTx);
    tx.sign(privateKey);

    const serializedTx = tx.serialize();
    const signed_transaction = serializedTx.toString('hex');
    fs.writeFileSync("signed_tx", signed_transaction);
}
Wie senden Sie die signierte Transaktion? Wenn Sie das beginnende „0x“ verpassen, wird der Rest als Zeichenfolge und nicht als Hexadezimal interpretiert. Überprüfen Sie auch, ob die signierte Transaktion korrekt vom Offline-Computer kopiert wurde.
Es scheint, dass die Kosten für die Bereitstellung eines Vertrags 200 Gas pro Byte plus einige Konstanten betragen. Für 4kB sollte also 1m Gas ausreichen. ethereum.stackexchange.com/questions/32831/…
Fürs Protokoll, hier sind die Statistiken für die Mainnet-Bereitstellung: Gaslimit: 5200000 Gasverbrauch durch Txn: 1119499 Gaspreis: 0,0000000045 Ether (4,5 Gwei) Tatsächliche Tx-Kosten/Gebühr: 0,0050377455 Ether (3,31 $)

Antworten (1)

Es stellt sich also heraus, dass diese Funktion gut funktioniert. Das Problem lag irgendwo in der Pipeline zur Blockchain. Ich bin mir nicht sicher, ob meine Senderfunktion, Instanz von geth oder meine heruntergeladene Blockchain selbst das Problem war.

Das Verrückteste war jedoch, dass ich mit demselben Code (sowohl der Offline-Signatur als auch dem Online-Bereitstellungsfluss) problemlos auf dem Rinkeby-Testnetz bereitstellen konnte, während die Bereitstellung auf dem Mainnet diesen Fehler „Überschreitung des Blockgaslimits“ zurückgab.

Also Kinder, stellt sicher, dass ihr zusätzlich zum Testnet vor der Veröffentlichung Tests im Mainnet durchführt!