Go-Ethereum
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 bibining from
abigen
我們的 functionDoTheGreat()
,它看起來像: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。