Solidity
在 Dapps 中獲取時間的去中心化時間伺服器?
所以基本上我想問的是,我們如何以程式方式在 DApp 中獲取準確、準確和目前的時間,而不依賴於系統的時間或集中的時間伺服器?
是否有一個分散的服務來跟踪時間,所以從那裡查詢時間會更容易,而不必依賴集中的單點故障和潛在的易受攻擊的時間伺服器?
也許分散的時間戳服務可以在這裡提供幫助,但我不知道。
請告訴我 !
我猜你需要
now
Solidity 中的關鍵字。那是目前的區塊時間戳。查看官方文件:
例子
function f(uint start, uint daysAfter) public { if (now >= start + daysAfter * 1 days) { // ... } }
是你說的那個嗎?
Solidity 關鍵字
now
確實返回了底層節點的系統時間,但這可以由該特定節點操縱(例如,進行礦工搶先執行)。一種可能性是您可以擁有一個智能合約,參與者可以定期送出目前區塊的時間,這將是正確的加上或減去幾個塊(下面稱為 FUDGE_FACTOR_IN_BLOCKS)。在乙太坊上,大約 15 秒後找到每個塊,因此您可以編寫一個看起來大致類似的智能合約(這可能無法編譯但給出了想法)
contract TimeServer { uint256 FUDGE_FACTOR_IN_BLOCKS = 2; uint256 public lastBlockNumber; uint256 public lastBlockTime; constructor(uint256 firstBlockNumber) { require(abs(firstBlockNumber - block.number) < FUDGE_FACTOR_IN_BLOCKS)); lastBlockNumber = block.number; lastBlockTime = now; } function submitNewTime(uint256 newBlockNumber, uint256 newBlockTime) public { uint blockDiff = newBlockNumber - lastBlockNumber; require(blockDiff > 0, `New block number must be later than last block')' uint timeDiff = newBlockTime - lastBlockTime; require(abs(timeDiff / 15) - blockDiff) < FUDGE_FACTOR_IN_BLOCKS, 'Submitted block time is off by more than +/- fudge factor.') ) lastBlockNumber = newBlockNumber; lastBlockTime = newBlockTime; } }
我不確定
now
是毫秒還是秒,所以先檢查一下。只要合約構造正確(在實際區塊號的兩個區塊內,在誠實節點上給出),那麼每次其他呼叫submitNewTime
也將在正確時間和區塊號的兩個區塊內。參與者可以
submitNewTime
定期將其稱為公共服務(因為它要消耗汽油),也許每隔幾個街區就可以調整漂移。消費者可以訪問lastBlockTime
和lastBlockNumber
成員作為準時的下限(它與任何人最後一次呼叫一樣陳舊submitNewTime
)