Go-Ethereum

Golang 綁定 - 呼叫合約方法並獲取其返回值或元組?

  • October 23, 2018

假設我有這樣的契約:

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 bibining fromabigen我們的 function DoTheGreat(),它看起來像:

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

如您所見,它返回*types.Transaction了,我看不出有什麼方法可以理解我是否必須對其進行簽名、發送以及如何從我的合約函式中獲取返回值。

的值為tx.Value()*big.Int但與合約返回的數據無關,始終為零。有人可以為我的案例輸入一些程式碼嗎?

type.Transaction是一種交易類型。當您使用通過 abigen 生成的程式碼呼叫合約時,會使用會話中指定的關鍵詳細資訊為您處理簽名和廣播。返回的交易將包含被廣播的交易的資訊。

在您觀察交易的任何影響之前,您需要等待它被探勘,並檢查 tx 收據。據我所知,目前沒有在 tx 收據中返回返回值,而允許這樣做的 EIP 仍在考慮之中。如果您希望從寫入事務中提取數據,請使用事件。如果你的函式不會改變合約的狀態,請將其標記為視圖或純函式。abigen將為視圖和純函式生成只讀方法,這些方法返回適當的數據,而不是types.Transaction.

您看到的 value 欄位是From在該交易中從賬戶轉移的價值,對於大多數合約呼叫,它是 0。

引用自:https://ethereum.stackexchange.com/questions/61015