如何在Solidity智能合约中获取交易成本及tx.gasprice单位疑问
在Solidity智能合约中获取交易成本的问题解答
嘿,刚好做Solidity合约开发的时候折腾过这些点,给你详细说清楚:
1. 如何在以太坊平台的Solidity智能合约中获取交易成本?
交易成本的核心公式是 实际消耗的gas量 × 每单位gas的价格,以太坊并没有提供直接返回交易总成本的内置变量,但我们可以在合约内通过步骤计算:
- 先在合约逻辑的最开头,记录初始剩余gas:
uint256 initialGas = gasleft();,gasleft()是Solidity的内置函数,返回当前合约执行还剩多少gas; - 在你需要计算成本的节点,用初始gas减去当前剩余gas,得到已经消耗的gas:
uint256 usedGas = initialGas - gasleft();; - 最后用消耗的gas乘以gas单价,算出到当前节点的交易成本:
uint256 transactionCost = usedGas * tx.gasprice;(结果单位是wei)。
注意:这种方法只能计算到当前执行节点的成本,如果想拿到整个交易最终的总成本,合约内部是做不到的——因为整个交易的gas消耗还包括合约执行之外的环节(比如签名验证、交易打包前的处理等),而且合约执行结束后也没法再返回这个数值。
2. 在合约内部获取交易成本是否仅需使用tx.gasprice?该值的单位始终是gwei还是wei?
当然不是只靠tx.gasprice!tx.gasprice只是发起交易的用户设置的每单位gas的价格,它只是个单价,不是总成本,必须搭配实际消耗的gas量才能算出真实交易成本。
另外要明确:tx.gasprice的单位是wei(以太坊的最小原生货币单位),不是gwei。gwei是我们日常沟通时用来简化的单位(1 gwei = 10^9 wei),但Solidity里所有和ETH相关的内置变量都是以wei为单位存储的,如果需要转换成gwei,自己做个除法就行:uint256 gasPriceInGwei = tx.gasprice / 1e9;。
内容的提问来源于stack exchange,提问作者pizzarob
相关产品推荐
相关产品推荐

