字元串儲存在solidity儲存中的什麼位置?
我正在嘗試檢查在 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 指定的方式正常工作:
- 部署合約
- 設置(“乙太”)
- 得到(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); }
有用!