2017-12-19 13 views
1

Ich benutze das Trüffel-Test-Framework (v4.0.1) für Ethereum. Ich kann nicht herausfinden, warum die Transaktionsgebühren nicht zu gasPrice*gasUsed für den folgenden einfachen Vertrag Aufsummierung sind: Ich bin mitAccounting für Transaktionsgebühren in Ethereum Vertrag mit Truffle

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

Der Mokka-Test:

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)); 
    }); 
    }); 

}); 

Der Test oben erzeugt die folgende Ausgabe:

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

ich erwartete, dass der Anruf an die MinTest.run Funktion des Vertrages accounts[1] zu veranlassen, eine Menge genau gleichzu belastender, aber das ist in diesem Beispiel nicht der Fall. Es gibt eine zusätzliche 1718240000000000 wei belastet, dass ich nicht erklären kann. Warum wird hier ein zusätzliches 1718240000000000 wei belastet?

Antwort

0

web3.eth.gasPrice ist nicht der in Ihrem Transaktionsaufruf angegebene Preis. Aus der Dokumentation:

Diese Eigenschaft ist schreibgeschützt und gibt den aktuellen Gaspreis zurück. Der Preis des Gases wird durch den letzten Gaspreis der letzten Blöcke der Blöcke bestimmt.

Es wird verwendet, um Ihnen zu sagen, was andere zahlen, damit Sie die "gehende Rate" dynamisch bestimmen können. Sie würden dies verwenden, wenn Sie den Gaspreis für Ihre Transaktionen im Laufe der Zeit ändern möchten. Ich vermute, testrpc hat gerade diesen Satz bei 20000000000.

Auf der anderen Seite, wenn Sie nicht über eine gasPrice in Ihrem Transaktionsaufruf angeben, wird standardmäßig 10000000000. Im Folgenden wird ein aktualisierter Testfall mit dem übergebenen gasPrice in und die Ausgabe (Ich habe 15 Gwei für meinen Test verwendet).

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) 

EDIT - Die web3js docs sagen Sie in der Tat der Standardwert für gasPrice soll die gleiche sein:

gasPrice: Anzahl | String | bignumber - (optional , Standard: To-Be-Determined) Der Gaspreis für diese Transaktion in Wei, , wird standardmäßig auf den durchschnittlichen Gaspreis des Netzes umgerechnet.

Es könnte dann ein Fehler in Truffle sein. In jedem Fall, wenn Sie Ihren eigenen Gaspreis übergeben, funktionieren die Zahlen.

Verwandte Themen