Учет комиссии за транзакции в контракте Ethereum с использованием трюфеля

Я использую среду тестирования Truffle (v4.0.1) для Ethereum. Я не могу понять, почему комиссионные за транзакции не составляют 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, но это не так в этом примере. Есть дополнительный 1718240000000000 Вей списал, что я не могу объяснить. Почему дополнительный 1718240000000000 Вей дебетовал здесь?

1 ответ

Решение

web3.eth.gasPrice это не цена, указанная в вашей транзакции вызова. Из документов:

Это свойство доступно только для чтения и возвращает текущую цену на газ. Цена на газ определяется по последним медианным ценам на газ.

Он используется, чтобы сообщать вам, что платят другие, чтобы вы могли динамически определять "текущую ставку". Вы можете использовать это, если хотите со временем изменить цену на газ для своих транзакций. я догадываюсь testrpc просто имеет этот набор на 20000000000.

С другой стороны, когда вы не указываете gasPrice в вызове транзакции по умолчанию используется значение 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 - (необязательно, по умолчанию: To-Be-Defined). Цена газа для этой транзакции в wei по умолчанию равна средней цене газа в сети.

Это может быть ошибка в трюфеле тогда. В любом случае, если вы укажете свою цену на газ, цифры сработают.

Другие вопросы по тегам