【问题标题】:Truffle with Golang Web3松露与 Golang Web3
【发布时间】:2018-11-15 10:08:39
【问题描述】:

我正在使用this Ethereum Go Client 并尝试调用并获取智能合约函数的响应。

智能合约中的功能很简单(现在测试):

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

我正在使用 truffle 来部署合约:

truffle compile
truffle migrate

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

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)
}

为什么这会导致 &amp;{87 2.0 0x0 &lt;nil&gt; } ?如何获取智能合约返回的真实价值?我已经尝试了所有的 result.ToInt() 等......

【问题讨论】:

    标签: go web3 truffle go-ethereum


    【解决方案1】:

    客户端库返回一个DTO struct,这就是为什么您可以在输出中看到一堆字段的原因。

    看起来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)
    }
    

    【讨论】:

    • 谢谢你的想法。不幸的是,它打印了 0 的选票。我猜这是因为 DTO 结构。 ToString() 将 res 设置为 0x0。由于智能合约函数将返回...
    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2018-03-17
      • 2021-06-29
      • 2022-08-05
      • 2020-02-07
      • 1970-01-01
      • 1970-01-01
      • 2019-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多