DeFi中的智能合約風險

金融是風險管理的藝術。資產和運營中都存在風險。資產具有價格,價格是其內在價值和綜合風險的反映。我們不能不考慮其風險就無法評估資產。操作中的風險主要來自容易出錯和易受攻擊的人員。資產和操作風險的評估是金融的核心,無論是指基於傳統資產的傳統金融還是在本機加密貨幣資產上運行的嶄新的去中心化金融(又名DeFi)。

損害控制是關鍵

加密貨幣資產的風險包括法規更改等外部風險,以及設計缺陷和實施錯誤等內部風險。在以太坊上,本機資產是ETH,非本機資產就是我們所謂的ERC代幣,這是指符合ERC20標準及其同伴(例如ERC721和ERC777等)中任何一種的代幣。原生資產的風險低於非本地資產的風險,因為後者可能會受到以太坊客戶端錯誤和智能合約錯誤的影響。對於ERC令牌和DeFi,智能合約中的錯誤是最受關注的,因為作為系統的DeFi是一個複雜的網路,通過不同地方的不同開發人員創建的無窮智能合約將它們編織在一起。我們將由智能合約錯誤引起的風險稱為智能合約風險。

許多研究工作都中心化在智能合約的漏洞上,我們發現了許多防禦方法。如果您有興趣,這是一個很好的調查。但是,眾所周知,消除任何不平凡的智能合約(或任何程序)中的錯誤是不可能的。我們生活在一個充滿通信錯誤和隨機性的世界中,它們在每個步驟中都會導致「失真」:我們無法將思想轉變為精確的規範,同樣,我們也無法將規範轉換為完美的實現。

如果這是殘酷的現實,我們不僅應在我們的加密貨幣資產實現中考慮主動防禦和被動防禦,還應採用破壞控制方法,以在發生某些不良情況時將損失降到最低,以避免將蝴蝶變成黑天鵝。智能合約可以採用多種設計模式來進行損害控制,其中最重要的一種(我認為)是應用程序狀態的去中心化,因為應用程序狀態的中心化會放大由智能合約錯誤引起的破壞。讓我更詳細地解釋我的意思。

ERC代幣的風險

ERC令牌標準在界面上有所不同,但具有一些共同的功能。ERC令牌的基本模式是使用令牌合約來管理令牌分類帳,並且用戶與令牌合約進行交互以發行,轉移或刻錄令牌。令牌分類帳的所有記錄都存儲在令牌合約中,而合約本身只是以太坊上的一個帳戶。

例如,假設有一個ERC令牌「杯子」,愛麗絲有100個杯子,鮑勃有50個杯子。令牌分類帳是位於地址/帳戶0x1234的以太坊智能合約。該令牌合約0x1234維護一個內部資料庫,該數據股票儲諸如「愛麗絲有100杯」和「鮑勃有50杯」之類的記錄。當愛麗絲想將30杯轉讓給鮑勃時,她向合約0x1234發送了一條簽名的消息,內容為「請轉讓30杯給鮑勃」,然後合約0x1234將驗證消息確實來自愛麗絲並修改其內部資料庫,更新「愛麗絲有70杯」和「鮑勃有80杯」的相關記錄。

這裡的問題是所有邏輯和狀態都保留在單個合約0x1234中。愛麗絲(Alice)和鮑勃(Bob)無法直接訪問他們自己的記錄,因為這些記錄由合約0x1234保管。該令牌的所有用戶都與該合約進行交互,並且管理其令牌的唯一方法是通過向合約0x1234發送消息。

換句話說,令牌合約是一個中心點。任何系統中的中心點也是最有利可圖的攻擊點。中心點的任何問題都會影響所有用戶,因為所有令牌/記錄都由中心保留,並且每個人都必須與其交互。例如,由於整數溢出導致的「 transferFlaw 」 /「 allowAnyone 」漏洞或由謹慎授權導致的「 ItchySwap 」漏洞,攻擊者可以在所有者與合約沒有任何交互的情況下竊取他人的令牌。藉助「 ownerAnyone 」漏洞,攻擊者可以控制令牌合約來鎖定每個人的令牌。在所有這些示例中,一旦令牌合約被打破,每個人都會遇到麻煩。

ERC令牌是由令牌合約持有的,而不是由單個用戶持有的,這與以太坊的以太坊等本地令牌非常不同。ETH餘額的記錄不是由任何智能合約存儲的,而是由用戶直接控制的。每個ETH所有者都有自己的帳戶和餘額記錄。例如,如果在以太坊區塊鏈上,愛麗絲有100 ETH,鮑勃有50 ETH,那麼愛麗絲在自己的賬戶中記錄為「 balance = 100」,鮑勃在自己的賬戶中記錄為「 balance = 50」。愛麗絲的餘額只能隨著簽名的存在而減少,而鮑勃的帳戶也是如此。ETH所有權記錄去中心化在多個帳戶中,而不是中心化在單個帳戶中。只要他們的私鑰是安全的,沒人能從他們那裡竊取以太幣。相反,

不同的固有風險使ERC代幣和以太幣成為兩種不同的資產類別。在去中心化網路上運行的智能合約與去中心化網路不同。中心化問題是由ERC令牌再次在應用程序層上引入的,放大了任何智能合約錯誤的潛在損害,但是不幸的是,我們知道人類總是會犯錯誤。總是會有bug。網路/共識層的去中心化不能解決應用層上的中心化問題。

