Go-Ethereum
如何在 Go 中生成數字類型 uint256
我的智能合約有這樣的功能
function setTest(uint256 test) returns (bool){ testNumber = test; return true; }
我使用這些程式碼去創建一個事務來設置新值
testNumber
- 一個 RPC 呼叫var newtest uint256 = 100 // I expected this type (uint256) abis, err := abi.JSON(strings.NewReader(contractInterface)) output, err := abis.Pack("setTest", newtest) params := make(map[string]string) params["data"] = fmt.Sprintf("0x%s", common.Bytes2Hex(output)) params["from"] = self.ownerAccount params["to"] = self.contractAccount done := "" err = self.client.Call(&done, "eth_sendTransaction", params) .....
問題是我無法將newtest設置為 uint256 類型。我在 Go 中找不到類型 uint256。請幫助我,生成數字類型 uint256 或從 (big.Int, int64, uint64) 轉換為 uint256。謝謝
Golang 專家之一可能想進一步評論,但我不認為 Go 本身支持 256 位整數。
您可以將 Geth 的
number
包與 一起導入math/big
,並使用相關部分。例如呼叫
Uint256()
:// Return a Number with a UNSIGNED limiter up to 256 bits func Uint256(n int64) *Number { return &Number{big.NewInt(n), limitUnsigned256} }
它返回一個指向可以假裝代表一個大數字的結構的指針:
// A Number represents a generic integer with a bounding function limiter. Limit is called after each operations // to give "fake" bounded integers. New types of Number can be created through NewInitialiser returning a lambda // with the new Initialiser. type Number struct { num *big.Int limit func(n *Number) *Number }
您可能想首先考慮為什麼要使用 256 位類型,因為上面的內容似乎有點雜亂無章。
不確定從什麼時候開始,但截至 2018 年 10 月,理查德的回答已經過時了。您可以
uint256
通過導入github.com/ethereum/go-ethereum/accounts/abi
包然後執行以下操作來生成:var number []byte number = abi.U256(big.NewInt(3))
測試它:
fmt.Printf("value: %d\n", number) fmt.Printf("number of bytes: %d", len(number))
輸出是:
價值:
$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 $$ 字節數:32