智能合約簡介

在本文中,我們將了解什麼是智慧合約,它們是什麼,我們將熟悉不同的智慧合約平台及其功能,並討論它們如何運作以及它們可以帶來哪些優勢。 對於不太熟悉智能合約主題但想要進一步了解它的讀者來說,本資料將非常有用。

常規合約 vs 定期合約智能合約

在深入研究細節之前,我們先舉一個例子,了解紙本合約和數位化智慧合約之間的差異。

智能合約簡介

在智能合約出現之前這是如何運作的? 想像一下,有一群人想要建立一定的價值分配規則和條件,以及一定的機制來保證這種分配按照給定的規則和條件實施。 然後他們會聚在一起,起草一份文件,在上面寫下他們的身份詳細資訊、條款、所涉及的價值觀、日期並簽署。 該合約還得到了受信任方(例如公證人)的認證。 進一步地,這些人帶著這樣一份紙質合約走向了不同的方向,開始執行一些可能與合約本身不符的行為,即他們做了一件事,但在紙面上證明他們應該做某事完全不同。 以及如何擺脫這種局面? 事實上,團體成員之一需要拿著這張紙,拿出一些證據,告上法庭,實現合約與實際行動的相符。 很多時候,該合約很難得到公平的履行,從而導致不愉快的後果。

關於智能合約可以說些什麼? 它們結合了編寫合約條款的可能性和嚴格執行的機制。 如果條件已經設定並且相應的交易或請求已經簽署,那麼一旦該請求或交易被接受,就不再可能更改條件或影響其實施。

有一個驗證器或整個網絡,以及一個資料庫,該資料庫儲存按嚴格時間順序提交執行的所有智能合約。 同樣重要的是,該資料庫必須包含執行智能合約的所有觸發條件。 此外,還必須考慮合約中所述的分配的價值本身。 如果這適用於某些數位貨幣,那麼該資料庫應該考慮到它。

換句話說,智慧合約驗證器必須能夠存取智慧合約運作的所有資料。 例如,應該使用單一資料庫來同時記錄數位貨幣、用戶餘額、用戶交易和時間戳記。 那麼,在智能合約中,條件可能是用戶某種貨幣的餘額,某個時間的到來,或者某筆交易已經進行,僅此而已。

智能合約的定義

一般來說,這個術語本身是由研究員 Nick Szabo 創造的,並於 1994 年首次使用,並於 1997 年在一篇描述智能合約概念的文章中記錄下來。

智慧合約意味著執行一些價值分配的自動化,這只能取決於事先預定的條件。 從最簡單的形式來看,它看起來就像是由某些當事方簽署的具有嚴格定義條款的合約。

智能合約旨在最大限度地減少對第三方的信任。 有時,一切所依賴的決策中心被完全排除在外。 此外,此類合約更容易審計。 這是此類系統的一些設計特徵的結果,但大多數情況下,我們將智慧合約理解為去中心化環境以及允許任何人分析資料庫並對合約執行進行全面審計的功能。 這可以確保防止追溯資料更改,從而導致合約本身的履行發生變化。 創建和啟動智慧合約時大多數流程的數位化通常會簡化其實施的技術和成本。

一個簡單的範例 - 託管服務

讓我們來看一個非常簡單的例子。 它將幫助您更深入地了解智能合約的功能,以及更好地了解應該在哪些情況下使用它們。

智能合約簡介

它也可以使用比特幣來實現,儘管目前比特幣還很難被稱為成熟的智慧合約平台。 所以,我們有一些買家,我們有一個網上商店。 一位顧客想從這家商店購買一台顯示器。 最簡單的情況是,買家完成並發送付款,在線商店接受、確認,然後發貨。 然而,在這種情況下,需要極大的信任 - 買家必須信任線上商店支付顯示器的全部費用。 由於網上商店在買家眼中的聲譽可能較低,因此存在由於某種原因,在接受付款後商店將拒絕服務並且不會將貨物發送給買家的風險。 因此,買家會問這個問題(相應地,線上商店也會問這個問題)在這種情況下可以應用什麼,以便最大限度地減少此類風險並使此類交易更加可靠。

