如果不是只读取数据的合约函数,需要异步的执行,因此并不能直接获取到合约函数的返回值,需要等到交易执行完毕,得到确认后才能获取到合约函数的返回值。而且合约函数返回值一般是通过事件日志获取到的。
这里给出一个例子来展示我是如何获取合约函数返回值的。
我使用的以太坊版本为:github.com/ethereum/go-ethereum v1.13.0
solidity合约:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract StoreString {
event ItemSetStr(bytes32 indexed hash,string key,string value);
mapping (string => string) public itemstr;
function setItemstr(string memory _key, string memory _value) external returns(bytes32){
itemstr[_key] = _value;
bytes32 hash=sha256(abi.encodePacked(_key,_value));
emit ItemSetStr(hash,_key,_value);
return hash;
}
}
这是一个存储键值对的合约,利用函数setItemstr
向map中存储键值对,并通过key,value计算哈希值,要求返回哈希值。通过事件ItemSetStr
将哈希值(返回值)、key、value记录下来。
将合约的abi编码通过abigen工具生成go代码后。
以下是测试获取合约函数返回值的代码:
func TestSetStoreString(t *testing.T) {
url="" //节点链接
client, err := ethclient.Dial