Solidity
block.number如何計算時差,它與block.timestamp有何不同?
我一直在研究一些開發人員最近完成的程式碼,他們使用 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 請注意,由於最近對乙太坊協議的更改而減慢了速度,因此模擬器已退出日期。