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_object
Zeichenfolge 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);
}
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!
Ismael
Thorkil Værge
kawthuldrok