1. 使用pure或者view函数,直接拿到返回值,但不是所有的函数都能声明成pure/view。
2. 使用event包装返回值,但是在emit之前返回的函数是没有event的,如果需要每条path都返回有意义的return value,可能需要定义很多个event。(不考虑require throw的情况下)
3. 使用web3.eth.Contract.call,需要ABI和deployed address,这个用法有个缺点是将函数变成了constant的,即和1一样无法改变合约内部状态,只能说在特定的场景下有用。
4. EIP-758(https://eips.ethereum.org/EIPS/eip-758),返回returnData在subscribe的通道上,但是看目前的状态还是draft。