Ethereum 坚固性回归函数为什么是常数?

Ethereum 坚固性回归函数为什么是常数?,ethereum,solidity,Ethereum,Solidity,我只是从坚实开始。我有这样一个函数: function get() constant returns (uint) { return storedData; } 常量关键字在这里有什么用途?我知道在这个键盘之后,我们定义了返回类型,但是为什么它前面需要常量呢?是否有其他替代方法,例如var?关键字“constant”表示函数不会更改合同状态,也就是说它不会更改任何数据,因此合同状态和数据保持不变。。。不变的 这样的函数在节点中执行时不会消耗气体(如果在改变合同状态/数据的函数中运行

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

function get() constant returns (uint) {
    return storedData;
  }
常量关键字在这里有什么用途?我知道在这个键盘之后,我们定义了返回类型,但是为什么它前面需要常量呢?是否有其他替代方法,例如
var

关键字“constant”表示函数不会更改合同状态,也就是说它不会更改任何数据,因此合同状态和数据保持不变。。。不变的


这样的函数在节点中执行时不会消耗气体(如果在改变合同状态/数据的函数中运行,可能会增加耗气量,因为这样的函数调用需要由矿工执行并包含在块中。

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

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

请参阅web3.js中的以下代码片段:


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

太好了!谢谢您的回答。函数
set(uint x){storedData=x;}
如果我将关键字constant添加到此中会发生什么?为什么
get
需要constant这个词?如果省略它,即使它不修改数据,它会花费gas吗?如果它产生相同的成本,那么为什么我需要它?为什么在
ERC20 balanceOf()函数中使用它?
函数只返回
返回余额[\u owner];
并且不改变任何状态。它的意义何在?
/**
 * 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));
};