智能合約安全與審計

時間戳相依性

時間戳相依性是仰賴 block.timestamp 來做隨機性、或做出塊者能撥動以圖利的細粒度邏輯。寫入區塊的時間戳是由出塊者在協議允許的範圍內選定的,而非從一個可信的全域時鐘讀取。把它當成不可預測或完美精確的值,便招來操縱:一個有利可圖的出塊者能把時間戳挪動幾秒,而這點小小的自由,就足以撥動任何取決於確切時刻的決定。

界線因時代而異,教訓卻一致。在工作量證明下,礦工可把時間戳設在任何大於父區塊、且與真實時間相差不過適度容忍(常為十五秒左右)之處。在權益證明下,時隙固定為十二秒,這收緊了情況,但提議者在規則內仍有裁量權,有時還能選擇是否要提議。所以,用 block.timestamp 取模 N 來挑樂透贏家、或用一個不到一分鐘的期限來把關某動作,等於把結果交到了出塊者手上。

實務準則是:block.timestamp 適合粗略、以天為尺度、幾秒無關緊要的邏輯,例如解鎖時程、數小時的期限、或利息累計。它絕不能作為隨機性的來源,也不能決定任何出塊者可從撥動中獲利的事。鏈上隨機性請改用可驗證隨機函數、或像 RANDAO 這樣的信標,而非時鐘;對公平性至關重要的時間判斷,請設計成幾秒鐘的出塊者自由無法被利用。

一個用 uint(block.timestamp) % players 來挑贏家的樂透是可被利用的:一個同時也是玩家的礦工或提議者,能在其被允許的時間戳餘裕內,選一個讓自己中獎的值。可驗證隨機函數能移除這種裁量權。

block.timestamp 適合粗略、以天為尺度的邏輯,但絕不適合隨機性、或任何出塊者可藉撥動幾秒獲利的決定。鏈上隨機性請用 VRF 或 RANDAO,而非時鐘。

又称
block.timestamp manipulation區塊時間操縱