Solidity return 函数为什么是常量?

Solidity return function why the constant?

我刚从稳固开始。我有这样的功能:

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

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

"constant"关键字表示函数不会改变合约的状态,这意味着它不会改变任何数据,因此合约状态和数据保持不变。

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

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

生成编译后的二进制文件时,声明函数 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));
};

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