首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在huff中将数据追加到存储数组中

在huff中将数据追加到存储数组中
EN

Ethereum用户
提问于 2022-08-04 05:23:09
回答 1查看 59关注 0票数 0

如何将数据附加到存储数组中?

例如,我们从一个看起来如下的数组开始:

代码语言:javascript
复制
[0]

并希望以如下所示的数组结尾:

代码语言:javascript
复制
[0,1]
EN

回答 1

Ethereum用户

回答已采纳

发布于 2022-08-04 15:13:03

要存储动态数组,首先必须获得一个启动存储槽。

假设我们的起始存储槽是n。

然后,要获得第一个值的存储槽,只需像这样散列n:

代码语言:javascript
复制
keccak256(n);

这将为您提供保存第一个变量的存储槽。

然后,如果要将某些内容推送到数组中,则再次计算哈希并添加1:

代码语言:javascript
复制
keccak256(n) + 1;

诸若此类。

所以在愤怒中,它看起来会是这样的:

代码语言:javascript
复制
#define macro STORE_BYTES32() = takes(0) returns(0) {
    0x04 calldataload    // [Argument to store]
    [STARTING_SLOT]      // [StartingSLot, Argument]
    0x00 mstore          // [Argument]
    0x20 0x00            // [offset, size, Argument]
    sha3                 // [HashedStorageSlot, Argument]
    sstore               // []
}

这存储了第一个值。要在sha3之后存储第二个值,只需将1添加到它。

此外,在坚固性中,第一个存储槽n保存数组的大小。

这就是EVM知道在哪里推送下一个变量的方式。

我创建了一个契约,展示了如何执行动态数组:https://github.com/Kuly14/Huff-Arrays/blob/main/src/DynamicArray.huff

它比上面的例子要复杂一些,因为我们需要计算数组中有多少项才能不覆盖任何vars。

我还没有时间为它创建任何测试,所以请记住这一点。

如果你想把变量放在同一个槽里以节省汽油的话,它会变得复杂得多。你必须做大量的字节掩蔽。

下面是noxx关于这个主题的一篇伟大文章:https://noxx.substack.com/p/evm-deep-dives-the-path-to-shadowy-3ea

这里还链接到更深入解释的文档:https://docs.soliditylang.org/en/v0.8.13/internals/layout_在……里面_bytes#字节和字符串

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

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

复制
相关文章

相似问题

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