Solidity函数报错:address payable无法隐式转为bytes memory
解决Solidity中keccak256与地址转换的类型错误
问题原因
你遇到的错误是因为Solidity 0.5.0及以上版本中,keccak256()函数要求传入bytes类型的参数,但直接传入msg.sender(address类型)会触发隐式转换失败——编译器不再允许将address直接转为bytes,必须显式编码。
修正代码
将出错的代码片段替换为以下内容(推荐使用abi.encodePacked,对应旧版本的行为):
uint tmpData = uint(keccak256(abi.encodePacked(msg.sender))); address batchNo = address(tmpData);
完整修正后的函数
function setBasicDetails(string memory _registrationNo, string memory _farmerName, string memory _farmAddress, string memory _exporterName, string memory _importerName) public onlyAuthCaller returns(address) { uint tmpData = uint(keccak256(abi.encodePacked(msg.sender))); address batchNo = address(tmpData); basicDetailsData.registrationNo = _registrationNo; basicDetailsData.farmerName = _farmerName; basicDetailsData.farmAddress = _farmAddress; basicDetailsData.exporterName = _exporterName; basicDetailsData.importerName = _importerName; batchBasicDetails[batchNo] = basicDetailsData; nextAction[batchNo] = 'FARM_INSPECTION'; return batchNo; }
补充说明
abi.encodePacked(msg.sender):将address类型的msg.sender打包成紧凑的字节流,满足keccak256的参数要求,这也是Solidity 0.5.0之前隐式转换的等效行为。- 如果需要严格遵循ABI编码规则(比如多参数场景),可以改用
abi.encode(msg.sender),但单地址场景下两者结果一致,encodePacked更节省gas。
内容的提问来源于stack exchange,提问作者Sandesh Walunj
相关产品推荐
相关产品推荐

