Solidity
如何將 uint256 編碼為字節以提供給帶有 web3.js 和solidity 的函式“sliceuint”?
我有一個圖書館的功能:
function sliceUint(bytes bs, uint start) internal pure returns (uint) { require(bs.length >= start + 32, "slicing out of range"); uint x; assembly { x := mload(add(bs, add(0x20, start))) } return x; }
其目的是採用字節編碼參數並將其轉換為 uint。我需要這個的原因是因為我需要與一個合約函式進行互動,該函式具有一個
bytes calldata _extra
將回調我的合約的參數。我需要在初始呼叫中傳入一個 uint256,然後在回調中使用 sliceuint 進行解碼,以便我可以恢復它。如果我對程序集的理解正確,它會從字節 bs 變數載入到 x 中,但從 0x20+start 的偏移量開始。
我的問題是:
- 如何從 uint256 轉換為 Solidity 中的字節以提供給函式?
- 如何從 uint256 轉換為 Web3.js 中的相同字節?
在 web3.js 我試過:
web3.eth.abi.encodeParameter('bytes', 1337) '0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020539000000000000000000000000000000000000000000000000000000000000'
並將其傳遞給我函式的 bytes 參數。它通常會返回一個錯誤,即我可能試圖越界訪問數組或沒有提供足夠的氣體(我提供了足夠的氣體。)
如果我嘗試遵循 sliceUint 函式的功能,它似乎是從錯誤的地方拉出來的(0x80 看起來是正確的地方)所以我做錯了什麼我編碼錯誤,呼叫 sliceUint 錯誤?
如果您想
1234
從 web3 編碼為字節數組,您可以組合toHex
和padLeft
fromweb3.utils
.> web3.utils.padLeft(web3.utils.toHex(1234), 64) 0x00000000000000000000000000000000000000000000000000000000000004d2
sliceUint
使用 start = 0從 solidity 呼叫中解碼bytes memory a = hex"00000000000000000000000000000000000000000000000000000000000004d2"; uint256 x = sliceUint(a, 0);