Solidity中是否必须编写return语句?合约代码相关疑问
Solidity合约中return语句的作用与你的疑问解答
你的合约代码
pragma solidity ^0.8.0; contract Counter { uint public number; string public name; constructor(string memory input_name, uint input_number){ name = input_name; number = input_number; } function add () public { number ++; } function subtract() public { number --; } function update_name(string memory update) public { name = update; } }
你的问题
我编写了上述基础Solidity合约,疑惑为何要为每个函数编写return语句——毕竟合约中的public变量已自动生成getter返回值。恳请专业人士解释我的认知误区,或是说明此处return语句的作用。
解答
你的认知完全没问题——你合约里的add、subtract、update_name这类状态修改函数,根本不需要写return语句,原因很直接:
这类函数的核心职责是修改合约的存储状态,执行结果会直接体现在链上的变量值里。调用者要获取最新状态,直接用public变量自动生成的getter函数就行,完全不需要函数本身返回什么。
自动生成的getter函数是专门用来读取状态的,和修改函数的职责完全分开:
- getter是
view类型(默认),只读取不修改,几乎不消耗gas; - 你的修改函数属于
non-payable(默认)的状态变更函数,执行会消耗gas。就算给这类函数加了return语句,返回值也只有**本地调用(比如Remix里的直接调用)**能拿到,链上不会记录这个返回值,其他合约或者外部调用者根本没法通过链上数据获取这个返回值(如果需要通知外部状态变化,正确的做法是用事件event)。
- getter是
那什么时候需要写return语句?
- 当你写自定义的读取类函数(
view/pure类型)时,需要返回计算结果,比如:
这类函数不修改状态,只是基于现有数据做计算,必须通过return把结果返回给调用者。function getDoubleNumber() public view returns(uint) { return number * 2; } - 如果你只是在本地调试状态修改函数,想即时拿到一些临时计算值,也可以加return,但注意这个值不会上链,没有链上意义。
总结:你当前的合约完全不需要给那三个修改函数加return语句,它们的作用就是改状态,状态查询已经由getter函数覆盖了,多此一举。
内容的提问来源于stack exchange,提问作者Arcane Hunter
相关产品推荐
相关产品推荐

