Soildity安全之時間戳依賴區(qū)塊鏈
WF曲速未來:Soildity作為編寫智能合約的語言,已經(jīng)被廣泛的應(yīng)用。但同時,開發(fā)者和用戶也得到了慘痛的教訓(xùn),智能合約的安全問題層出不窮。因此,我們總結(jié)了一些常見的Solidity安全問題。前車之鑒,后車之師,希望后來者能有所警惕。
WF曲速未來:Soildity作為編寫智能合約的語言,已經(jīng)被廣泛的應(yīng)用。但同時,開發(fā)者和用戶也得到了慘痛的教訓(xùn),智能合約的安全問題層出不窮。因此,我們總結(jié)了一些常見的Solidity安全問題。前車之鑒,后車之師,希望后來者能有所警惕。
時間戳依賴
時間戳:一個能表示一份數(shù)據(jù)在某個特定時間之前已經(jīng)存在的、 完整的、 可驗證的數(shù)據(jù),通常是一個字符序列,唯一地標識某一刻的時間。
數(shù)據(jù)塊時間戳歷來被用于各種應(yīng)用,例如隨機性的函數(shù),鎖定一段時間的資金以及時間相關(guān)的各種狀態(tài)變化的條件語句。通常來說都是使用礦工的本地時間作為時間戳,而這個時間大約能有900秒的范圍波動,當其他節(jié)點接受一個新區(qū)塊時,只需要驗證時間戳是否晚于之前的區(qū)塊并且與本地時間誤差在900秒以內(nèi)。一個礦工可以通過設(shè)置區(qū)塊的時間戳來盡可能滿足有利于他的條件,從中獲利。
代碼案例
以下函數(shù)僅接受特定日期之后的調(diào)用。由于礦工可以影響他們的塊的時間戳(在某種程度上),他們可以嘗試使用未來設(shè)置的塊時間戳來挖掘包含其事務(wù)的塊。如果它足夠接近,它將在區(qū)塊上被接受,并且將在任何其他玩家試圖贏得游戲之前給予礦工ETH。
相關(guān)事件
Governmental(一個古老的龐氏資金盤游戲)
游戲規(guī)則
你必須要發(fā)送至少1ETH到合約,然后你會被支付10%的利息。
如果“政府”(合約)在12小時內(nèi)沒有收到新的資金,最后的人獲得所有的獎池,所有人都會失去資金。
發(fā)送到合約的以太幣分配如下:5%給獎池,5%給合約擁有者,90%根據(jù)支付順序,用來支付給發(fā)送資金的人
當獎池滿了(1萬Ether),95%的資金會發(fā)送給支付者。
此攻擊原理如下
(1)部署政府在創(chuàng)建時提供至少1ether;
(2)讓其他人一起玩,以增加累積獎金;
(3)部署攻擊合同;
(4)調(diào)用攻擊者的攻擊功能,防止累積獎金被交付給合法的勝利者。
攻擊合同:作為玩家的礦工可以調(diào)整時間戳(未來的時間,使其看起來像是一分鐘過去了),以顯示玩家是最后一分鐘加入的時間(盡管現(xiàn)實中并非如此)。
觀點:
時間戳不應(yīng)該用于函數(shù)或產(chǎn)生隨機數(shù),或者說他們不應(yīng)對游戲產(chǎn)生決定性作用,或者對某個重要狀態(tài)能產(chǎn)生重要影響。開發(fā)者在編寫合約時應(yīng)注意這點。
1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會明確標注作者和來源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請轉(zhuǎn)載時務(wù)必注明文章作者和"來源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為TMT觀察網(wǎng)或?qū)⒆肪控?zé)任;
3.作者投稿可能會經(jīng)TMT觀察網(wǎng)編輯修改或補充。