如何将数据附加到存储数组中?
例如,我们从一个看起来如下的数组开始:
[0]并希望以如下所示的数组结尾:
[0,1]发布于 2022-08-04 15:13:03
要存储动态数组,首先必须获得一个启动存储槽。
假设我们的起始存储槽是n。
然后,要获得第一个值的存储槽,只需像这样散列n:
keccak256(n);这将为您提供保存第一个变量的存储槽。
然后,如果要将某些内容推送到数组中,则再次计算哈希并添加1:
keccak256(n) + 1;诸若此类。
所以在愤怒中,它看起来会是这样的:
#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#字节和字符串
https://ethereum.stackexchange.com/questions/132979
复制相似问题