如何卸下風險放大器

中心化的觀點出現在ERC代幣中,因為它們的狀態不是以太坊編程模型中的一等公民。狀態是代碼的附件,但不能直接引用和比較。將具有相同驗證規則(例如,相同令牌的記錄)的狀態放入同一合約是很自然的,但是,此合約隨後成為中心化的要點。這是以太坊編程模型的結果。

在CKB上,由於國家是一等公民,因此模式是相反的。狀態是用戶直接玩耍的對象,代碼是狀態的附件。我們可以自然地使用相同的驗證規則對狀態進行比較和分組,即使這些狀態由不同的用戶直接持有也是如此。

我們將CKB上的非原生令牌稱為「用戶定義令牌」或UDT。對於給定的UDT,資產定義(代碼)和資產記錄(狀態)是分開的,並且不同用戶(地址)的記錄也是分開的。資產定義描述了令牌的邏輯,例如「發行上限為1M」或「鮑勃可以發行新令牌」,記錄是諸如「愛麗絲有100個令牌」之類的信息。資產定義是由令牌開發者創建並存儲在開發者擁有的單元(資產定義單元)中的合約,而記錄則保留在用戶的單元中,並且所有記錄均使用相同的「類型」腳本。每個用戶使用他/她自己的單元格來存儲他/她自己的令牌記錄。這些令牌記錄共享資產定義單元定義的相同驗證規則。通過這種結構,記錄以去中心化的方式存儲。

0D9QqUDb9hIopu6sc

如上圖所示,Alice的令牌存儲在Alice自己的單元中,並受她自己的鎖定腳本保護,默認情況下為Secp256k1。即使資產定義中存在錯誤,攻擊者也無法修改Alice的記錄,因為這樣做需要Alice的私鑰。由於令牌直接由愛麗絲持有,因此攻擊者無法繞開愛麗絲的鎖。通過去中心化令牌的狀態,可以控制資產定義中錯誤的破壞。

影響每個人的錯誤的可能性仍然存在:例如,資產定義中可能存在一個錯誤,該錯誤允許任何人發行比預期更多的令牌。UDT的好處是,首先,消除了大部分錯誤;其次,資產定義單元受到鎖的保護,鎖自然可以是令牌發行身份驗證邏輯的一部分。使用協議提供的身份驗證機制總是很容易的。授權與業務邏輯的這種分離是一種良好的工程實踐,並且是CKB中的默認設置。UDT比ERC令牌更去中心化,因此UDT的智能合約風險低於ERC令牌,但仍高於原生令牌。

如果你有興趣在UDT,有很多種 的討論Nervos通話

安全的Nervos DAO

應用程序狀態的去中心化也可以幫助DeFi應用程序設計。該Nervos DAO是CKB第一DEFI應用。這是一個智能合約,用戶可以與CKB上的任何智能合約以相同的方式進行交互。Nervos DAO的一項功能是為CKByte持有人提供一種稀釋對策。通過在Nervos DAO中存入資金,持有人可以獲得成比例的次級獎勵,這保證了其持有的資產僅受到硬性上限首次發行的影響,就像比特幣一樣。在撰寫本文時,DAO中已經存儲了超過10億個CKByte,並且數量還在增加,這對於攻擊者來說是一個非常有吸引力的合約。我們應該擔心嗎?

可能不是那麼多,因為Nervos DAO中鎖定的CKByte不在一個智能合約中合併在一起,而是由不同的用戶持有當用戶要向Nervos DAO進行存款時,他/她通過選擇單元格(CKBytes的UTXO)來構造存款交易,並將其類型腳本引用設置為0x82d76d1b75fe2fd9a27dfbaa65a039221a380d76c926f378d3f81cf3e7e13f2e,該腳本指向Nervos DAO。這些單元格的鎖定腳本保持不變。由於Nervos DAO類型的腳本與用戶的鎖定腳本是分離的,因此,攻擊者永遠無法在未經用戶許可的情況下使用那些存放的CKByte。

要撤回已存入的CKByte,必須提供相應鎖定腳本的見證人(簽名)。此驗證是由CKB網路而不是任何智能合約來保證的,沒有解決方法。Nervos DAO腳本可以確保提款時的補償計算正確,而不是持有資金。

對DeFi的影響

很難定量分析智能合約風險對DeFi的影響,但是我們可以從Nexus Mutual提供的保險產品中獲得一些線索,該產品是「保險的去中心化替代品」。其第一個產品SmartContractCover允許用戶購買任何智能合約的保險,因此,如果智能合約被黑客入侵,他/她將獲得賠償。SmartContractCover的權利金由市場決定,與承保期和承保金額成正比。根據這篇文章,如果您在Nuo上進行1000天DAI的90天保險,將花費6.41 DAI;而在Uniswap中進行365天1 ETH的保險,您將花費0.013 ETH。根據這些數字,我們可以得出估計的年度智能合約風險成本約為2%。

2%的成本是由智能合約風險引起的市場效率低下,因此,改進智能合約編程模型非常重要。不同的編程模型可以降低智能合約風險,並為我們帶來更高效的DeFi市場。

感謝Haseeb QureshiCipher WangMatt Quinn和Christopher Heymann對這篇文章的反饋。

提示:投資有風險,入市需謹慎,本資訊不作為投資理財建議。請理性投資,切實提高風險防範意識;如有發現的違法犯罪線索,可積極向有關部門舉報反映。
你可能還喜歡