就比特幣而言,可以允許買方和賣方獨立選擇調解人。 有很多人參與解決有爭議的問題。 我們的參與者可以從一份調解員總名單中選擇他們信任的調解員。 他們一起創建了一個 2 of 3 多重簽名地址,其中有三個密鑰,並且需要任意兩個密鑰的兩個簽名才能從該地址花費硬幣。 一把鑰匙屬於買家,第二把鑰匙屬於線上商店,第三把鑰匙屬於調解員。 買方將向這樣的多重簽名地址發送支付監視器所需的金額。 現在,當賣家看到資金在依賴他的多重簽名地址被凍結一段時間時,他可以安全地透過郵件發送監視器。

接下來,買家收到包裹,檢查貨物並做出最終購買決定。 他可能完全同意所提供的服務並用他的金鑰簽署交易,將硬幣從多重簽名地址轉移給賣家,或者他可能對某些事情不滿意。 在第二種情況下,他聯繫調解人來整理一項替代交易,以不​​同的方式分配這些代幣。

假設顯示器到達時有一點刮痕,並且套件不包括用於連接電腦的電纜,儘管在線商店網站說套件中應包含電纜。 然後,買方收集必要的證據,向調解員證明他在這種情況下被欺騙了:他拍攝了網站的屏幕截圖,拍攝了郵件收據的照片,拍攝了顯示器上划痕的照片,並顯示封條是斷了,電纜被拔了出來。 反過來,線上商店收集證據並將其傳輸給調解員。

調解員有興趣同時滿足買家的憤慨和線上商店的利益(稍後會清楚原因)。 它構成了一項交易,其中來自多重簽名地址的代幣將按一定比例在買家、線上商店和調解人之間花費,因為他自己拿走一部分作為其工作的獎勵。 假設總金額的 90% 歸賣方,5% 歸中介,5% 賠償給買方。 中介者用他的金鑰簽署了這筆交易,但它還不能應用,因為它需要兩個簽名,但只有一個是值得的。 它將這樣的交易發送給買方和賣方。 如果至少其中一個人對重新分配硬幣的這個選項感到滿意,那麼交易將被預先簽名並分配到網路。 為了驗證這一點,交易雙方之一同意調解人的選擇就足夠了。

最初選擇一名調解員非常重要,這樣雙方參與者都信任他。 在這種情況下,他會獨立於一方或另一方的利益而行動,並客觀地評估局勢。 如果調解者沒有提供一種可以滿足至少一個參與者的硬幣分配選項,那麼,在共同同意的情況下,買方和線上商店都可以透過放置兩個簽名將硬幣發送到新的多重簽名地址。 新的多重簽名地址將由不同的調解人編譯,他們可能在這方面更有能力並提供更好的選擇。

以宿舍和冰箱為例

讓我們來看一個更複雜的範例,它更明確地顯示智能合約的功能。

智能合約簡介

假設有三個人最近搬進了同一個宿舍。 他們三人有興趣為他們的房間購買一台可以一起使用的冰箱。 其中一人自願籌集購買冰箱所需的金額並與賣家談判。 但他們才剛認識不久,彼此之間還沒有足夠的信任。 顯然,其中兩個人給第三個錢是在冒險。 此外,他們需要在選擇賣家方面達成一致。

他們可以使用託管服務,即選擇一名調解員來監控交易的執行並解決出現爭議的問題。 然後,在同意後,他們起草一份智能合約並在其中規定某些條件。

第一個條件是,在某個時間之前,例如一週內,對應的智慧合約帳戶必須從特定地址收到三筆特定金額的付款。 如果這種情況沒有發生,智能合約將停止執行並將代幣退還給所有參與者。 如果滿足條件,則設定賣方和調解員識別碼的值,並檢查所有參與者都同意賣方和調解員的選擇的條件。 當滿足所有條件時,資金將被轉移到指定地址。 這種方法可以保護參與者免受任何方面的欺詐,並且通常消除信任的需要。

我們在這個例子中看到了一個原則,即這種逐步設定參數來滿足每個條件的能力允許您創建任何複雜性和嵌套級別深度的系統。 另外,您可以先在智能合約中定義第一個條件,只有滿足後才可以設定下一個條件的參數。 換句話說,條件是正式編寫的,並且可以在其操作期間設定它的參數。

智能合約的分類

對於分類,您可以設定不同組的標準。 然而,就技術發展而言,其中四個是相關的。

智能合約可以根據其執行環境來區分,可以是集中式的,也可以是分散式的。 在去中心化的情況下,我們在執行智能合約時具有更大的獨立性和容錯能力。

