Solidity

在solidity 0.5.x之後將地址轉換為字元串

  • February 9, 2022

在solidity 0.5.x 發布後,從地址到字元串的轉換似乎都沒有工作。我已經在 remix 上測試了所有這些,並得到了錯誤,比如將字節轉換為 uint 或類似的東西。

這個還原混音:

function toString(address x) 
   external pure 
   returns (string memory) 
{
   bytes memory b = new bytes(20);
   for (uint i = 0; i < 20; i++)
       b[i] = byte(uint8(uint(x) / (2**(8*(19 - i)))));
   return string(b);
}

這個向我展示了從 bytes1 到 uint256 的某些內容是不允許的

function addressToString(address _addr) public pure returns(string memory) 
{
   bytes32 value = bytes32(uint256(_addr));
   bytes memory alphabet = "0123456789abcdef";

   bytes memory str = new bytes(51);
   str[0] = '0';
   str[1] = 'x';
   for (uint i = 0; i < 20; i++) {
       str[2+i*2] = alphabet[uint(value[i + 12] >> 4)];
       str[3+i*2] = alphabet[uint(value[i + 12] & 0x0f)];
   }
   return string(str);
}

有什麼正確的方法可以將地址轉換為字元串嗎?即使通過字節或字節32。

我需要這個的原因是我有一個帶有字元串 => PrivilegeData 映射的權限契約,並且我從該字元串呼叫全域權限,如“voting_time_limit”。對於特定地址,我想使用解析為“0x252f …”之類的字元串的地址呼叫。

試試這個。

pragma solidity > 0.5.1;

contract Test 
{
   
   function test() 
       public 
       view    
       returns (string memory) 
   {
       return addressToString(address(this));
   }

   function addressToString(address _addr) public pure returns(string memory) 
   {
       bytes32 value = bytes32(uint256(uint160(_addr)));
       bytes memory alphabet = "0123456789abcdef";
   
       bytes memory str = new bytes(51);
       str[0] = '0';
       str[1] = 'x';
       for (uint256 i = 0; i < 20; i++) {
           str[2+i*2] = alphabet[uint8(value[i + 12] >> 4)];
           str[3+i*2] = alphabet[uint8(value[i + 12] & 0x0f)];
       }
       return string(str);
   }
}

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