Truffle
了解 ganache 時間戳
有時,當我使用 ganache 特定
evm_increaseTime
方法並前進到下一個塊時,下一個時間戳不是:current timestamp + advanced time
但反而:
current timestamp + advanced time + 1 second
這一秒從何而來?是事務的核心計算時間嗎?閏秒?
RPC 日誌:
eth_sendTransaction Transaction: 0x9cc8e2006d13f3349594a284a8f9ec8489c8bff6d57022143bb4457b30ee50b1 Gas usage: 224072 Block Number: 226 Block Time: Fri Aug 09 2019 11:01:40 GMT+0200 (Central European Summer Time) eth_getTransactionReceipt evm_increaseTime evm_mine eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_call eth_getBlockByNumber eth_call eth_getBlockByNumber eth_sendTransaction Transaction: 0x2126e0a1ac901864c7dacabb7a6228f6753e5ad3ceb65f1957ecaaa395bc8569 Gas usage: 72408 Block Number: 228 Block Time: Fri Aug 09 2019 11:02:46 GMT+0200 (Central European Summer Time) eth_getTransactionReceipt eth_getBlockByNumber eth_call eth_getBlockByNumber eth_call
你可以看到,第二個時間戳是“11:02:46”而它應該是“11:02:45”,因為我在測試中執行的程式碼是這樣的:
web3.utils.advanceTimeAndBlock(new BigNumber(65));
我為此寫了整篇文章:編寫準確的時間相關松露測試
TL; 博士
- 1 秒來自執行時間成本,即 javascript 承諾解決所需的時間。
- 為了提高準確性,您必須使用
evm_mine
一個參數來表示您想要在時間上向前或向後跳躍的秒數。閱讀此PR了解更多詳情。const advanceBlockAtTime = (time) => { return new Promise((resolve, reject) => { web3.currentProvider.send( { jsonrpc: "2.0", method: "evm_mine", params: [time], id: new Date().getTime(), }, (err, _) => { if (err) { return reject(err); } const newBlockHash = web3.eth.getBlock("latest").hash; return resolve(newBlockHash); }, ); }); };