它們還可以透過設定和滿足條件的過程來區分:它們可以自由編程、限製或預先定義,即嚴格類型化。 當智慧合約平台上只有4個特定智能合約時,可以任意設定它們的參數。 因此,設定它們要簡單得多:我們從清單中選擇一個合約並傳遞參數。

從啟動方式來看,有自動化智能合約,即當某些條件發生時,自動執行,也有合約中指定了條件,但平台不會自動檢查其履行情況;為此,它們需要單獨啟動。

此外,智能合約的隱私程度也各不相同。 它們可以完全公開、部分或完全保密。 後者意味著第三方觀察者看不到智能合約的條款。 然而,隱私主題非常廣泛,最好將其與當前文章分開考慮。

以下我們將仔細研究前三個標準,以便更清楚地理解當前主題。

按運行時劃分的智能合約

智能合約簡介

根據執行環境,智慧合約平台分為中心化和去中心化。 在集中式數位合約的情況下,使用單一服務,其中只有一個驗證器,並且可能有備份和復原服務,該服務也是集中管理的。 有一個資料庫儲存所有必要的資訊來設定智慧合約的條款並分配該服務資料庫中考慮的價值。 這種集中式服務有一個客戶,該客戶根據某些請求設定條件並使用此類合約。 由於平台的中心化性質,身份驗證機制可能不如加密貨幣安全。

我們可以以行動通訊供應商(不同的行動電信商)為例。 假設某個運營商在其伺服器上保存了集中的流量記錄,這些流量可以以不同的格式傳輸,例如:以語音呼叫、短信傳輸、移動互聯網流量的形式,並且根據不同的標準,也保存記錄用戶餘額上的資金。 因此,行動通訊供應商可以起草合約來對所提供的服務及其不同條件的付款進行核算。 在這種情況下,很容易設定「向某某號碼發送帶有某某代碼的短信,您將收到某某流量分配條件」之類的條件。

再舉一個例子:傳統銀行具有網路銀行的擴充功能,合約非常簡單,例如定期付款、收款自動轉換、指定帳戶自動扣息等。

如果我們談論的是具有去中心化執行環境的智慧合約,那麼我們就有一組驗證器。 理想情況下,任何人都可以成為驗證者。 由於資料庫同步協議和共識,我們擁有一些通用資料庫,現在將儲存具有嚴格描述的合約的所有交易,而不是一些條件查詢,其格式經常變化,並且沒有開放規範。 在這裡,交易將包含根據嚴格規範執行合約的指令。 該規範是開放的,因此平台用戶可以自己審核和驗證智能合約。 在這裡我們看到,去中心化平台在獨立性和容錯性方面優於中心化平台,但其設計和維護要複雜得多。

透過設定和滿足條件的方法的智能合約

現在讓我們仔細看看智能合約在設定和滿足條件的方式上有何不同。 在這裡,我們將注意力轉向可隨機編程且圖靈完備的智能合約。 圖靈完備的智能合約允許您設​​定幾乎任何演算法作為合約執行的條件:寫入週期、一些計算機率的函數等等 - 甚至是您自己的電子簽名演算法。 在這種情況下,我們指的是真正任意的邏輯書寫。

也有任意的智能合約,但不是圖靈完備的。 這包括帶有自己腳本的比特幣和萊特幣。 這意味著您只能以任何順序使用某些操作,但您不能再編寫循環和自己的演算法。

此外,還有實現預先定義智能合約的智能合約平台。 其中包括比特股和 Steemit。 Bitshares 擁有一系列用於交易、帳戶管理、平臺本身及其參數管理的智慧合約。 Steemit 是一個類似的平台,但它不再像 Bitshares 那樣專注於發行代幣和交易,而是專注於博客,即以去中心化的方式存儲和處理內容。

任意圖靈完備合約包括以太坊平台和仍在開發中的RootStock。 因此,以下我們將詳細介紹以太坊智能合約平台。

按啟動方式劃分的智能合約

根據啟動方式,智慧合約也可以分為至少兩類:自動和手動(非自動化)。 自動化的特點是,在給定所有已知參數和條件的情況下,智能合約完全自動執行,也就是說,它不需要發送任何額外的交易,也不需要在每次後續執行時花費額外的佣金。 平臺本身擁有所有計算智能合約如何完成的數據。 那裡的邏輯不是任意的,而是預先決定的,所有這一切都是可以預測的。 也就是說,您可以提前估計執行智慧合約的複雜性,為其使用某種恆定的佣金,並且其實施的所有流程都更加高效。

