gasLimit:
是你为一笔交易或合约调用愿意提供的 最大 gas
数量
gasUsed:
是交易或智能合约调用中实际消耗的 gas
数量
gasPrice:
是你愿意为每单位 gas
支付的价格
打个比方:
小明开车从A市到B市。他为此加了100升油。在到达B市后,他发现实际使用了80升油。在这个例子中:
- 100升油 相当于
gasLimit
,即小明为行程预设的最大油量。 - 80升油 是实际消耗的油量,相当于
gasUsed
。
如果我们将油价(即每升油的费用)作为 gasPrice
,比如每升油的价格为1元,那么实际费用可以通过以下公式计算:
总费用=gasUsed×gasPrice
在这个例子中:
- 实际使用的油量(
gasUsed
)为80升。 - 油价(
gasPrice
)为1元/升。
所以,总费用为:
80 升×1 元/升=80 元
即,小明实际支付的费用是80元,而加油的100升油量(gasLimit
)只是为了确保他有足够的油进行整个行程,剩下的油仍旧在油箱里
故:
gasLimit
调高后,gasPrice
不变,交易时需要支付的费用会增加,计算公式为 gasLimit * gasPrice
。但交易结束后,未使用的 gas
会被退还。例如,如果你设置的 gasLimit
为 100,000 gas,gasPrice
为 20 gwei,而实际只使用了 30,000 gas,那么你实际支付的费用是 30,000 * 20 gwei
,剩余的 gas
(70,000 gas)会返还给你。
gasUsed
是交易实际消耗的 gas
数量,这个值只有在交易完成后才会知道。支付的费用是基于 gasUsed
和 gasPrice
计算的,即 gasUsed * gasPrice
。
gasPrice
调高时,你为每单位 gas
支付的价格增加,从而增加了交易的总费用。即使 gasLimit
不变,设置较高的 gasPrice
可以让你的交易更快地被矿工处理,因为矿工更倾向于优先处理高费率的交易。这类似于在油价为 1 元/升时,你为了加快服务而支付了 1.5 元/升,这样商家会优先为你服务,让你在队伍中更靠前。
gasLimit
const gasEstimate = await provider.estimateGas({
to: recipientAddress, // 接收地址
value: ethers.utils.parseEther("0.1"), // 发送数量
});
gasUsed
// 发送交易
const tx = await signer.sendTransaction({
to: recipientAddress,
value: ethers.utils.parseEther("0.1"),
});
const receipt = await tx.wait(); // 等待交易完成
console.log(`gas费为: ${receipt.gasUsed.toString()}`);
gasPrice
const gasPrice = await provider.getGasPrice();
如果你对区别不感兴趣,那么预估交易的gas费:
gas = gasPrice * gasLimt