2017-12-19 29 views
1

私はEthereum用のTruffleテストフレームワーク(v4.0.1)を使用しています。Truffleを使用したEthereum契約における取引手数料の計算

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*gasUsedまで追加されていない理由を私は理解できません次の出力:

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

私は契約のMinTest.run関数の呼び出しがaccounts[1]がに正確に等しい金額を引き落とされさせることが期待ですが、この例ではそうではありません。追加の1718240000000000私は説明できないほど借方があります。ここで追加の1718240000000000ウィジェットが引き落とされるのはなぜですか?

答えて

0

web3.eth.gasPriceは、トランザクションコールで指定された価格ではありません。ドキュメントから:

このプロパティは読み取り専用で、現在のガス価格を返します。ガス の価格は、最新のブロックx中央値ガス価格によって決定されます。

これは、他人が支払っていることを伝えるために使用されるため、動的に「進行率」を決定できます。時間の経過とともにガス価格を変更する場合は、これを使用します。私はそれ以下は10000000000.にデフォルトで、ちょうどあなたのトランザクション呼び出しでgasPriceを指定しない場合は、一方20000000000.

でこのセットを持っているtestrpcを推測しているに渡さ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) 

EDIT - web3jsドキュメントは確かgasPriceのデフォルト値が同じになるようになっていると言うの操作を行います。

gasPrice:数| - (オプショナルなBigNumber |文字列、デフォルト: 決定される)この取引のガス価格は、であり、デフォルトはネットワークガスの平均価格です。

トリュフのバグかもしれません。いずれにしても、あなた自身のガス価格を渡すと、その数字はうまくいきます。

関連する問題