對於自由程式設計的智慧合約,執行不是自動化的。 要啟動這樣的智能合約,幾乎每一步都需要創建一個新交易,該交易將調用下一個執行階段或下一個智能合約方法,支付適當的佣金並等待交易被確認。 執行可能成功也可能失敗,因為智慧合約程式碼是任意的,可能會出現一些不可預測的時刻,例如無限循環、缺少某些參數和參數、未處理的異常等。

以太坊帳戶

以太坊帳戶類型

讓我們看看以太坊平台上可以有哪些類型的帳戶。 這裡只有兩種類型的帳戶,沒有其他選項。 第一種稱為使用者帳戶,第二種稱為合約帳戶。 讓我們弄清楚它們有何不同。

使用者帳戶僅由電子簽署的個人金鑰控制。 帳戶擁有者使用 ECDSA(橢圓曲線數位簽章演算法)演算法產生自己的電子簽名金鑰對。 只有使用此金鑰簽署的交易才能變更此帳戶的狀態。

為智能合約帳戶提供了單獨的邏輯。 它只能由預先定義的軟體程式碼控制,該程式碼完全決定智慧合約的行為:在某些情況下如何管理其代幣,在哪個用戶的倡議下以及在什麼附加條件下將分發這些代幣。 如果開發人員在程式碼中沒有提供某些要點,則可能會出現問題。 例如,智能合約可能會收到某種狀態,在該狀態下,它不接受任何用戶發起進一步執行。 在這種情況下,硬幣實際上會被凍結,因為智能合約沒有規定退出這種狀態。

如何在以太坊上建立帳戶

對於使用者帳戶,擁有者使用 ECDSA 獨立產生金鑰對。 需要注意的是,以太坊使用與比特幣完全相同的演算法和完全相同的橢圓曲線進行電子簽名,但地址的計算方式略有不同。 這裡不再像比特幣那樣使用雙重哈希的結果,而是透過 Keccak 函數提供長度為 256 位元的單次哈希。 從結果值中截掉最低有效位,即輸出雜湊值的最低有效 160 位。 結果,我們得到了以太坊的一個地址。 事實上,它佔用了20個位元組。

請注意,以太坊中的帳戶標識符以十六進制編碼,不應用校驗和,這與比特幣和許多其他系統不同,在比特幣和許多其他系統中,地址以58 基數系統編碼,並新增了校驗和。 這意味著在以太坊中使用帳戶標識符時需要小心:即使標識符中的一個錯誤也肯定會導致代幣遺失。

有一個重要的功能,那就是當他接受第一筆收款時,就會建立一個通用資料庫層級的使用者帳戶。

建立智慧合約帳戶採用完全不同的方法。 最初,其中一個使用者編寫智慧合約的原始程式碼,然後程式碼透過以太坊平台專用的編譯器,取得自己的以太坊虛擬機的字節碼。 產生的字節碼被放置在交易的一個特殊欄位中。 它代表發起者的帳戶進行認證。 接下來,該交易在整個網路中傳播並放置智能合約代碼。 交易的佣金以及相應的合約執行的佣金將從發起人的帳戶餘額中扣除。

每個智能合約都必須包含其自己的構造函數(該合約的構造函數)。 它可能是空的,也可能有內容。 建構函數執行後,會建立一個智慧合約帳戶標識符,使用它可以傳送幣、呼叫某些智能合約方法等。

以太坊交易結構

為了更清楚地說明這一點,我們將開始研究以太坊交易的結構和範例智慧合約程式碼。

智能合約簡介

以太坊交易由多個欄位組成。 其中第一個隨機數字是交易的特定序號,相對於分配該交易的帳戶本身且是其作者。 為了區分雙重交易,即排除同一交易被接受兩次的情況,這是必要的。 透過使用標識符,每筆交易都有一個唯一的哈希值。

接下來是一個像這樣的字段 汽油價格。 這表示以太坊基礎貨幣轉換為gas的價格,用於支付智慧合約的執行和虛擬機器資源的分配。 這是什麼意思?

