如何在Solidity 0.7中将地址字符串转换为address类型
长度不符的原因
你直接将地址字符串转bytes得到的是字符串每个ASCII字符对应的字节序列:标准以太坊地址字符串是0x开头的42个十六进制字符,每个字符占1字节,所以总长度是42。你在Python里做的是十六进制字符串解码,把每两个十六进制字符映射为1个原始字节,40个十六进制字符(去掉0x前缀)刚好得到20字节的地址原始值,和Solidity里的直接转bytes不是同一个操作。
Solidity 0.7 兼容的地址字符串转address实现
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; library AddressStringUtils { function stringToAddress(string memory _addressStr) internal pure returns (address) { bytes memory strBytes = bytes(_addressStr); // 校验输入长度必须是42(带0x前缀的标准地址) require(strBytes.length == 42, "Invalid address string length"); // 校验前缀为0x require(strBytes[0] == '0' && (strBytes[1] == 'x' || strBytes[1] == 'X'), "Missing 0x prefix"); uint160 result = 0; // 从第3个字符(索引2)开始遍历每一个十六进制字符 for (uint256 i = 2; i < 42; i++) { uint8 charVal = uint8(strBytes[i]); // 转成对应的十六进制数值 if (charVal >= uint8('0') && charVal <= uint8('9')) { charVal -= uint8('0'); } else if (charVal >= uint8('a') && charVal <= uint8('f')) { charVal = charVal - uint8('a') + 10; } else if (charVal >= uint8('A') && charVal <= uint8('F')) { charVal = charVal - uint8('A') + 10; } else { revert("Invalid hex character"); } // 每一个字符对应4位,左移4位累加 result = result * 16 + charVal; } return address(result); } }
使用说明
- 直接引用这个库调用
stringToAddress方法即可,输入为带0x前缀的标准42位地址字符串,返回对应的address类型值。 - 内置了长度、前缀、非法字符的校验逻辑,避免错误输入导致转换结果异常。
- 兼容大小写混合的地址字符串,同时支持EIP-55校验和格式的地址输入,如果你需要额外校验地址的校验和合法性,可以在转换完成后自行添加校验和比对逻辑。
内容的提问来源于stack exchange,提问作者GraphicalDot
相关产品推荐
相关产品推荐

