Привязка Golang - вызвать метод контракта и получить его возвращаемое значение или кортеж?

Предположим, у меня есть контракт типа:

pragma solidity ^0.4.11;

contract MyToken {
  uint256 a;

  function SimpleGetter() returns(string) {
    return "something";
  }

  function DoTheGreat(address _to) returns(uint256) payable {
       /// ...
       return /* <...> */;
  }
}

Я следил за статьей, немного устаревшей, но все же очень полезной , и создал привязку Go для своего контракта, а затем просто получил что-то вроде:

// Generate "CEO" keypair(wallet)
key, _ := crypto.GenerateKey()
CEOAuth := bind.NewKeyedTransactor(key)

// Create genesis
alloc := make(core.GenesisAlloc)
alloc[CEOAuth.From] = core.GenesisAccount{Balance: big.NewInt(20000000000000)}

sim := backends.NewSimulatedBackend(core.GenesisAccount{Address: auth.From, Balance: big.NewInt(10000000000)})

// Deploy a token contract on the simulated blockchain
_, _, token, err := DeployMyToken(CEOAuth, sim, ..)
if err != nil {
    log.Fatalf("Failed to deploy new token contract: %v", err)
}

sim.Commit()

val, _ := token.SimpleGetter(nil)
fmt.Println("Something from contrract:", val)

Я на самом деле использую MyTokenSession:

 the Token contract instance into a session
session := &MyTokenSession{
    Contract: token,
    CallOpts: bind.CallOpts{
        Pending: true,
    },
    TransactOpts: bind.TransactOpts{
        From:     CEOAuth.From,
        Signer:   CEOAuth.Signer,
        GasLimit: big.NewInt(3141592),
    },
}

Проблема в том, что мы смотрим на Go bidining from abigenдля нашей функции DoTheGreat(), это выглядит так:

func (_MyToken *MyTokenSession) DoTheGreat(_to common.Address) (*types.Transaction, error) {
    // ....
}

Как видите, он возвращается *types.Transaction, и я не вижу способа понять, должен ли я его подписывать, отправлять и как получить возвращаемые значения из моей функции контракта.

Значение для tx.Value()равно *big.Int, но оно не связано с данными, возвращаемыми контрактом, оно всегда равно нулю. Может ли кто-нибудь добавить код для моего случая?

Есть аналогичный вопрос относительно web3js ethereum.stackexchange.com/questions/15704/…

Ответы (1)

type.Transactionявляется типом транзакции. Когда вы вызываете контракт с помощью кода, сгенерированного с помощью abigen, подписание и трансляция выполняются за вас с использованием ключевых данных, указанных в вашем сеансе. Возвращенная транзакция будет содержать информацию о транслируемой транзакции.

Прежде чем вы сможете наблюдать какие-либо последствия транзакции, вам нужно дождаться ее майнинга и проверить квитанцию ​​​​tx. Насколько мне известно, возвращаемые значения в настоящее время не возвращаются в квитанции tx, и EIP, позволяющие это, все еще находятся на рассмотрении. Если вы хотите извлечь данные из транзакции записи, используйте события. Если ваша функция не изменяет состояние контракта, пометьте ее как представление или чистую функцию. abigenбудут создавать методы только для чтения для представления и чистые функции, которые возвращают соответствующие данные вместо types.Transaction.

Поле значения, которое вы видите, представляет собой значение, переданное из Fromучетной записи в этой транзакции, которое равно 0 для большинства вызовов контракта.

Спасибо за окончательное разъяснение. Таким образом, лучший выбор — использовать событие, GreatEventсозданное этой функцией, и подписаться на событие, используя GreatEventWatch()функцию из привязки.