Angenommen, ich habe eine nicht konstante Funktion, die eine Zustandsvariable unter bestimmten Bedingungen ändert.
Mit anderen Worten, die Funktion kann diese Variable manchmal ändern und manchmal so lassen, wie sie ist.
Zahle ich dem Bergmann eine Gasgebühr, wenn die Funktion die Variable nicht ändert?
Ich habe einen kleinen Truffle-Test geschrieben, der die Gaskosten anzeigt, wenn die Funktion die Variable nicht ändert:
Datei MeinVertrag.sol:
pragma solidity 0.4.24;
contract MyContract {
uint private x;
constructor(uint _x) public {
x = _x;
}
function set() external {
if (x >= 42)
x += 42;
}
function get() external view returns (uint) {
return x;
}
}
Datei MyContract.js:
contract("MyContractTest", function(accounts) {
it("set", async function() {
let myContract = await artifacts.require("MyContract.sol").new(41);
let estimateGas = await myContract.set.estimateGas();
console.log(estimateGas);
});
it("get", async function() {
let myContract = await artifacts.require("MyContract.sol").new(41);
let estimateGas = await myContract.get.estimateGas();
console.log(estimateGas);
});
});
Der Ausdruck :
Contract: MyContractTest set: 21647
Contract: MyContractTest get: 21656
Ich habe dann festgestellt, dass estimateGas
das unter der Annahme läuft, dass die getestete Funktion von der On-Chain (dh von einem anderen Vertrag) und nicht von der Off-Chain aufgerufen wird, da die Gaskosten der konstanten Funktion get
auch größer als 0 waren.
Also wie im Titel meiner Frage:
Zahle ich dem Miner eine Gebühr, wenn ich die Funktion aufrufe set
und sich die Variable nicht ändert x
?
Danke dir!
KLÄRUNG:
Meine Frage bezieht sich auf die Gaskosten einer nicht konstanten Funktion (kann sie in einigen Fällen Null sein). Die als Duplikat vorgeschlagene Frage betrifft die Gaskosten einer konstanten Funktion (kann sie in einigen Fällen größer als Null sein). Das sind also im Wesentlichen zwei verschiedene Fragen.
Ja.
Die Nicht-Konstante (not pure
, view
or constant
) würde von einer Transaktion aufgerufen werden, um potenziell zustandsändernd zu sein. Eine Transaktion wird von allen Full Nodes abgebaut und bestätigt, um herauszufinden, was sie tut. Auch wenn es aufgrund der bedingten Verzweigung nichts tut, zahlt der Sender für das verbrauchte Gas, um einen Netzwerkkonsens zu bilden.
Ausführlicher: https://blog.b9lab.com/calls-vs-transactions-in-ethereum-smart-contracts-62d6b17d0bc2
Ich hoffe es hilft.
Ismael