當前位置:
首頁 > 最新 > DUO體系智能合約內的安全措施

DUO體系智能合約內的安全措施

在開發DUO體系的價格穩定產品時,我們時刻將100%確保用戶虛擬資產安全的想法放在心中。這篇文章里,我們想簡單聊聊我們在開發過程中遇到的安全問題以及我們是如何解決這些問題的。當代碼開源後,歡迎社區成員們了解我們的代碼並提出任何有關安全性的意見或建議。

區塊鏈層級

隨機數字生成(RNG)

我們系統中每一次管理操作後都會隨機委託新的管理員賬戶。以太坊虛擬機(EVM)並不提供生成隨機數的函數,因此最淺顯的生成隨機數的方法是通過block.timestamp,但是這樣生成的隨機數能夠被礦工修改。

更加安全的方法是使用上一個區塊的哈希值作為隨機數,因為它無法被現在的礦工更改。然而這樣做會產生一個問題:上一個區塊哈希值的公開導致用戶可以通過上一個區塊的哈希值預測下一個隨機選擇的管理地址(儘管區塊間隔只有15秒)。

因此,我們需要一個一直變化且不能被修改的方案——更巧妙地使用用戶地址名單的長度和用戶地址。地址名單的長度一直在變化並且用戶地址不能被人為更改,因此我們將以太坊的區塊哈希值和產品的用戶地址名單結合生成隨機數,最大程度地確保委託管理員賬戶的隨機性。

實際操作邏輯如下:

1) 我們取上一個區塊的哈希值,將其轉化為一個uint256(256位無符號整數)數字,稱之為a;

2) 如果用戶名單的長度n小於或等於255,我們就將a作為生成的隨機數;

3) 如果n大於255,計算b = a % n。然後將第b個用戶的地址addr(b)的哈希值轉化為一個uint256數字,即生成的隨機數。

折算前封鎖期

在我們的產品設計中,當B級通證的凈值(NAV)過高或過低時都會觸發折算,即將A級和B級通證的凈值重置為1。折算機制是DUO體系中最為關鍵的一環,因此我們必須確保折算交易在區塊鏈上已被確認。礦工總是會選擇在長塊鏈上生成後續區塊,而通常每筆交易都需要6個區塊時間來確認。

如果智能合約瞬間從交易狀態轉化到折算狀態,我們並不能保證這個狀態轉化最終會發生,這是因為狀態轉化觸發的交易不一定會被以太坊接受。

打個比方,智能合約在t0時收到了一個ETH價格並觸發了折算。如果折算立即發生在B鏈上,而且在t3時A鏈成為了最長鏈,由於折算已經發生在B鏈,而A鏈的合約仍處在交易狀態,因此在A鏈做出交易的用戶無法再回到t0時的合約狀態。為了保證合約能夠安全且平穩地轉化到折算狀態,我們設置了一個大約10個區塊時間的緩衝期折算前狀態(PreReset)。在此期間內用戶將無法進行任何交易。

智能合約層級

我們的智能合約Beethoven覆蓋了以下幾種安全問題:

上溢和下溢

Beethoven在任何計算中都使用safeMath庫。但是safeMath只能避免錯誤運算,並不能保證正確的運算能夠如期進行。因此在我們的合約中,沒有任何地方連續使用3次(以wei為單位的)乘法並且沒有小數字除以大數字的情況。我們研究過每個運算的上下界併合理調整了運算的次序防止上溢和下溢。

無效地址攻擊

Solidity無法檢查地址的有效性是短地址攻擊能成功的主要原因,而每個地址實際上都是一個字元串。在Beethoven中有多個賬戶能夠成為不同的系統管理員,這樣的設計讓我們能夠有效地解決無效地址的問題。請參考我們關於IAM的文章了解更多。

實際上,交易所有責任檢查輸入地址的長度以防止短地址攻擊。Solidity並不檢查地址的有效性,因此我們強烈呼籲每個交易所都在轉賬前做到檢查地址的有效性

DUO Network

智能合約的安全性一直是區塊鏈社區中最大的難題。作為一個成熟的去中心化應用開發團隊,DUO Network願意將編寫最安全智能合約Beethoven的經驗與愛好者們分享。不僅如此,我們也願意為社區提供智能合約審計服務,保護區塊鏈世界免受任何黑客的攻擊

作者介紹

Weitao Yang

區塊鏈大數據工程師

德勤諮詢

新加坡國立大學

Yancheng Ren

區塊鏈架構師

華為、埃森哲

南洋理工大學


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 DUONetwork 的精彩文章:

TAG:DUONetwork |