Solidity

如何在solidity中編碼bool變數

  • June 22, 2021

我正在嘗試將 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,您可以載入datausing mload(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);
   }
}

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