我刚刚开始坚强。我有这样的功能:
function get() constant returns (uint) {
return storedData;
}
这里常量关键字有什么用?我知道在这个键盘之后我们定义了返回类型,但为什么它需要在它前面保持不变?是否有替代方案,例如var
?
答案 0 :(得分:3)
“常量”关键字表示该函数不会改变合同的状态,这意味着它不会改变任何数据,因此合同状态和数据保持不变。
这样的功能在您的节点中自行执行时不消耗气体(如果在改变合同状态/数据的函数内运行,它可能会增加气体消耗,因为这样的函数调用需要由矿工执行并包含在内在街区。
答案 1 :(得分:1)
为了给出一个更多的上下文,一个常量声明表明该函数不会改变契约的状态(尽管目前编译器没有这样做)。
生成已编译的二进制文件时,声明函数constant
会反映在ABI上。然后,web3解释ABI以确定它是否应该向以太坊节点发送sendTransaction()
或call()
消息。由于呼叫只在本地执行,因此它们实际上是免费的。
请参阅web3.js library中的此片段:
/**
* 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));
};
从另一个合同中调用常量函数会产生与任何其他常规函数相同的成本。