问题描述
我正在尝试在单个事务中执行多个动作序列。但是,我想我最终会使用大量的GasCost,并且试图找到一种解决方案来优化代码以减少Gas Fees。这是我的设置。
我正在使用Web3的web3.eth.abi.encodefunctionCall
将所有必需的动作编码为数组,然后将它们发送到我的智能合约代码,该代码在for
循环中执行每个动作。
JS文件。
let abi1 = web3.eth.abi.encodefunctionCall( { "name": "deposit","type": "function","inputs": [ { "name": "_amount","type": "uint256" } ] },[web3.utils.toWei((1000).toString(),'Ether')] );
let abi2 = web3.eth.abi.encodefunctionCall( {"constant":false,"inputs":[],"name":"withdrawAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},[] );
addrs = [address1,address2];
actions = [abi1,abi2];
我正在将这些数组传递给我的智能合约,该合约会像-
function execute(address[] calldata _addrs,bytes[] calldata _actions)
{
for(uint i = 0; i < _addrs.length; i++)
address(_addrs[i]).call(_actions[i]);
}
const [gasPrice,gasCost] = await Promise.all([
web3.eth.getGasPrice(),tx.estimateGas({from: address}),]);
console.log("gasPrice = ",gasPrice);
console.log("gasCost = ",gasCost);
我得到的估算值为-gasPrice: 66 Gwei
和gasCost: 1443172
。但是,当我使用70 Gwei
执行事务时,实际使用的 GasCost 是3,314,500
。我认为这太高了,因为,我看到类似的交易使用的GasCost较少,但是Gwei较高。这是否意味着我必须使用较高的Gwei来减少总的汽油费?
我想知道我可以采用的最佳编码方法,以优化智能合约的执行并减少汽油费。我确信还有许多其他方法可以在1个事务中执行这些动作序列。有人可以指出我正确的方向来实现这一目标吗?
谢谢。 ish
解决方法
我应该看到您完整的智能合约,以了解DApp的逻辑。但是,您可以在合同中采取以下一些常规技巧来降低天然气成本:
- 如果可以,请使用固定大小的数组(使用bytes1到bytes32)。
- 除非必要,请勿在函数中使用循环(在函数中使用单个动作)。
- 避免在循环中修改存储变量,这可能会非常昂贵。 您可以查看此链接以获取有关节省气体的更多信息: https://medium.com/coinmonks/optimizing-your-solidity-contracts-gas-usage-9d65334db6c7