松露与 Golang Web3
Posted
技术标签:
【中文标题】松露与 Golang Web3【英文标题】:Truffle with 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)
为什么这会导致 &87 2.0 0x0 <nil>
?如何获取智能合约返回的真实价值?我已经尝试了所有的 result.ToInt() 等......
【问题讨论】:
【参考方案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】:你没有在你的 go 文件中设置合约地址:https://github.com/regcostajr/go-web3/blob/master/test/eth/eth-contract_test.go#L75
【讨论】:
以上是关于松露与 Golang Web3的主要内容,如果未能解决你的问题,请参考以下文章