Angenommen, ich habe die folgende Funktion:
function SetMessage (bytes32 _message) returns (bool success) {
message = _message;
return true;
}
Was in Web3 beispielsweise so heißen könnte:
MyContract.deployed().then(function (contractInstance) {
return contractInstance.SetMessage(_message, { gas: 200000, from: web3.eth.accounts[0] })
})
Was ist die korrekte Syntax für die Verwendung der estimateGas
Funktion in Web3 für diese Funktion? Ich habe das folgende Beispiel für die Verwendung gesehen estimateGas
(hier wird nur überprüft, wie viel Gas Ether von einem Konto auf ein anderes übertragen werden soll, und keine Funktion in einem Vertrag überprüft):
console.log(web3.eth.estimateGas({from: web3.eth.accounts[0], to: "0xEDA8A2E1dfA5B93692D2a9dDF833B6D7DF6D5f93", amount: web3.toWei(1, "ether")}))
Ich bin mir jedoch nicht sicher, wie ich estimateGas
Gas für die Ausführung einer Funktion in einem Smart Contract schätzen soll.
AKTUALISIEREN :
Es ist einfacher, contract.methods.methodName.estimateGas mit zu verwenden web3 1.0.x
:
myContract.methods.SetMessage(_message)
.estimateGas(
{
from: _from,
gasPrice: _gasPrice
}, function(error, estimatedGas) {
}
)
});
ORIGINALE ANTWORT
Die übliche Regel ist die Generierung von data
Eigenschaften für web3.eth.estimateGas
.
Die Generierung hängt von der Anzahl der Eingabeparameter und deren Typen ab.
Im Falle Ihrer Funktion mit 1 Eingang des bytes32
Typs kann dies folgendermaßen erfolgen:
function setMessageGasEstimation(web3, message, cb) {
var func = "SetMessage(bytes32)";
var methodSignature = web3.eth.abi.encodeFunctionSignature(func);
var messageHex = web3.fromAscii(message, 32);
var encodedParameter = web3.eth.abi.encodeParameter('bytes32', messageHex);
var data = methodSignature //method signature
+ encodedParameter.substring(2); //hex of input string without '0x' prefix
estimateGas(web3, address, contractAddr, data, function(estimatedGas, err) {
console.log("estimatedGas: " + estimatedGas);
//further logic...
});
}
function estimateGas(web3, acc, contractAddr, data, cb) {
web3.eth.estimateGas({
from: acc,
data: data,
to: contractAddr
}, function(err, estimatedGas) {
if (err) console.log(err);
console.log(estimatedGas);
cb(estimatedGas, err);
});
}
Sie können weitere Beispiele sehen, wie Sie Daten für Vertragsfunktionen mit den verschiedenen Parametersätzen generieren.
Unten könnte hilfreich sein: So schätzen Sie das Gas bei der Vertragserstellung/Bereitstellung in der privaten Ethereum-Blockchain