为什么以太坊交易是 (startingBalance - endBalance) > (gasUsed * gasPrice)?
Why is (startingBalance - endBalance) > (gasUsed * gasPrice) for an Ethereum transaction?
我正在尝试在 truffle 框架中编写 javascript 测试,以验证移动资金的交易后以太币余额的变化。
我想排除 gas 费用,这样我就可以确定余额变化的确切金额。
以下是我试图确定在 gas 上花费的 eth 数量的方法:
let startingBalance = await web3.eth.getBalance(me);
let tx = await contract.method.sendTransaction({from: me, gasPrice: 1});
let endBalance = await web3.eth.getBalance(me);
let receipt = await web3.eth.getTransactionReceipt(tx);
await (startingBalance - endBalance).should.be.equal(receipt.gasUsed);
我的推理是,因为:
- 交易不改变资金
- 我明确将交易 gasPrice 设置为 1
receipt.gasUsed
应该等于余额变化。
但是 运行 针对 testrpc,测试抱怨余额减少了 2000 左右,比 gasUsed * gasPrice
略多。
是否还有其他因素可能导致 ETH 余额变化?
谢谢!
我不会信任 testrpc。在测试网上 运行 尝试你的代码
startingBalance
和 endBalance
是 BigNumber
个对象。将您的测试更改为
await (startingBalance.minus(endBalance)).should.be.equal(receipt.gasUsed);
我正在尝试在 truffle 框架中编写 javascript 测试,以验证移动资金的交易后以太币余额的变化。
我想排除 gas 费用,这样我就可以确定余额变化的确切金额。
以下是我试图确定在 gas 上花费的 eth 数量的方法:
let startingBalance = await web3.eth.getBalance(me);
let tx = await contract.method.sendTransaction({from: me, gasPrice: 1});
let endBalance = await web3.eth.getBalance(me);
let receipt = await web3.eth.getTransactionReceipt(tx);
await (startingBalance - endBalance).should.be.equal(receipt.gasUsed);
我的推理是,因为:
- 交易不改变资金
- 我明确将交易 gasPrice 设置为 1
receipt.gasUsed
应该等于余额变化。
但是 运行 针对 testrpc,测试抱怨余额减少了 2000 左右,比 gasUsed * gasPrice
略多。
是否还有其他因素可能导致 ETH 余额变化?
谢谢!
我不会信任 testrpc。在测试网上 运行 尝试你的代码
startingBalance
和 endBalance
是 BigNumber
个对象。将您的测试更改为
await (startingBalance.minus(endBalance)).should.be.equal(receipt.gasUsed);