Truffle

了解 ganache 時間戳

  • August 11, 2019

有時,當我使用 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. 1 秒來自執行時間成本,即 javascript 承諾解決所需的時間。
  2. 為了提高準確性,您必須使用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);
     },
   );
 });
};

引用自:https://ethereum.stackexchange.com/questions/73751