Solidity

如何將 uint256 編碼為字節以提供給帶有 web3.js 和solidity 的函式“sliceuint”?

  • July 27, 2021

我有一個圖書館的功能:

   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 的偏移量開始。

我的問題是:

  1. 如何從 uint256 轉換為 Solidity 中的字節以提供給函式?
  2. 如何從 uint256 轉換為 Web3.js 中的相同字節?

在 web3.js 我試過:

web3.eth.abi.encodeParameter('bytes', 1337)
'0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020539000000000000000000000000000000000000000000000000000000000000'

並將其傳遞給我函式的 bytes 參數。它通常會返回一個錯誤,即我可能試圖越界訪問數組或沒有提供足夠的氣體(我提供了足夠的氣體。)

如果我嘗試遵循 sliceUint 函式的功能,它似乎是從錯誤的地方拉出來的(0x80 看起來是正確的地方)所以我做錯了什麼我編碼錯誤,呼叫 sliceUint 錯誤?

如果您想1234從 web3 編碼為字節數組,您可以組合toHexpadLeftfrom web3.utils.

> web3.utils.padLeft(web3.utils.toHex(1234), 64)

0x00000000000000000000000000000000000000000000000000000000000004d2

sliceUint使用 start = 0從 solidity 呼叫中解碼

bytes memory a = hex"00000000000000000000000000000000000000000000000000000000000004d2";
uint256 x = sliceUint(a, 0);

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