在比特幣中,費用直接由基礎貨幣——比特幣本身支付。 這要歸功於一種簡單的電腦制:我們嚴格按照交易中包含的資料量付費。 在以太坊中情況更加複雜,因為很難依賴交易資料量。 這裡,事務還可以包含將在虛擬機器上執行的程式碼,並且虛擬機器的每個操作可以具有不同的複雜度。 還有一些為變數分配記憶體的操作。 它們有自己的複雜性,每項操作的費用取決於其複雜性。

每次操作的天然氣當量成本將保持不變。 專門引入它是為了確定每個操作的恆定成本。 根據網路的負載情況,Gas價格會發生變化,即基礎貨幣轉換為該輔助單位以支付佣金的係數。

以太坊中的交易還有一個特點:它包含的用於在虛擬機器中執行的字節碼將被執行,直到它完成並產生某種結果(成功或失敗),或者直到分配的一定數量的硬幣用完以支付佣金。 為了避免某些錯誤時,發送者帳戶中的所有硬幣都被花在佣金上的情況(例如,在虛擬機中啟動某種永恆循環),存在以下字段 - 啟動氣體 (通常稱為gas limit) - 它決定了發送者願意花費來完成某筆交易的最大代幣數量。

下一個欄位稱為 目的地址。 這包括代幣接收者的地址或將調用其方法的特定智能合約的地址。 之後就是田野 ,其中輸入發送到目標地址的硬幣數量。

接下來是一個有趣的領域,稱為 數據,整個結構適合的地方。 這不是一個單獨的字段,而是定義虛擬機器程式碼的整體結構。 您可以在此處放置任意資料 - 對此有單獨的規則。

最後一個欄位稱為 一步對社區作出貢獻,最終決定推出別具意義。 它同時包含該交易作者的電子簽名和用於驗證該簽名的公鑰。 從公鑰中您可以獲得該交易發送方的帳戶標識符,即在系統本身中唯一標識發送方的帳戶。 我們找到了交易結構的主要內容。

Solidity 的智能合約程式碼範例

現在讓我們用一個例子來仔細看看最簡單的智能合約。

contract Bank {
    address owner;
    mapping(address => uint) balances;
    
    function Bank() {
        owner = msg.sender;
    }

    function deposit() public payable {
        balances[msg.sender] += msg.value;
    }

    function withdraw(uint amount) public {
        if (balances[msg.sender] >= amount) {
            balances[msg.sender] -= amount;
            msg.sender.transfer(amount);
        }
    }

    function getMyBalance() public view returns(uint) {
        return balances[msg.sender];
    }

    function kill() public {
        if (msg.sender == owner)
            selfdestruct(owner);
    }
}

上面是一個簡化的源代碼,可以保存用戶的幣並按需歸還。

因此,有一個銀行智能合約執行以下功能:它在其餘額上累積代幣,也就是說,當交易被確認並放置這樣的智能合約時,會創建一個新帳戶,其餘額中可以包含代幣; 它記住用戶以及他們之間的硬幣分配; 有多種餘額管理方式,可儲值、提現、查看用戶餘額。

讓我們瀏覽一下原始程式碼的每一行。 該合約具有恆定字段。 其中之一,類型為地址,稱為所有者。 這裡合約會記住創建此智能合約的用戶的地址。 此外,還有一個動態結構來維護使用者位址和餘額之間的對應關係。

接下來是 Bank 方法 - 它與合約同名。 因此,這是它的建構函數。 這裡的所有者變數被分配了將該智能合約放置在網路上的人的位址。 這是此構造函數中發生的唯一事情。 也就是說,本例中的 msg 正是與包含該合約完整程式碼的交易一起傳送到虛擬機器的資料。 因此,msg.sender 是託管此程式碼的交易的作者。 他將成為智能合約的所有者。

充值方式可讓您透過交易將一定數量的幣轉入合約帳戶。 在這種情況下,接收這些代幣的智慧合約將它們保留在其資產負債表上,但在餘額結構中記錄了這些代幣的確切發送者,以便知道它們屬於誰。

下一個方法稱為提款,它有一個參數 - 有人想要從這家銀行提取的硬幣數量。 這會檢查調用此方法發送硬幣的用戶的餘額中是否有足夠的硬幣。 如果有足夠的硬幣,那麼智能合約本身會將該數量的硬幣返回給呼叫者。

