Solidity

字元串穩固性的地址

  • August 6, 2021

我正在使用此程式碼將地址轉換為可靠的字元串

function toAsciiString(address x) public 返回(字元串記憶體){

   bytes memory s = new bytes(40);
   for (uint i = 0; i < 20; i++) {
       bytes1 b = bytes1(uint8(uint(uint160(x)) / (2**(8*(19 - i)))));
       bytes1 hi = bytes1(uint8(b) / 16);
       bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));
       s[2*i] = char(hi);
       s[2*i+1] = char(lo);            
   }
   return string(abi.encodePacked("0x",s));
}

函式 char(bytes1 b) 公共返回 (bytes1 c) {

   if (uint8(b) < 10) return bytes1(uint8(b) + 0x30);
   else return bytes1(uint8(b) + 0x57);
}

輸入:0x4a9C121080f6D9250Fc0143f41B595fD172E31bf

輸出:0x4a9c121080f6d9250fc0143f41b595fd172e31bf

如您所見,存在大小寫問題。輸出應與輸入相同,但輸入中的大寫字母以小寫字母形式輸出。我正在混音中執行此程式碼。請讓我知道是否有任何修復。

上面程式碼的問題是您將地址分開並將其轉換為一次 1 個十六進制數字的字元串。在十六進制中,大寫和小符號之間沒有區別(例如,0xA等於0xa又等於 的十進制值10)。所有高於十進制值的十六進製字元10(來自 af 的非十進製字元)都通過將其十六進制值遞增0x57以產生字母 (az) 轉換為 ASCII 字元。0xa並且由於像和之類的輸入值0xA基本上是相同的值,因此兩者都會產生相同的小寫字母a

校驗和詳細資訊在該轉換中失去,結果字元串全部為小寫。如果要保留校驗和資訊,則需要在地址中包含十六進制數字的索引,因為校驗和算法描述如下:

將地址轉換為十六進制,但如果第 i 個數字是字母(即它是 abcdef 之一),如果小寫十六進制地址的第 4*ith 位為 1 (),則以大寫形式列印,否則以小寫形式列印。

基本上,您首先需要將地址轉換為小寫字元串,然後獲取它的 keccak256 雜湊並應用上述算法。有關校驗和算法的更多資訊在這裡

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