2017-12-19 13 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)); 
    }); 
    }); 

}); 

테스트는 위의 생산 I는 거래 수수료는 다음과 같은 간단한 계약 gasPrice*gasUsed까지 추가하지 않는 이유를 알아낼 수 없습니다 다음 출력 :

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

제가 01,230 정확히 동일한 금액을 인출하는 계약 MinTest.run 함수 호출이 accounts[1]을 일으킬 것으로 예상이지만이 예에서는 그렇지 않습니다. 추가 1718240000000000 wei이 (가) 설명을하지 않아서 설명 할 수 없습니다. 추가 1718240000000000 wei가 여기에서 왜 인출 되었습니까?

답변

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) 

편집 - web3js 워드 프로세서는 실제로 gasPrice에 대한 기본 값이 동일한 것으로 가정하고 있다고 마십시오 :

gasPrice : 번호 | - (선택 사항 BigNumber | 문자열 , 기본값 : 결정 예정)이 거래의 가스 가격 (예 : )은 평균 네트워크 가스 가격이 기본값입니다.

트러플에 버그가있을 수 있습니다. 어떤 경우에도, 자신의 가스 가격을 전달하면 그 숫자는 모두 소진됩니다.