2

我正在使用以太坊的 Truffle 测试框架(v4.0.1)。我无法弄清楚为什么gasPrice*gasUsed以下简单合约的交易费用没有增加:

contract MinTest {
    function run() public returns(bool) {
        return true;
    }
}

我正在使用的摩卡测试是:

contract('Minimum Test', function (accounts) {

  it("min test", function () {
    var initial = web3.eth.getBalance(accounts[1]);
    var final;

    return MinTest.deployed().then(function(instance) {
        return instance.run({from: accounts[1]});
    }).then(function(result) {
        final =  web3.eth.getBalance(accounts[1]);

        var gasPrice = new BigNumber(web3.eth.gasPrice);
        var gasUsed = new BigNumber(result.receipt.gasUsed);
        var gasCost = gasPrice.times(gasUsed);

        console.log("gasPrice       : " + gasPrice);
        console.log("gasUsed        : " + gasUsed);
        console.log("gasCost        : " + gasCost);
        console.log("initial        : " + initial);
        console.log("initial-gasCost: " + initial.minus(gasCost));
        console.log("final          : " + final);
        console.log("unaccounted    : " + initial.minus(gasCost).minus(final));
    });
  });

});

上面的测试产生以下输出:

gasPrice       :            20000000000
gasUsed        :                  21478
gasCost        :        429560000000000
initial        :  100000000000000000000
initial-gasCost:   99999570440000000000
final          :   99997852200000000000
unaccounted    :       1718240000000000

我预计MinTest.run对合约函数的调用会导致accounts[1]借记的金额正好等于gasPrice*gasUsed,但在本例中并非如此。有一个额外的1718240000000000wei 借记,我无法解释。为什么1718240000000000这里要多加一个wei?

4

1 回答 1

2

web3.eth.gasPrice不是您的交易调用中指定的价格。从文档:

此属性是只读的,并返回当前的 gas 价格。Gas 价格由 x 个最新区块的 Gas 价格中值决定。

它用于告诉您其他人支付的费用,以便您可以动态确定“现行费率”。如果您想随着时间的推移更改交易的 gas 价格,您可以使用它。我猜testrpc这个设置为20000000000。

另一方面,当您没有gasPrice在事务调用中指定 a 时,它默认为 10000000000。下面是一个更新的测试用例,其中包含gasPrice传入和输出(我使用 15 Gwei 进行测试)。

contract('Minimum Test', function (accounts) {

  it("min test", function () {
    var initial = web3.eth.getBalance(accounts[1]);
    var final;
    var gasPrice = new BigNumber(15000000000);

    return MinTest.deployed().then(function(instance) {
      return instance.run({from: accounts[1], gasPrice: gasPrice});
    }).then(function(result) {
      final =  web3.eth.getBalance(accounts[1]);

      var gasUsed = new BigNumber(result.receipt.gasUsed);
      var gasCost = gasPrice.times(gasUsed);

      console.log("gasPrice       : " + gasPrice);
      console.log("gasUsed        : " + gasUsed);
      console.log("gasCost        : " + gasCost);
      console.log("initial        : " + initial);
      console.log("initial-gasCost: " + initial.minus(gasCost));
      console.log("final          : " + final);
      console.log("unaccounted    : " + initial.minus(gasCost).minus(final));
    });
  });

});
  Contract: Minimum Test
gasPrice       : 15000000000
gasUsed        : 21431
gasCost        : 321465000000000
initial        : 100000000000000000000
initial-gasCost: 99999678535000000000
final          : 99999678535000000000
unaccounted    : 0
    √ min test (773ms)


  1 passing (922ms)

编辑 - web3js 文档确实说默认值gasPrice应该是相同的:

gasPrice: Number|String|BigNumber - (可选,默认值:待确定)本次交易的gas价格,单位为wei,默认为平均网络gas价格。

那么这可能是 Truffle 中的一个错误。在任何情况下,如果您输入自己的汽油价格,数字就会计算出来。

于 2017-12-20T01:23:39.737 回答