我不知道为什么 uint256(uint160(msg.sender)) 和 uint256(bytes32(bytes20(msg.sender))) 返回不同的结果。
contract test {
function check1() public view returns(uint ) {
return uint256(uint160(msg.sender)) ;
}
function check2() public view returns(uint ) {
return uint256(bytes32(bytes20(msg.sender))) ;
}
}
函数 check1() 返回值 520786028573371803640530888255888666801131675076 ; 函数 check2() 返回值 41260920106969412157321674113669319076297763250177730552014715551905833025536,该值比之前的值大得多。
理论上,check2() 和 check3() 都应该返回表示 msg.sender 地址的相同数值,因为没有信息丢失。 msg.sender 确实是 20 个字节和 uint160 。 我不知道具体在哪里,两个值变得不同。
简短回答:
bytes32
在 bytes20
对象的右侧填充零。
这可以通过返回字节而不是尝试将它们转换为 uint256 来看到。
pragma solidity ^0.8.20;
contract Test {
function check1() public view returns(bytes20) {
return bytes20(msg.sender) ;
}
function check2() public view returns(bytes32) {
return bytes32(bytes20(msg.sender)) ;
}
}
致电
check1()
给我:0x5b38da6a701c568545dcfcb03fcb875f56beddc4
check2()
给我:0x5b38da6a701c568545dcfcb03fcb875f56beddc4000000000000000000000000
至于为什么,我不确定这是否是因为返回时内存如何读取到堆栈,或者这是否与显式转换和填充规则有关。如果我弄清楚了,我会告诉你的。