Solidity

Uint 到 Bytes32 的轉換——這有什麼意義

  • September 18, 2017

這裡非常簡單的程式碼:

pragma solidity ^0.4.13;

contract Oracle{
   event Print(string _name, bytes32 _value);
   bytes32 key;

   function Store(bytes32 _key) returns (bytes32) {
       key = _key;
       Print("Key",_key);
       return _key;
   }

}

現在我試圖將值 1 儲存為鍵。

使用混音,

entered key: 1
printed key: 0x0100000000000000000000000000000000000000000000000000000000000000

entered key: "0x01"
printed key: 0x0100000000000000000000000000000000000000000000000000000000000000

現在一個奇怪的:

entered key: "0x1"
printed key: 0x0100000000000000000000000000000000000000000000000000000000000000

而且很奇怪:

entered key: "1"
printed key: 0x3100000000000000000000000000000000000000000000000000000000000000

而且超級奇怪……當使用 NodeJS 推送原始交易時:

Entered:1
Printed key: 0x1000000000000000000000000000000000000000000000000000000000000000

那麼問題來了,為什麼 “0x1” 和 “0x01” 和 1 在 remix 而不是節點上都給了我相同的答案?為什麼引號中的 1 會有所不同?

根據您的範例:

輸入密鑰:1 列印密鑰:0x0100000000000000000000000000000000000000000000000000000000000000

字節儲存為 256 位值的數組(在您的大小為 32 字節的情況下),因此您將 uint 1 的值儲存在數組的第一個字節中,即 0x01 並且數組的其餘部分為空。

輸入密鑰:“0x01” 列印密鑰:0x01000000000000000000000000000000000000000000000000000000000000000

在solidity中,“0x01”將被轉換為等效的字元串,因為它是256位uint的有效十六進制值

輸入密鑰:“0x1” 列印密鑰:0x0100000000000000000000000000000000000000000000000000000000000000

同上 0x01 和 0x1 一樣,就像 0x001 和 0x000001 一樣,都是 1 的整數值

輸入鍵:“1” 列印鍵:0x3100000000000000000000000000000000000000000000000000000000000000

這是字元串“1”的 ascii 十六進制值,即 0x31

輸入:1 列印密鑰:0x1000000000000000000000000000000000000000000000000000000000000000

我從未嘗試過使用 NodeJS,所以我無法回答這個問題。希望我回答了你的其他問題。

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