坚固性返回函数为什么常数?



我只是从坚固开始。我有一个这样的函数:

function get() constant returns (uint) {
return storedData;
}

常量关键字在这里有什么用?我知道在这个键盘之后,我们正在定义返回类型,但为什么它前面需要常量?是否有其他替代方案,例如var

"constant" 关键字意味着函数不会改变合约的状态,这意味着它不会改变任何数据,因此合约状态和数据仍然存在......不断。

这样的函数在您的节点中自行执行时不会消耗 gas(如果在更改合约状态/数据的函数中运行,它可能会增加 gas 消耗,因为这样的函数调用需要由矿工执行并包含在区块中。

为了提供更多上下文,常量声明指示函数不会更改合约的状态(尽管目前编译器尚未强制执行(。

生成已编译的二进制文件时,声明函数constant反映在 ABI 上。然后 web3 解释 ABI,以确定它是否应该向以太坊节点发送sendTransaction()call()消息。由于调用仅在本地执行,因此它们实际上是免费的。

请参阅 web3.js 库中的此代码片段:

/**
* Should be called to execute function
*
* @method execute
*/
SolidityFunction.prototype.execute = function () {
var transaction = !this._constant;
// send transaction
if (transaction) {
return this.sendTransaction.apply(this, Array.prototype.slice.call(arguments));
}
// call
return this.call.apply(this, Array.prototype.slice.call(arguments));
};

从另一个合约调用常量函数会产生与任何其他常规函数相同的成本。