Solidity/Ethereum。关于天然气的更便宜的替代品

Solidity/Ethereum. Cheaper alternative regarding gas

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

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

为此,我需要访问总池。我的第一直觉是有一个变量 totalPool 来跟踪总价值,因此每次一个地址支付合同时,totalPool += msg.value;但是,在了解 EVM 的同时,我一直在阅读在存储上操作的成本。

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

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

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