升級您的以太坊智慧合約的最佳實踐

買賣虛擬貨幣

在嘗試構建複雜和互動式智慧合約時,大多數工程團隊遲早都會遇到類似的問題。在57個區塊中,我們為加密貨幣空間建造了多種產品,並希望我們的學習能夠幫助整個生態系統繁榮。下面,我們介紹了以太坊智慧合約的程式設計模式和公共資源,幫助我們開發了我們的產品。如果您是老手,也許您會發現我們對代理委託模式的新穎應用的討論是有用的。

1.模式模式是架構設計和程式設計的最佳實踐。理解模式不僅能幫助我們理解如何處理問題,還能幫助我們理解為什麼我們需要以一種特定的方式來處理問題。它可以幫助我們更好地理解我們正在進行的平臺。下列模式在https://fravoll.github上描述。在日常開發中,大多數情行為模式
·保護檢查:確保智慧合約的行為及其輸入引數如預期的那樣。·狀態機:使合約能夠透過不同的狀態,具有不同的相應功能。·Oracle:訪問儲存在區塊鏈之外的資料。·隨機性:在區塊鏈的確定性環境中生成一個預定義的時間間隔。安全模式·訪問限制: 根據合適的標準限制進入合約功能。
·檢查效果互動:減少惡意合約的攻擊面,試圖在外部呼叫後劫持控制流。·以太安全傳輸:確保以太幣安全的從一地址轉移到另一個地址。·將與傳輸乙太網相關的風險轉移到使用者身上。·緊急停止:在緊急情況下,新增一個選項來禁用關鍵的合約功能。可升級性模式·代理委託:介紹在不破壞任何依賴關係的情況下升級智慧契合約的可能性。
·永久儲存:在智慧合約升級後保留合約儲存。經濟模式·字串等價比較:檢查兩個提供的字串的相等性。·緊密變數包裝:在儲存或裝載靜態變數時最佳化氣體消耗。·記憶體陣列構建:以一種高效的方式從合約儲存中聚合和檢索資料。使用代理委託來更新智慧合約
代理委託模式是為了解決智慧合約的可升級性問題而設計的。然而,我們在開發標記板時發現了這種模式的另一種用法。使用這種模式,在當許多相同合約的副本需要部署在區塊鏈上時,我們就能夠節省力氣。Tokenpad是一個聯合投資的平臺。辛迪加的牽頭機構可以建立資金池,為ICO籌集資金。每當他或她想要建立一個辛迪加 池時,一個領導者就會部署一個智慧合約,而智慧合約包含了所有用於工作的程式碼。在第一個Tokenpad版本中,建立一個池的成本約為400萬。這是我們將所有程式碼移動到庫後的成本,並且領導者只部署對庫呼叫的智慧合約。有了代理委託模式,我們就將一個辛迪加智慧合約的單一例項部署到區塊鏈中。當一個領導者想要建立一個辛迪加池時,我們會建立一個代理例項,並將其指向我們已經部署的唯一例項。使用代理委託模式將我們的天然氣成本降低了60%,達到了150萬美元!理解這些模式是開發高效和安全智慧合約的良好開端,但是我們不需要從頭開始來實現所有這些模式,我們可以利用框架和庫來幫助我們加速開發,並且減少錯誤。2.框架和庫框架和庫是經過良好測試和可重用的已知模式和最佳實踐的實現。在本節中,我們介紹了我們在專案中使用的一些框架和庫,以及它們提供了什麼模式和它們可能沒有解決的問題。
OpenZeppelinOpenZeppelin是一個用於安全智慧合約開發的庫。它提供了諸如ERC20和ERC721等標準的實現,您可以按原樣部署來擴充套件以滿足您的需要,以及構建定製合約和更復雜的分散系統的可靠元件。OpenZepplin提供了一些解決常見問題的庫。下面是在我們的專案中使用的一些最常見和有用的特性。Math/ SafeMath——防止溢位和不足。不要使用預設的算術運算子。當存在溢位或不足時,算術運算子不會失敗,這可能是可利用的。ownership / Ownable ——將合同建立者的地址儲存為所有者,並檢查一個呼叫地址是否存在真的所有者。所有權可以轉移到其他地址。這是訪問限制模式的應用。我們需要意識到的一個關鍵設計缺陷是:當我們將合約的所有權轉移到另一個地址時,如果該地址不是有效地址,或者不是已知的私鑰地址,我們將永遠失去對合約的控制。處理所有權轉讓的更好方法是在轉讓權結束時不立即轉讓所有權,而是允許當前所有權人在新所有權人提出所有權要求之前保持所有權。這樣,我們可以確保合約始終由一個有效的地址所擁有,並避免將所有權轉移到我們無法控制的地址。
lifecycle / Pausable ———提供緊急停止機制。在緊急情況下停止執行以減少損失。這是“實體停止”模式的一個應用。如果我們在生產智慧合約中發現了一個缺陷,我們可以暫停這些合約,以避免第三方利用這個關鍵問題,然後在修復它們。Access/rbac/rbac——訪問限制模式的一個應用。RBAC是管理訪問控制的一種更靈活的方法。我們可以有多個管理員,而Ownable只允許一個所有者對合同擁有控制權。Token/ERC20 ——這裡的檔案提供了一組實現通用ERC20代幣功能的合約。透過使用多重繼承,我們可以使用這些基本合約輕鬆地構建一個ERC20代幣。ZOS-LIBZos-lib提供了一個用於開發、部署和操作以太坊和其他所有EVM和eWASM驅動區塊鏈上的可升級智慧合約的庫。
可升級性/代理——代理實現。用低階委託呼叫另一個合約。該合約實現了代理委託模式,並修復了該模式不能解決的一個關鍵問題。在代理委託模式的文章中,代理合約中宣告瞭2個儲存變數,可以很容易地被使用委託呼叫合約定義的儲存變數覆蓋,從而導致資料損壞。該實現使用一種稱為非結構化儲存的技術來避免儲存變數被意外覆蓋。初始化——除建構函式外還提供初始化功能。由於在本例中不呼叫建構函式,因此與代理一起使用來初始化合約。3. 分割合約如果合約的規模過大,部署合約所需的變數可能超過其限制,從而導致合約部署失敗。要成功地部署大型和複雜的合約,我們需要拆分合約並使用多個事務進行部署。分割合同有兩種方法:將一個合約分成多個合約
一份大合約可以被分割成多個小合約。然後,您可以將這些合約地址傳遞給第三方來呼叫合約,在部署這些地址時將它們連線到一起。優點:·合約可以小到可以部署就行·可以只更新程式碼的一部分來升級整個應用程式或修復錯誤。這是透過部署一個新版本的合約,然後在呼叫合約中更新引用來實現的。缺點:·訊息傳送者將是呼叫合約而不是發起交易的地址,這可能是複雜的一種管理方式
將合約分成多個庫一個大的合約可以被分割成多個庫,然後使用一個合約來呼叫這些庫。優點:·庫可以儘可能小地部署·庫可以很容易地跨多個合約重用,並且只需要部署一次·沒有訊息傳送者的問題,庫的程式碼是在合約的上下文中執行的
·庫可以單獨升級缺點:

·每次部署庫的新版本時,依賴於該庫的任何合約都將需要再次部署,因為在部署庫時是靜態連結的。


更多區塊鏈資訊:www.qukuaiwang.com.cn/news

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;