problemas para hacer coincidir el gas utilizado en la transacción con la diferencia en el saldo de la cuenta

Encendí mi testrpce implementé un contrato simple de HelloWorld usando truffle. Envío una transacción simple a mi contrato y registro el saldo de mi cuenta antes y después de la transacción. Desafortunadamente, esto no se suma al parámetro gasUsed que veo en la transacción.

contract HelloWorld {

    uint public x;   

    function HelloWorld() {
        x = 5;
    }

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

}

y mi javascript

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")

})

Produce algo como esto:

{ 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

Parece que la diferencia en el saldo de mi cuenta ES la misma que la gasolina utilizada, solo que una magnitud diferente. Entonces, ¿estoy confundido? ¿Estos números están expresados ​​en wei? Pensé que necesitaba multiplicar por el precio de la gasolina para ver cuánto afectaría la transacción al saldo de mi cuenta... ¿Cómo puedo obtener GasUsed para igualar la diferencia en el saldo de mi cuenta?

Verifique que TestRPC no esté usando un precio de gasolina de1
No, está al precio predeterminado del gas de 20000000000
La explicación más probable es que truffle esté usando un precio de gasolina diferente al que usa testrpc por defecto. El objeto de la transacción (no el recibo: obténgalo con eth.getTransaction) mostrará el precio real del gas utilizado
Es muy probable que te encuentres con errores aritméticos de coma flotante. Debes evitar .toNumber()a toda costa.

Respuestas (3)

Puede configurar la red como desee en truffle.jsel archivo.

Uno de los parámetros es gasPrice(el valor predeterminado es 100000000000)

Documentación

Creo que este gasPrice solo se usa para implementaciones por contrato

testrpccodifica el precio del gas de las transacciones a 0x01, al menos a partir de4727b40

Interesante. Gracias. ¿Sabes por qué web3.eth.gasPricedevuelve 20000000000? ¿Y en qué magnitud se expresa? No puedo hacer que la diferencia en el saldo de mi cuenta sea de la misma magnitud que el gas usado...
@natsuki_1996 Es una discrepancia entre lo que devuelve el administrador de estado interno y lo que realmente pasa a las transacciones cuando se crean. Noté una discrepancia similar con coinbase/ mineren un PR
Se perdió la segunda mitad de eso... El precio del gas podría estar denominado en eth/Mgas, aunque eso no parece alinearse con los resultados que obtuvo. Tendré que investigar cómo se procesan las transacciones en testrpc/sus dependencias para darle una mejor respuesta
@natsuki_1996: Me pregunto si el problema podría estar relacionado con el uso .toNumber()en el BigNumbersque está extrayendo de web3. He usado algo como esto para contabilizar con precisión el gas pagado en las pruebas en el testrpc (que debería ser independiente del precio real del gas). Es posible que necesite alguna traducción a la versión no prometida, pero ¿tal vez intentarlo y ver qué obtienes?

Como se indicó anteriormente:

truffle usa un precio de gas diferente al de testRPC

Si realmente quiere usar web3.eth.gasPricecomo referencia en sus pruebas, mientras usa testRPC, puede forzar su propio precio de gas ejecutándolo con:

testrpc --g 100000000000