Solidity

block.number如何計算時差,它與block.timestamp有何不同?

  • October 14, 2017

我一直在研究一些開發人員最近完成的程式碼,他們使用 block.number + numbers 來計算時間差。例如,如果我想鎖定資金 6 個月或 180 天,開發人員使用 block.number +(一些計算的數字 1296000 塊)來計算要解鎖的資金數量。

我想知道這個計算如何與時間段一起工作。為什麼不使用 block.timestamp 呢?block.number 可靠嗎?

這是程式碼片段。它基本上是持有代幣 180 天的保險庫。

contract Vault is SafeMath {

   // flag to determine if address is for a real contract or not
   bool public isVault = false;

   Token token;
   address multisig;
   uint256 unlockedAtBlockNumber;
   // 1296000 blocks = 6 months * 30 days / month * 24 hours / day * 60 minutes / hour * 60 seconds / minute / 12 seconds per block
   //uint256 public constant numBlocksLocked = 1296000;
   // smaller lock for testing
   uint256 public constant numBlocksLocked = 12;

   /// @notice Constructor function sets the Lunyr Multisig address and
   /// total number of locked tokens to transfer
   function Vault(address _Multisig) internal {
       if (_Multisig == 0x0) throw;
       token = Token(msg.sender);
       multisig = _Multisig;
       isVault = true;
       unlockedAtBlockNumber = safeAdd(block.number, numBlocksLocked); // 180 days of blocks later
   }

   /// @notice Transfer locked tokens to multisig wallet
   function unlock() external {
       // Wait your turn!
       if (block.number < unlockedAtBlockNumber) throw;
       // Will fail if allocation (and therefore toTransfer) is 0.
       if (!token.transfer(multisig, token.balanceOf(this))) throw;
       // Otherwise ether are trapped here, we could disallow payable instead...
       if (!multisig.send(this.balance)) throw;
   }

   // disallow payment after unlock block
   function () payable {
       if (block.number >= unlockedAtBlockNumber) throw;
   }

}

我相信這block.timestamp是該塊被開采的掛鐘日期/時間。未來基於某個其他區塊設置的區塊編號是基於對區塊探勘率的估計。例如,在撰寫本文時,平均/目標塊時間約為 17 秒。所以如果你想通過區塊號設置一個未來 24 小時的時間,你可以使用24 * 60 * 60 / 17(一天中的秒數除以每個區塊的秒數)來粗略地確定那個時候將要開采的區塊號。請注意,對於中遠期的某些時候,您需要考慮到冰河時代:根據設計,區塊生成的速度將減慢,以鼓勵用於權益證明的硬分叉,並且在同時,隨著冰河時代的推進,採礦的盈利能力(以 ETH 計價)大幅下降。

這是一個模擬器,可以了解正在發生的事情: https : //gist.github.com/CJentzsch/c78768f9837afb8eef74 請注意,由於最近對乙太坊協議的更改而減慢了速度,因此模擬器已退出日期。

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