Go-Ethereum

如何在 Go 中生成數字類型 uint256

  • October 16, 2018

我的智能合約有這樣的功能

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

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