Wie finde ich in web3.js die gesamten Gaskosten für die Bereitstellung eines neuen Vertrags (einschließlich Konstrukteur) genau?

Ich verwende einen öffentlichen Knoten als meinen Web3-Anbieter, daher muss ich alle Transaktionen manuell signieren. Dazu gehören Transaktionen, die Verträge erstellen.

Derzeit verwende ich die folgende Methode, um Verträge bereitzustellen.

/* I create the contract first. */
var contractAbi = ... (I load this from a file.)
var contractBytecode = ... (I load this from another file.)
var contract = new web3.eth.Contract(contractAbi);

/* Then I get the data encoded with constructor parameters. */
var contractDeployInfo = contract.deploy({
  data: contractBytecode,
  arguments: [constructorParam1, constructorParam2]
});

/* Data field of the transaction. */
var transactionData = contractDeployInfo.encodeABI();

/* Then I estimate the gas, using the provided method. */
contractDeployInfo.estimateGas().then(gas => {
    // Use this gas estimate to create raw transaction, 
    // sign it, send it, and so on.
})

Die Transaktion wird durchgeführt, und der Vertrag wird bereitgestellt.

Die von zurückgegebene Gasschätzung gibt jedoch contract.deploy().estimateGas() nur Gas zurück, das ausreicht, um den Vertrag an die Bergleute weiterzuleiten, aber nicht ausreicht, um den Erbauer des Vertrags tatsächlich auszuführen.

Als Ergebnis habe ich einen leeren Vertrag ohne Daten in der Vertragsadresse, die im Transaktionsbeleg angegeben ist.

Soll ich die Gasschätzung des Vertragserstellers berechnen und diese zum Gaslimit in meinen Transaktionen hinzufügen?

Diese „Duplikat“ -Frage ( So schätzen Sie Gas bei Vertragserstellung/Bereitstellung in einer privaten Ethereum-Blockchain ) verwendet eine ältere Version der Web3-Bibliothek. Ich bezog mich auch auf die neu eingeführte Bereitstellungsfunktion.

Können Sie mehr Details zu "var contractBytecode = ... (I load this from another file.)" geben. Können Sie auch auf Etherscan anzeigen, dass die Transaktion "fehlgeschlagen" ist?
Nur um einiges klarzustellen. Sie können nicht wirklich einen leeren Vertrag haben, der den Konstruktor nicht ausführt, diese gesamte Transaktion zum Bereitstellen und Ausführen des Konstruktors ist fehlgeschlagen. Alle Transaktionen, die erfolgreich an das Netzwerk gesendet werden können, geben eine Quittung zurück. Dies bedeutet nicht, dass sie erfolgreich ausgeführt werden. Diese gescheiterten Transaktionen werden ebenfalls abgebaut, sodass das Gas, mit dem dies bewiesen wurde, verloren geht. Es scheint, als ob der Vertrag einen Fehler enthält, der zu einer schlechten Schätzung und einer letztendlich fehlgeschlagenen Bereitstellung führt.

Antworten (1)

Sie können den Vertrag in Ihrem developmentTestrPC bereitstellen und das Gas für diese Transaktion überprüfen.

const tx = await MyContract.new();
const gasUsed = tx.receipt.gasUsed;

Hoffe das hilft.