Solidity中含返回值的函数能否用constant修饰并修改状态?
嘿,我来帮你把这个Solidity的问题理清楚~
核心问题解答
1. 能否同时使用constant关键字、returns关键字并修改变量的状态?
绝对不行!在Solidity中,constant(从v0.5.0版本开始等价于view)这个状态修饰符的核心意义,就是向编译器和EVM做出承诺:该函数不会修改合约的任何状态变量。如果你的函数里包含了修改状态的逻辑(比如增减余额、修改状态变量值),还加上了constant/view,编译器必然会抛出警告甚至错误——这是在提醒你违反了自己的承诺。
2. 想要函数既有return语句,又能执行修改状态的加减操作,可行吗?
当然可行!你只需要去掉constant修饰符就可以了。Solidity中,没有view/pure/constant修饰符的普通函数,默认就具备两个能力:
- 可以修改合约的状态变量
- 支持通过
returns返回指定类型的值
针对你的ERC20代码片段的修正
你提供的原函数代码存在constant和状态修改逻辑冲突的问题,我帮你调整一下:
原代码(存在警告的版本)
_transferToken(address _from, address _to, uint _value) constant public returns (string) { // Prevent transfer to 0x0 address. Use burn() instead if(_to == 0x0) { return "Invalid address"; } // Check if the sender has enough balance if(balances[_from] < _value) { return "Insufficient balance"; } // 以下是修改状态的操作,和constant修饰符冲突 balances[_from] -= _value; balances[_to] += _value; emit Transfer(_from, _to, _value); return "Transfer successful"; }
修改后的合法代码
_transferToken(address _from, address _to, uint _value) public returns (string) { // Prevent transfer to 0x0 address. Use burn() instead if(_to == 0x0) { return "Invalid address"; } // Check if the sender has enough balance if(balances[_from] < _value) { return "Insufficient balance"; } // 现在这些状态修改操作完全合法 balances[_from] -= _value; balances[_to] += _value; emit Transfer(_from, _to, _value); return "Transfer successful"; }
这样调整后,函数既能正常执行余额增减的状态修改逻辑,又能根据不同场景返回对应的字符串提示,完全满足你的需求。
内容的提问来源于stack exchange,提问作者Sush
相关产品推荐
相关产品推荐