接下來是查看用戶當前餘額的方法。 無論誰呼叫此方法,都將用於檢索智能合約中的此餘額。 值得注意的是,這個方法的修飾符是view。 這意味著該方法本身不會以任何方式更改其類別的變量,它實際上只是一個讀取方法。 無需建立單獨的交易來呼叫此方法,無需支付任何費用,並且所有計算均在本地執行,之後用戶會收到結果。

需要kill方法來銷毀智能合約的狀態。 這裡也額外檢查了該方法的呼叫者是否是該合約的擁有者。 如果是這樣,那麼合約就會自毀,並且銷毀函數採用一個參數 - 合約將把其餘額中剩餘的所有代幣發送到的帳戶識別碼。 在這種情況下,剩餘的硬幣將自動轉到合約所有者的地址。

以太坊網路上的全節點如何運作?

讓我們示意性地看一下這樣的智能合約如何在以太坊平台上執行以及完整的網路節點如何運作。

智能合約簡介

以太坊網路上的完整節點必須至少有四個模組。
對於任何去中心化協定來說,第一個是 P2P 網路模組 - 用於網路連接並與其他節點一起工作的模組,其中交換區塊、交易和有關其他節點的資訊。 這是所有去中心化加密貨幣的傳統元件。

接下來,我們有一個用於儲存區塊鏈資料、處理、選擇優先分支、附加區塊、取消連結區塊、驗證這些區塊等的模組。

第三個模組稱為 EVM(以太坊虛擬機器)-這是一個從以太坊交易接收字節碼的虛擬機器。 此模組會取得特定帳戶的目前狀態,並根據接收的字節碼變更其狀態。 每個網路節點上的虛擬機器版本必須相同。 每個以太坊節點上發生的計算完全相同,但它們以非同步方式發生:有人先檢查並接受該交易,即執行其中包含的所有程式碼,然後有人執行。 相應地,當一筆交易被創建時,它被分發到網絡,節點接受它,並在驗證時,與比特幣中執行Bitcoin Script的方式相同,這裡執行虛擬機的字節碼。

如果一筆交易中包含的所有代碼都已執行,並且已產生並保存某個帳戶的新狀態,直到明確該交易是否已被應用,則該交易被視為已驗證。 如果應用了事務,則該狀態不僅被視為已完成,而且被視為當前狀態。 有一個資料庫儲存每個網路節點的每個帳戶的狀態。 由於所有計算都以相同的方式發生並且區塊鏈的狀態相同,因此每個節點包含所有帳戶狀態的資料庫也將是相同的。

智能合約的神話與局限性

至於類似以太坊的智慧合約平台存在的限制,可以列舉如下:

  • 代碼執行;
  • 分配記憶體;
  • 區塊鏈數據;
  • 發送付款;
  • 創建新合約;
  • 調用其他合約。

讓我們看看對虛擬機施加的限制,並相應地消除有關智能合約的一些誤解。 在虛擬機器上,不僅可以在以太坊上,而且可以在類似的平台上,您可以執行真正任意的邏輯操作,即編寫程式碼,它將在那裡執行,您可以另外分配記憶體。 但是,費用是為每個操作和分配的每個附加記憶體單元單獨支付的。

接下來,虛擬機器可以從區塊鏈資料庫中讀取數據,以便使用該數據作為觸發器來執行一個或另一個智慧合約邏輯。 虛擬機器可以建立和傳送交易,它可以建立新合約並呼叫網路上已發布的其他智慧合約的方法:現有的、可用的等。

最常見的誤解是,以太坊智能合約可以使用來自任何網路資源的資訊。 事實是,虛擬機器無法向互聯網上的某些外部資訊資源發送網路請求,也就是說,不可能編寫一個智能合約來根據外部天氣等因素在用戶之間分配價值,或者誰贏得了一些冠軍,或者根據外界發生的其他事件,因為有關這些事件的資訊根本不存在於平臺本身的資料庫中。 也就是說,區塊鏈上沒有任何關於此的資訊。 如果它沒有出現在那裡,則虛擬機器無法使用該資料作為觸發器。

以太坊的缺點

讓我們列出主要的。 第一個缺點是以太坊中的智慧合約的設計、開發和測試存在一些困難(以太坊使用Solidity語言編寫智慧合約)。 事實上,實踐表明,所有錯誤中很大一部分都屬於人為因素。 對於已經編寫的具有平均或更高複雜性的以太坊智能合約來說,這實際上是正確的。 如果說簡單的智能合約出錯的機率很小,那麼複雜的智能合約中經常會出現錯誤,導致資金被盜、凍結、智能合約被意外破壞等。這樣的案例已經很多了。已知。

