我试图使用类似的代理模式对从delegatecall操作码返回的数据执行操作:
assembly {
let ptr := mload(0x40) // load empty memory address pointer
calldatacopy(ptr, 0, calldatasize()) // copy calldata to memory
mstore(0x40, add(ptr, calldatasize())) // reset free memory pointer
let outptr := add(ptr, calldatasize()) // new free memory pointer for output location
success := delegatecall(gas(), implementation, ptr, calldatasize(), outptr, 0) // delegate call passing all calldata returning 0 on failure, 1 on success
returndatacopy(outptr, 0, returndatasize())结果返回的数据如下所示(包括我返回的还原原因):
0x08c379a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000f6e6f7420696d706c656d656e74656400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000....因此,为了帮助分解,这是我所理解的布局。
0x08c379a00x0000000000000000000000000000000000000000000000000000000000000020,它本身包含一个值=32。0x000000000000000000000000000000000000000000000000000000000000000f = 15字节。0x6e6f7420696d706c656d656e7465640000000000000000000000000000000000 -“next”,这是我的错误字符串15字节长,其余的插槽0。我的问题是:
0x08c379a0是什么意思?有一个不同的前导4字节,这似乎取决于返回的数据是什么。0x20是什么?发布于 2021-11-18 16:35:18
这个答案提供了我在这里偶然发现的确切问题的完整视图。
0x08c379a0是Error(string)的函数签名,这是require或revert故障所使用的。0x20是一个偏移量,通常包含在函数调用blobs中,它将动态变量(例如字符串或字节数组)偏移到编码它们的内存区域。在这里,它只是一个内存槽(32字节)从这个头块的开始偏移(只是跳过偏移量本身)。32*3=96加上函数签名96+4=100的其余4个字节,并且达到了难以捉摸的100字节返回数据。https://ethereum.stackexchange.com/questions/113842
复制相似问题