проблема сопоставления газа, используемого в транзакции, с разницей в балансе счета

Я запустил свой testrpcи развернул простой контракт HelloWorld, используя truffle. Я отправляю простую транзакцию в свой контракт и регистрирую баланс своего счета до и после транзакции. К сожалению, это не соответствует параметру gasUsed, который я вижу в транзакции.

contract HelloWorld {

    uint public x;   

    function HelloWorld() {
        x = 5;
    }

    function set_x(uint _x) returns(uint x) {
        x = _x;
        return x;
    }

}

И мой джаваскрипт

var HelloWorld = artifacts.require("./HelloWorld.sol");

module.exports = function(callback) {}

from_wei = web3._extend.utils.fromWei

var account1 = web3.eth.accounts[0]; 
var start_balance = web3.eth.getBalance(account1).toNumber();

HelloWorld.deployed().then(function(instance) {

    return instance.set_x(500)

}).then(function(tx) {

    console.log(tx)
    var new_balance = web3.eth.getBalance(account1).toNumber();

    console.log(start_balance + " initial balance");
    console.log(new_balance + " balance after transaction");
    console.log((start_balance - new_balance) + " difference");
    console.log(from_wei(start_balance - new_balance) + " difference (from_wei) ?");
    console.log(web3.eth.gasPrice.toNumber() + " gas price")

})

Выводит что-то вроде этого:

{ tx: '0x1a2876b330618c75c7e264becbee75c491b47b5a17a0f9f9fe7fb124f0e93113',
  receipt:
   { transactionHash: '0x1a2876b330618c75c7e264becbee75c491b47b5a17a0f9f9fe7fb124f0e93113',
     transactionIndex: 0,
     blockHash: '0xf30134cac3be167d6053a21953b87010ce7145ccb36775e76d38458dddfa81b9',
     blockNumber: 16,
     gasUsed: 21736,
     cumulativeGasUsed: 21736,
     contractAddress: null,
     logs: [] },
  logs: [] }
99939363900000000000 initial balance
99937190300000000000 balance after transaction
2173600000000000 difference
0.0021736 difference (from_wei) ?
20000000000 gas price

Похоже, что разница в балансе моего счета такая же, как и в использованном газе, только в другом размере. Значит я запутался? Эти числа выражены в вэй? Я думал, что мне нужно умножить на цену газа, чтобы увидеть, насколько транзакция повлияет на баланс моего счета...? Как я могу заставить GasUsed сравняться с разницей в балансе моего счета?

Убедитесь, что TestRPC не использует цену газа1
Нет, это по цене газа по умолчанию 20000000000
Наиболее вероятное объяснение заключается в том, что трюфель использует другую цену газа, чем та, которую testrpc использует по умолчанию. Объект транзакции (не квитанция: получите его с помощью eth.getTransaction) покажет фактическую использованную цену на газ.
Скорее всего, вы сталкиваетесь с арифметическими ошибками с плавающей запятой. Вам следует избегать .toNumber()любой ценой.

Ответы (3)

Вы можете настроить сеть по своему усмотрению в truffle.jsфайле.

Один из параметров gasPrice(по умолчанию 100000000000)

Документация

Я считаю, что этот gasPrice используется только для контрактных развертываний.

testrpcжестко кодирует цену газа транзакций до 0x01, по крайней мере, на4727b40

Интересно. Спасибо. Вы знаете, почему web3.eth.gasPriceвозвращает 20000000000? И в какой величине она выражается? Я не могу добиться, чтобы разница в балансе моего счета была такой же величины, как использованный газ...
@ natsuki_1996 Это несоответствие между тем, что возвращает внутренний диспетчер состояний, и тем, что фактически передается в транзакции при их создании. Аналогичное несоответствие я заметил с coinbase/ minerв PR
Пропустил вторую половину этого... Цена на газ может быть выражена в eth/Mgas, хотя, похоже, это не согласуется с полученными вами результатами. Мне придется покопаться в том, как транзакции обрабатываются в testrpc/его зависимостях, чтобы дать вам лучший ответ.
@ natsuki_1996: Мне интересно, может ли проблема быть связана с использованием .toNumber()файла BigNumbers, который вы извлекаете из web3. Я использовал что-то подобное для точного учета газа, уплаченного в тестах на testrpc (который не должен зависеть от фактической цены на газ). Возможно, потребуется некоторый перевод на необещанную версию, но, может быть, попробовать и посмотреть, что получится?

Как указано выше:

трюфель использует другой gasPrice, чем testRPC

Если вы действительно хотите использовать web3.eth.gasPriceего в качестве эталона в своих тестах, при использовании testRPC вы можете форсировать его собственный gasPrice, запустив его с помощью:

testrpc --g 100000000000