Solidity
如何在solidity中編碼bool變數
我正在嘗試將 bool 變數編碼為回調數據(字節)。我通過使用
abi.encodePacked
減少空間和成本以及自定義解碼功能來做到這一點。問題是解碼後,無論打包的編碼值是什麼,返回的變數始終為真。
這是程式碼:
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; /** * @title Ballot * @dev Implements voting process along with vote delegation */ contract TEST { function encodeBytes() public pure returns (bytes memory){ bool x = false; return abi.encodePacked(x); } function decode(bytes memory data) public pure returns ( bool b) { assembly { b := mload( add( data, 8 ) ) } } function decodeAndReturn() public returns (bool){ bytes memory packed = encodeBytes(); return decode(packed); } }
decodeAndReturn
即使編碼變數顯式設置為 false,呼叫也會返回 true。我的解碼功能有問題嗎?
問題出在
decode
函式中,您沒有data
正確載入。首先,您需要確定data
. 這可以使用mload(data)
載入長度來完成data
,長度位於前 32 個字節。在定義 長度的前 32 個字節之後
data
,您可以載入data
usingmload(add(data, 0x20))
。只是為了澄清,0x20
相當於32個字節。因此,您的程式碼應如下所示:
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; /** * @title Ballot * @dev Implements voting process along with vote delegation */ contract TEST { function encodeBytes() public pure returns (bytes memory){ bool x = false; return abi.encodePacked(x); } function decode(bytes memory data) public pure returns (bool b){ assembly { // Load the length of data (first 32 bytes) let len := mload(data) // Load the data after 32 bytes, so add 0x20 b := mload(add(data, 0x20)) } } function decodeAndReturn() public pure returns (bool){ bytes memory packed = encodeBytes(); return decode(packed); } }