松露与Golang Web3

ars1skjm  于 2023-04-27  发布在  Go
关注(0)|答案(2)|浏览(129)

我正在使用this Ethereum Go Client并尝试调用并获取智能合约函数的响应。
智能合约中的功能非常简单(现在测试):

function getVotesForImgIds() external view returns(uint32){
    return 12345;
  }

我正在使用truffle部署合约:

truffle compile
truffle migrate

我的Go服务器也很基础,这里是main函数中重要的部分:

abi := getVotesContractJson()["abi"] //works fine

jsonAbi, err := json.Marshal(abi)
if err != nil {
    log.Fatal(err)
}

var connection = web3.NewWeb3(providers.NewHTTPProvider("127.0.0.1:8545", 10, false))
contract, err := connection.Eth.NewContract(string(jsonAbi))
if err != nil {
    log.Fatal(err)
}
//contract works

transaction := new(dto.TransactionParameters)
transaction.Gas = big.NewInt(4000000)

result, err := contract.Call(transaction, "getVotesForImgIds")
if result != nil && err == nil {
    fmt.Println("result: ", result)
    // -------------------->
    //this will print: result:  &{87 2.0 0x0 <nil> }
} else {
    log.Fatal("call error:", err)
}

为什么结果是&{87 2.0 0x0 <nil> }?我怎么才能得到智能合约返回的真实的值?我试了所有的结果。ToInt()等。已经...

nkoocmlb

nkoocmlb1#

您没有在go文件中设置合约地址:https://github.com/regcostajr/go-web3/blob/master/test/eth/eth-contract_test.go#L75

o2g1uqev

o2g1uqev2#

客户端库返回一个DTO结构,这就是为什么您可以在输出中看到一堆字段。
看起来像是ToInt()接收器试图转换为int64,而你的合约返回unint32。尝试显式地将结果转换为unint32

if result != nil && err == nil {
    res := result.ToString()
    votes, err := strconv.ParseUint(res, 10, 32)
    if err != nil {
        // do something with error
    }
    fmt.Printf("result: %d\n", votes)
}

相关问题