解析智能合約在區塊鏈的運作原理

解析智能合約在區塊鏈的運作原理

智能合約是在區塊鏈上運作的自動化、不可更改的程式碼,可以根據程式碼的條件和規則自動執行特定的交易或功能,也就是由程式自動執行的合約

Nick Szabo 這位密碼學專家在 1994 年前後的研究論文就有提到智能合約,它結合密碼學、去中心化元素, 在中本聰之前就提過 “Bit Gold” 的概念,他的研究工作可以說直接或間接影響比特幣、Ethereum(以太坊) 的設計。

雖然比特幣也有智能合約的概念,但它的合約功能有限,主要用於實現簡單的交易和合約。相較之下,以太坊的智能合約支援更多的功能和操作,包括 DeFi(Decentralized Finance, 去中心化金融)和 DApp(Decentralized Application, 去中心化應用程式),所以初步學習智能合約可以從以太坊的生態開始。

區塊鏈在不同領域(醫療、供應鏈)實現智能合約會有不同的方法,以下內容都是圍繞在以太坊區塊鏈的智能合約。

目錄

從開發、部署到自動化運作

在生活中你租停車位、買房子都需要跟租賃方或賣方簽署傳統合約,這個合約是來約束個人(你) 或組織(家庭或公司成員) 的行為,它需要倚賴可信的第三方機構,像是大樓管委會、信 X 房屋,不過這個方式存在時間、成本和信任等方面的問題,如果今天採用智能合約的方式將其運行在區塊鏈,就不用倚靠第三方機構來約束人的行為,而是透過智能合約的方式去處理數據資料和計算。

例如在買賣租賃停車位,可以透過智能合約協議並將這個所有權和買賣條款透過程式碼的方式寫入智能合約中,當買家購入且確定付款時,智能合約就會將停車位的所有權轉到買家名下,這過程不需要倚賴任何第三方機構參與,這種做法節省了時間、成本,同時也確保了交易的安全性。上述這些現實中的交易情境、需求,需要工程團隊透過程式碼交易邏輯實踐並部署到區塊鏈上。

-Research and development(開發)

目前主流的工具和程式語言,通常會使用乙太坊基金會開法與維護的 IDE - Remix 工具來去編寫 Solidity 程式語言。

開發智能合約的過程與一般程式沒有太大差異,都需要把程式碼進行 Compile(編譯),差別在 solc(編譯器) 完成編譯後,會把 Bytecode(二進位碼)送到鏈上做儲存。

image (圖-Java 程式語言的編譯過程)

-Deployment(部署)

當智能合約開發完成後,必須將程式碼 deploy 到區塊鏈上,不過只會把僅 Bytecode 上鏈,而不是整個 Source Code(原始碼),但是開發者可以將 Source Code 上傳到像 Etherscan 這樣的區塊鏈瀏覽器做驗證、公開。

以 ERC20 發幣的 Token 智能合約來說,它的本質就是一個帳本,在這個帳本裡面去做加 1 減 1 這種計算,在這樣的計算基礎完成智能合約的運作。工程師一開始寫出來的智能合約程式碼部署到區塊鏈上,這個程式碼區塊鏈是看不懂認不得的,所以要先把智能合約進行 Compile(編譯),編譯成 Bytecode 讓它能以 0,1 機器語言去做識別。

把智能合約部署到區塊鏈上就是每個 Ndoe(節點)都儲存了一份合約,每個節點儲存的數據都是一樣的,而在節點這個儲存空間當中還儲存了狀態變數,ERC20 這個帳本裡面對應哪個地址、帳戶餘額,這些都是儲存空間裡面的數據。

-自動化運作

在智能合約的設計細節當中,合約本身不會知道被哪一個帳戶做寫入,因為智能合約不是被動運作的,它本身不具有感知能力,我們只能主動對它做呼叫。

所以在程式碼當中會撰寫觸發條件,只要達到特定條件觸發時就自動執行,也就是這個合約它不會自己動,要使用者觸發(Call function) 才會改變狀態,而一旦將智能合約部署上鏈後就不能做任何修改,就算修改這個紀錄也是公開透明的。

到目前為止,我自己對於智能合約的理解,它就像自動感應式窗簾一樣,透過程式碼寫入條件(明亮度數值、數值判斷)後,它會依據光照作為開關。

EVM:以太坊智能合約的核心

EVM(Ethereum Virtual Machine, 以太坊虛擬機)是以太坊區塊鏈上執行智能合約的運作環境,基於複雜的記憶體結構,在以太坊的 Node(節點)上,負責執行智能合約數據讀取寫入計算以及 Command(指令) 、邏輯操作,確保智能合約能夠在分散式環境中執行,不需要依賴任何中心化機構。

