首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态calldata数组的calldata偏移量是什么?

动态calldata数组的calldata偏移量是什么?
EN

Ethereum用户
提问于 2023-02-16 13:59:02
回答 2查看 210关注 0票数 1

对于动态调用数据数组,坚实的文档会这样说:

对于动态调用数据数组,可以使用x.offsetx.length访问它们的回调数据偏移量(以字节为单位)和长度(元素数)。

但他们没有提供任何例子。

在这种情况下,“抵消”意味着什么?

EN

回答 2

Ethereum用户

回答已采纳

发布于 2023-02-16 14:10:10

offset是调用数据中开始数组的实际数据的位置,即第一个数组元素所在的位置。让我们举一个例子:

代码语言:javascript
复制
contract Foo {
    function getOffset(uint256[] calldata arr) external pure returns (uint256 offset) {
        assembly {
            offset := arr.offset
        }
    }
}

[1,2,3]作为此函数的输入传递将返回68:

现在,让我们在函数中定义另一个参数,在arr之前:

代码语言:javascript
复制
function getOffset (uint256 param, uint256[] calldata arr) external pure returns (uint256 offset) {
    assembly {
        offset := arr.offset
    }
}

0,[1,2,3]作为输入传递现在将返回100而不是68,因为在arr之前还有另一个EVM单词,并且EVM单词有32字节长:

票数 1
EN

Ethereum用户

发布于 2023-05-01 22:21:25

假设我们有这样的功能:

代码语言:javascript
复制
contract Foo {
    function getOffset(uint256[] calldata arr) external pure returns (uint256 offset) {
        assembly {
            offset := arr.offset
        }
    }
}

[1, 2, 3]作为此函数的输入传递将返回68。

但它是如何计算68的呢?

基于文档,我们可以找到编码的参数,对于这个输入和函数参数,它将是:

代码语言:javascript
复制
0x1fe457d7                                                         - function signature
  0000000000000000000000000000000000000000000000000000000000000020 - offset of [1,2,3]
  0000000000000000000000000000000000000000000000000000000000000003 - count for [1,2,3]
  0000000000000000000000000000000000000000000000000000000000000001 - encoding of 1
  0000000000000000000000000000000000000000000000000000000000000002 - encoding of 2
  0000000000000000000000000000000000000000000000000000000000000003 - encoding of 3

如果计算从function signature行(4个字节)到开始数组的实际数据的行encoding of 1开头的字节数,您将发现有68个字节。

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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