0

我正在学习solidity/ethereum,我遇到了这种情况:

我有一个映射(地址 => 单元)来跟踪每个地址为我的合同支付了多少,并且在某些时候,我必须计算一个用户贡献了多少% 的总池。(例如,如果总池为 100 个以太,用户贡献了 10 个以太,他贡献了总池的 10%)。

为此,我需要访问总池。我的第一直觉是有一个变量 totalPool 来跟踪总价值,因此每次地址支付合同时,totalPool += msg.value; 然而,在学习 EVM 的同时,我一直在阅读在存储上运行的成本是多么昂贵。

我的问题是,就 gas 而言,跟踪总池并在每次地址支付合同时在内存上操作,或者每次我需要找出比率贡献时计算总池,什么更便宜?

4

1 回答 1

0

根据我对您的用例的了解,除非您有一种简单的方法来计算总池,否则您的第一直觉可能是最简单和最好的解决方案。您必须记住,在solidity 中,不可能遍历映射的元素来总结它们。因此,除非可以使用无论如何都会存储的其他变量来计算池的大小,否则总池变量很可能是跟踪池大小的最佳方法。

我强烈建议您测试尽可能多的实现。ethers.js 和 web3.js 库都具有允许您测试执行交易需要多少气体的功能。

于 2022-01-20T21:52:03.847 回答