-智能合約當中的 2 種操作

  1. 讀取 > 讀取智能合約現在記錄中的狀態變數,得知它具體的值是多少
  2. 寫入 > 修改狀態變數的值

要特別留意寫入操作會收取 Gas Fee 費用, 至於這個費用會收取多少是依據寫入的複雜程度而定。

-記憶體結構

EVM 的記憶體儲存結構有四種:

  1. Calldata:僅能做唯讀,臨時儲存傳遞給函示的參數
  2. Stack:所有的 Command 都必須經過 Stack, 雖然無法直接和 Stack 互動,但它是合約運作時必要的資源。
  3. Memory:變數只存在於 function 執行期間,EVM 運算結束時這個變數記憶體就會被刪掉,所以如果只會在 function 使用或想要暫時宣告一個變數,就可以使用 memory
  4. Storage:它就是一個資料庫,永久儲存在合約中變數、交易狀態的地方。

其中 Stack 和 Memory 都是暫時儲存而已,在智能合約結束運作時回收;而 Storage 是永久儲存在鏈上,所以它更消耗計算資源(Gas 費用也是最貴的)。

-進行交易有哪些細節

如果以執行一筆交易來詳述整個運作流程大概是這樣:

image

  1. 智能合約撰寫完成上線時,不用去買/租一台 Server 部署程式,因為合約是部署在區塊鏈上,每當有人呼叫合約裡的函式,就會透過Miners(礦工)的主機來執行函式,若程式中有修改到合約狀態值,主機將會把修改的內容寫入區塊鏈中也就是建立一筆交易紀錄。

  2. 你存進去的時候是一個指令,這個指令經過以太坊區塊鏈的虛擬機的運算並且運算成功後交易就成立了,交易成立後它會將狀態變數進行修改,修改後的結果會 Sync(同步) 到整個區塊鏈的狀態。

  3. 加上簽章驗證都通過後會發送廣播給所有的節點,所有節點驗證這個簽章、交易都沒問題,就將新的結果、狀態值記錄並儲存,後續再讀取合約的時候就會發現是新的結果。

  4. 在上面的部署流程中有提到,把智能合約部署到區塊鏈上就是每個節點都儲存了一份合約,每個節點儲存的數據都是一樣的,而在節點這個儲存空間當中還儲存了狀態變數,例如 ERC20 當中的帳本,這個帳本裡面對應著哪個地址、帳戶餘額,這些都是儲存空間裡面的數據。

    所以之後每一次調整數據的這個動作,就是向整個區塊鏈世界發起一個交易,在這個交易裡面夾帶的資訊就是我要把哪一個狀態變數的值調整成哪一個值,等於存進去是一個指令,這個指令經過以太坊區塊鏈的 EVM 運算後,EVM 計算成功後認定可以運作就代表交易成立,最後交易成立後它會將狀態變數調整為修改後的結果。

  5. 那其他節點要怎麼同步接收最新的狀態值呢?上面提到交易成立後它會將狀態變數調整為修改後的結果,加上簽章驗證都通過後會發送廣播給所有的節點 ,其他節點驗證這個簽章都沒問題就將新的結果狀態值記錄並儲存下來,後續再讀取合約的時候就會發現都是新的結果。

EVM 接收來自交易的智能合約的 Bytecode,然後在節點上執行 Bytecode。它確保在整個網絡中每個節點上都按照相同的方式運行智能合約,以確保結果的一致性。

如果用一句話來濃縮 EVM,它就是以太坊區塊鏈上的虛擬計算機,負責執行智能合約的程式碼並確保網絡中所有節點的結果都一致。

產品經理需不需要了解智能合約的底層原理和運作?

Web3 和 Web2 的產品經理同樣都要著重在應用層(B2B/ B2C/ C2C),例如:中心化交易所從註冊帳號到入金的流程,也就是產品服務的 Interaction(交互),針對具體的 Scenario(應用場景)進行產品規劃和設計。

不過從 2019 年進入區塊鏈、加密貨幣的世界裡,我認識到它是基於底層技術打造出來的應用,是由多種技術結合的組合拳,例如 Digital Signature(數位簽章)就應用到密碼學的 Hash,必須深入了解這個技術才知道它是什麼、可以用來做什麼,只有清楚技術的限制,才能在限制內和團隊打造最好的用戶體驗。

所以如果想對這個產業有更深入的認識,必須得深入到「技術」本身,也就是從應用層進入技術層對它的技術原理有所認識。

Ref

comments powered by Disqus