區塊鏈 Blockchain – 智能合約 Smart Contract

/ 8 評 / 7

學習區塊鏈技術時,來到智能合約(Smart Contract)這個部份,而這個部份是撰寫智能合約及構建DApp的一個最重要的概念,所以構思了一下如何更好地去理解。

初步將會分解為以下的部份去學習:

1. 了解智能合約的背景,什麼是智能合約?與區塊鏈技術的關係?出現的原因?

2. 智能合約有什麼用?

3. 優缺點

4. 怎麼用?(如何開發、測試、部署)

5. 注意事項

6. 構建一份智能合約,DApp

所以在了解智能合約(Smart Contract)之前,個人認為有必要快速概覽一下區塊鏈的演化歷史,隨後就會得悉為何會有智能合約的出現

區塊鏈 1.0

在區塊鏈技術的發展過程中,區塊鏈技術從最初並沒有一個獨立技術架構及定義,到後來出現最為人所熟悉的是比特幣 Bitcoin後,大家從比特幣中提取當中的技術架構框架,將其稱為區塊鏈技術,當時主要應用為虛擬貨幣及去中心化(Decentralized)交易,隨後,猶如雨後春筍般出現各種山寨虛擬貨幣,而這個階段被稱為區塊鏈 1.0

區塊鏈 1.0 > 2.0

在區塊鏈 1.0 ,比特幣雖然透過Proof-Of-Stake(POW)實現了分散式一致性,同時使用 UTXO模型 存儲和管理底層數據結構,實現了去中心化的分散式賬本,共且在一定程度上實現了「可編程」這一特點,不過他的腳本機制非常簡單,只是一個基於堆棧式的腳本語言,它不僅沒有函數功能,同時亦不是圖靈完備,無法實現複雜的邏輯,所以為了改進這些問題,就進入區塊鏈 2.0 階段。

智能合約由來

A smart contract is a computer protocol intended to digitally facilitate, verify, or enforce the negotiation or performance of a contract. Smart contracts allow the performance of credible transactions without third parties. These transactions are trackable and irreversible.

-- Nick Szabo 1994

智能合約 Smart Contract,由電腦科學家及密碼學專家 Nick Szabo 1994年提出,訂定了智能合約的主要運作方式,它將智能合約定義為一種以信息化傳播、驗證或執行合約的電腦協議,被允許在沒有第三方的情況下進行可信交易,而這些交易是可追踪及不可逆轉的。可惜的是,當時並沒有合適的實現環境。到區塊鏈 1.0 階段,由於去中心化平台的實現,令這個概念才得以逐漸被實現。

區塊鏈 2.0

以太坊 Ethereum 的出現,為了滿足每個交易需求,設計出智能合約這個概念,將區塊鏈帶入 2.0 ,在 1.0 的基礎上實現了區塊知曉、價值知曉、近乎圖靈完備,並進行了各項細節優化,從而形成了以智能合約為特色的區塊鏈 2.0。簡言之,智能合約為區塊鏈 2.0 的核心,以太坊的角色就相當於一個應用平台,而平台上的各種應用,就是被編寫及部署的智能合約,從而實現一些複雜邏輯,而一般所說的智能合約,都是基於以太坊平台實現的。

智能合約概念

智能合約其實就是一份數字化版本的傳統合約。可簡單理解為一個自動執行的電腦程式,它亦是系統的參與者,它能對接收的信息進行回應、接收及儲存變量,臨時保管資產,亦可以自動對外發送信息及變量,就如電腦程式一樣,它總是按照原定的規則順序執行操作,而且,這份合約的"源代碼"是公開的,而且亦會被放入區塊鏈平台上,大家都能看到當中的合約內容、執行的流程及順序,所以正因如此,智能合約亦能夠被大家所信任。不過這個特性卻有利有弊。

智能合約的組成

組成一份智能合約的元素包括:

