Solidity

在 Dapps 中獲取時間的去中心化時間伺服器?

  • August 9, 2019

所以基本上我想問的是,我們如何以程式方式在 DApp 中獲取準確、準確和目前的時間,而不依賴於系統的時間或集中的時間伺服器?

是否有一個分散的服務來跟踪時間,所以從那裡查詢時間會更容易,而不必依賴集中的單點故障和潛在的易受攻擊的時間伺服器?

也許分散的時間戳服務可以在這裡提供幫助,但我不知道。

請告訴我 !

我猜你需要nowSolidity 中的關鍵字。那是目前的區塊時間戳。

查看官方文件:

https://solidity.readthedocs.io/en/develop/units-and-global-variables.html#block-and-transaction-properties

例子

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定期將其稱為公共服務(因為它要消耗汽油),也許每隔幾個街區就可以調整漂移。消費者可以訪問lastBlockTimelastBlockNumber成員作為準時的下限(它與任何人最後一次呼叫一樣陳舊submitNewTime

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