Solidity

字元串儲存在solidity儲存中的什麼位置?

  • February 23, 2019

我正在嘗試檢查在 Solidity 中儲存字元串的位置。

為了對此進行測試,我正在使用以下程式碼:

pragma solidity 0.5.4;

contract AssemblyString {
   string s; // slot 0

   function set(string calldata _s) external {
       s = _s;
   }

   function get(uint i) public view returns (bytes32){
       bytes32 r;
       assembly {
           r := sload(i) //we load the slot number i
       }
       return r;
   }
}

如果我將字元串設置為小於 31 個字節,則可以按照solidity 指定的方式正常工作:

  1. 部署合約
  2. 設置(“乙太”)
  3. 得到(0)

輸出:0x657468657200000000000000000000000000000000000000000000000000000a

第一部分代表編碼字元串:0x6574686572 等於“ether”。

第二部分是size*2: 0xA 等於十進制的 10。(ether 有 5 個字母,然後 5 乘以 2 等於 10)

中間的所有零都被填充到 32 個字節長。


**但!**如果我將字元串設置為超過 31 個字節,我將找不到該字元串。

正如規範所說,字元串的數據包含在 keccak256(slot) 中。

當我搜尋 keccak256(0) = 044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d

為十進制:1937035142596246788172577232054709726386880441279550832067530347910661804397

輸出:0x0

但是,如果我調試契約混音IDE,我發現數據總是儲存在關鍵0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,

12月:18569430475105882587588266137607568536673111973893317399460219858819262702947和字元串儲存在該位置。

我做錯了什麼?

感謝您的時間。

我找到了解決方案!

在javascript中執行它:

const utils = require('web3-utils'); // npm install web3
console.log(utils.soliditySha3(0x0))
>> 290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563

同樣使用此程式碼的可靠性:

function test() public pure returns(bytes32){
   bytes memory a = new bytes(32);
   return keccak256(a);
}

有用!

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