Трюфель с Голангом Веб3 - PullRequest
0 голосов
/ 05 июня 2018

Я использую этот Ethereum Go Client и пытаюсь вызвать и получить ответ функции Smart Contract.

Функция в смарт-контракте очень проста (для тестирования сейчас):

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

Я использую трюфель для развертывания контракта:

truffle compile
truffle migrate

Мой сервер Go также очень прост, вот важная часть основного функционала:

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 () и т. Д. Уже ...

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Вы не устанавливаете адрес контракта в вашем файле go: https://github.com/regcostajr/go-web3/blob/master/test/eth/eth-contract_test.go#L75

0 голосов
/ 05 июня 2018

Клиентская библиотека возвращает 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)
}
...