第二個缺點是虛擬機器本身並不完美,因為它也是人寫的。 它可以執行任意命令,這其中存在漏洞:可以以某種方式配置多個命令,從而導致事先無法預見的後果。 這是一個非常複雜的領域,但已經有幾項研究表明,目前版本的以太坊網路中存在這些漏洞,它們可能導致許多智慧合約的失敗。

又一個很大的困難,也算是一個劣勢。 它在於,你可以從實務或技術上得出這樣的結論:如果你編譯了將在虛擬機器上執行的合約的字節碼,你可以確定一些特定的操作順序。 當一起執行時,這些操作將極大地增加虛擬機器的負載,並且與執行這些操作所支付的費用不成比例地減慢虛擬機器的速度。

過去,以太坊的發展已經有一段時間,許多詳細了解虛擬機器操作的傢伙都發現了這樣的漏洞。 事實上,交易只需支付很少的費用,但實際上會減慢整個網路的速度。 這些問題很難解決,因為首先需要確定它們,其次需要調整執行這些操作的價格,第三需要進行硬分叉,這意味著將所有網路節點更新為新版本軟體,然後同時啟動這些變更。

至於以太坊,已經進行了大量的研究,獲得了很多實踐經驗:積極的和消極的,但仍然存在需要以某種方式處理的困難和漏洞。

至此,文章的主題部分已經完成,讓我們繼續討論經常出現的問題。

Частозадаваемыевопросы

— 如果現有智能合約的所有各方都想要更改條款,他們可以使用多重簽名取消該智能合約,然後創建一個具有更新執行條款的新智能合約嗎?

這裡的答案是雙重的。 為什麼? 因為一方面,智能合約被定義一次,不再意味著任何更改,另一方面,它可以具有預先編寫的邏輯,提供某些條件的完全或部分更改。 也就是說,如果您想更改智能合約中的某些內容,那麼您必須規定可以更新這些條件的條件。 因此,只有以這種審慎的方式,才能組織續約。 但在這裡,您也可能會遇到麻煩:犯一些錯誤並獲得相應的漏洞。 因此,這樣的東西需要非常詳細、仔細地設計和測試。

— 如果調解員與參與者之一達成協議:託管或智能合約怎麼辦? 智能合約中是否需要中介者?

智能合約不需要調解人。 它可能不存在。 如果在託管的情況下,調解人與其中一方合謀,那麼是的,該計劃將急劇失去其所有價值。 因此,調解員的選擇方式應使其同時受到參與該過程的所有各方的信任。 因此,您根本不會將代幣轉移到您不信任的中介的多重簽名地址。

— 是否可以透過以太坊交易將許多不同的代幣從您的地址轉移到不同的目標地址,例如交易這些代幣的交易所地址?

這是一個很好的問題,它涉及以太坊交易模型以及它與比特幣模型的不同之處。 差異是根本性的。 如果在以太坊交易模型中,您只是轉移硬幣,那麼它們只是從一個地址轉移到另一個地址,沒有任何變化,只是您指定的特定金額。 換句話說,這不是未花費輸出(UTXO)的模型,而是帳戶和相應餘額的模型。 理論上,如果您編寫一個狡猾的智能合約,可以在一筆交易中一次發送多個不同的代幣,但您仍然需要進行許多交易,創建一個合約,然後將代幣和硬幣轉移給它,然後調用適當的方法。 這需要精力和時間,所以在實踐中它並不是這樣工作的,以太坊中的所有支付都是在單獨的交易中進行的。

— 關於以太坊平台的神話之一是,不可能描述依賴外部網路資源資料的條件,那麼該怎麼辦呢?

解決方案是,智能合約本身可以提供一個或多個所謂的可信預言機,這些預言機收集有關外界事物狀態的數據,並透過特殊方法將其傳輸給智能合約。 合約本身認為從受信任方收到的資料是真實的。 為了獲得更高的可靠性,只需選擇一大群預言機並將其串通的風險降至最低即可。 合約本身可能不會考慮來自預言機的與大多數人相矛盾的數據。

區塊鏈線上課程的其中一個講座專門討論了這個主題——“智能合約簡介“。

來源: www.habr.com

添加評論