1. 合約主體(Subject of Contract

智能合約中必須要有合約主體才能自動鎖定及解開合約中的相關商品或服務;

2. 數字簽名(Digital Signature

智能合約需要所有參與者透過他們的私鑰(Private Key)進行認證後,才能被啟動;

3. 合約條款(Contract Terms

智能合約的條款所有的操作順序,均需由所有參與者認同並簽署後才可執行;

4. 去中心化平台(Decentralized Platform

智能合約被放入去中心化的區塊鏈平台,並分佈於各個節點之間,等待執行合約;

注意:由於區塊鏈特性,智能合約編寫並被放入區塊鏈後,所有合約條款就不能夠再被改變!

智能合約的編譯及部署

一份智能合同必須經過編譯,並部署到區塊鏈後才可以使用。(猶如一個網站系統要部署系統上才能被外部用戶瀏覽一樣)

從撰寫智能合同的源代碼至到使用智能合同,大概包含以下幾個步驟:

1. 撰寫智能合約的源代碼(一般使用 Solidity 寫)

2. 編譯智能合約的源代碼成可在 EVM (以太坊虛擬機)上執行的 bytecodeBinary code)。同時可以透過編譯取得智能合約的 ABI

3. 部署智能合約,實際上是把 bytecode 儲存在鏈上(透過一個 Transaction),並取得一個專屬這個合約的地址

4. 透過使用程式呼叫這份智能合約,就要把資料發送(透過一個 Transaction)到第三步得到的合約地址,而以太坊則會根據提交的資料,選擇要執行智能合約中哪一個function和要輸入的參數

如果這份智能合約不是由自己所寫,而是使用其他人撰寫的智能合約,那麼怎樣可以知道智能合約到底提供了哪些 function 和應該要輸入哪些參數呢?

答案就是記錄在智能合約中的ABI。(可簡單理解為目前一般開發時所使用的 API 接口)

智能合約的應用

根據智能合約的特性,智能合約可被用於現實生活上很多領域,比如:投票選舉、物聯網、流程管理、銀行業務、房地產業務證明、保險業務等等一些需要"中介"及缺乏"互信"的行業或服務,都可以使用上智能合約去簡化,甚至解決問題。

優缺點

優點

1. 穩定性高

智能合約編寫完成及經過編譯後,會產生bytecodeBinary Code),並透過Transaction 儲存在區塊鏈上,根據區塊鏈的特性,將不會出現被更改及遺失的情況,一切都基於智能合約本身運行;

2. 交易效率高

智能合約中的大部份的合約條款及流程均為自動化,自動化就意味著可省去"中介""第三方"的角色,從而提高效率;

3. 可訂製化

可以根據現實環境中雙方的實際情況設計出各種不同的智能合約;

缺點

1. 安全性

由於智能合約是公開的,所以區塊鏈上的所有用戶都可以看到智能合約內容,也就好比開源程式碼,大家都能看到程式碼當中的內容,不過也會導致包括安全漏洞在內的所有漏洞都可見,並且因為目前以太坊的交易時間較長,可能無法迅速修正,在這段時間差內,可能就會造成巨大損失;

2016年6月The DAOEther的漏洞造成損失5000萬美元,而開發者試圖達成共識的解決方案。DAO的程序在黑客刪除資金之前有一段時間的延遲。以太坊軟體的一個硬分叉在時限到期之前完成了攻擊者的資金回收工作

2. 人為因素

就如上一點所述,智能合約的程式碼是由程式開發師所編寫,而程式開發者亦是人,也有機會出現誤寫的可能性。如果這份出現問題的智能合同一旦被放到區塊鏈上,就無法被更改;

3. 法律因素

智能合約目前並未得到任何政府的監管及背書,並未能真正得到法律上的支持,成為真正的"合約";

4. 實施成本

根據第一點及第二點可以知道一個擁有豐富經驗,而且能夠寫出沒有問題的智能合約的程式開發師對整個系統是非常重要的,所以與此同時,用於投入開發的成本亦會隨之增加;

總結

區塊鏈上的智能合約或DApp,並不像目前大部份中心系統中的應用般,能夠做到隨時修正問題,所以智能合約一旦出現邏輯錯誤、編程漏洞等問題,造成的影響是很嚴重的,一定要盡量避免編寫複雜邏輯的代碼,在部署到區塊鏈前,務必再三檢查,甚至找其他人幫忙做 Review,確認無誤才能進行部署。

目前在各領域都不斷有相關"落地"方案產生,但不是說任何事都用智能合約、區塊鏈、去中心化處理才是最好的,而是需要根據實際情況及問題特性,考慮到底用哪種架構去解決問題才是重要,使用應用去解決問題才是核心,並不必為區塊鏈而區塊鏈。就現階段來說,有時候使用傳統中心化的架構,對解決問題本身的效果可能更好。當然,智能合約、區塊鏈等技術會隨著時間而不斷演變、進化,從而達到 4.05.06.0的階段,屆時,可能又是另一番景象。

我們從這篇文章中可以得悉什麼是智能合約、技術背景、出現的原因、用途、與區塊鏈技術之間的關係、優缺點等等。至於怎麼用(如何開發、測試、部署)?這又是一個知識量很大的點,需要再另開篇章。

 

參考資料

浅入浅出智能合约 - 概述(一)

【Ethereum 智能合約開發筆記】深入智能合約 ABI

不可不知 何謂「智能合約」?

維基百科 - 智能合約

區塊鏈開發(零)如何開始學習以太坊及區塊鏈

在〈“區塊鏈 Blockchain – 智能合約 Smart Contract”〉中有 8 則留言

  1. NT表示:

    寫的很好。

  2. Garphy Chang表示:

    謝謝您的分享,我從一個採購人員的立場提出我的問題:

    您提到「由於智能合約是公開的,所以區塊鏈上的所有用戶都可以看到智能合約內容,也就好比開源程式碼,大家都能看到程式碼當中的內容…」,對於這樣的論點,直覺上我會認為……我的採購合約(智能合約)中的採購成本、數量、付款及相關的商業條款都被一覽無遺,也許智能合約很安全,但……
    1. 這是否表示智能合約沒有機密或隱私可言?
    2. 是否有相關機制可以隱藏相關機密訊息?

    不知我的理解是否正確,再請解惑。謝謝

    • Samson Hoi表示:

      @Garphy Chang 請注意,以下解答都是以根據個人理解及認知給出,並非百分百準確。

      您提到「由於智能合約是公開的,所以區塊鏈上的所有用戶都可以看到智能合約內容,也就好比開源程式碼,大家都能看到程式碼當中的內容…」,對於這樣的論點,直覺上我會認為……我的採購合約(智能合約)中的採購成本、數量、付款及相關的商業條款都被一覽無遺,也許智能合約很安全,但……

      1. 這是否表示智能合約沒有機密或隱私可言?
      個人理解,首先對於在「公鏈」上的智能合約來說,對大眾是完全透明的。這是缺點,也是優點。

      因為智能合約的實際意義在於 一連串執行 的 準確性,以保確大家遵守同一套協定,並在觸發後自動完成!在「公鏈」上讓大家都看清楚這份”智能合約”實際上是在幹什麼的,也包括您所提及到的採購成本、數量、付款及一些商業細節。

      其次,目前區塊鏈的形式還有兩種,「聯盟鏈」和「私有鏈」,這些都是在一些各方可信任的範圍內,例如您可以建立一條「聯盟鏈」以供您的上下游採購供應商共同維護,當然,「智能合約」的內容也只有這些可信任的節點內的用戶才能看到,如果想更進一步保護這份「智能合約」的內容,可以使用現有聯盟鏈框架內的一些功能,(例如 FISCO BCOS 內的AMOP信使功能)做到一對一業務直接通信,待所有交易完成後再把最終結果上鏈,也是一種方式。

      2. 是否有相關機制可以隱藏相關機密訊息?

      有的,除了上面那個問題提到的做法外,業界也一直在思考這個問題,也提出了不少方案來建立一個保護隱私細節的智能合約系統,據我觀察,大部份都是使用 零知識證明(具體可以看我博客關於零知識證明的文章)及其他手段加密後才公司。國外數年前已有一些論文提到這個問題,例如:

      Hawk: The Blockchain Model of Cryptography and Privacy-Preserving Smart Contracts
      https://ieeexplore.ieee.org/document/7546538

      感興趣可以看仔細看看。

      您的問題非常好,希望以上能夠解答您的問題。

  3. Job表示:

    想詢問一下 相似度100%的ˊ智能合約 所生產的代幣 是不是能互相使用?

    • Samson Hoi表示:

      @Job 即使智能合約基本上一致(除錢包地址不同),但所生產的代幣並不能互相使用(通用)。原因是由於代幣發行者、環境、產業、背景都各有不同,因此價值亦有所不同。

  4. Amy表示:

    請問假如想用smart contract來代替僱傭合同,那薪金是要在條約上列明嗎?而且是否可以做到同時綁定雇主與僱員的錢包地址,一旦完成條款,smart contract就自動將雇主的錢轉給僱員?

  5. Amy表示:

    想請教一下,假如想利用smart contract來代替僱傭合同, 薪金是否一定要記錄在合約條款上?另外,是否可以把僱員和雇主的錢包地址都綁定 smart contract, 一旦條約得到滿足,smart contract就自動把雇主的錢過給僱員?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *