首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >返回数据的布局是什么?

返回数据的布局是什么?
EN

Ethereum用户
提问于 2021-11-18 13:42:40
回答 1查看 956关注 0票数 1

我试图使用类似的代理模式对从delegatecall操作码返回的数据执行操作:

代码语言:javascript
运行
复制
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())

结果返回的数据如下所示(包括我返回的还原原因):

代码语言:javascript
运行
复制
0x08c379a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000f6e6f7420696d706c656d656e74656400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000....

因此,为了帮助分解,这是我所理解的布局。

  • 有一个初始的4字节:0x08c379a0
  • 然后,在32字节内存槽中填充:0x0000000000000000000000000000000000000000000000000000000000000020,它本身包含一个值=32。
  • 然后跟随下一个32字节插槽和预期的数据;数组长度:0x000000000000000000000000000000000000000000000000000000000000000f = 15字节。
  • 而数组本身,在本例中是一个字符串,在下一个32字节插槽中:0x6e6f7420696d706c656d656e7465640000000000000000000000000000000000 -“next”,这是我的错误字符串15字节长,其余的插槽0。
  • 接下来是0's的其余100字节长的返回数据.

我的问题是:

  • 领先的4字节0x08c379a0是什么意思?有一个不同的前导4字节,这似乎取决于返回的数据是什么。
  • 在错误消息数组之前出现的前面填充的0x20是什么?
  • 为什么总返回数据长度为100字节,大部分是0's填充,而我的还原消息没有填充它?如果我将恢复返回的原因延长到100字节以外,返回数据也相应地延长。
EN

回答 1

Ethereum用户

发布于 2021-11-18 16:35:18

这个答案提供了我在这里偶然发现的确切问题的完整视图。

  • 0x08c379a0Error(string)的函数签名,这是requirerevert故障所使用的。
  • 字符串数据前面的0x20是一个偏移量,通常包含在函数调用blobs中,它将动态变量(例如字符串或字节数组)偏移到编码它们的内存区域。在这里,它只是一个内存槽(32字节)从这个头块的开始偏移(只是跳过偏移量本身)。
  • 由于数据本身需要3个内存槽(偏移量、数组长度和数组),其中数组数据本身适合于一个时隙,因此我们有32*3=96加上函数签名96+4=100的其余4个字节,并且达到了难以捉摸的100字节返回数据。
票数 2
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/113842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档