以太坊為例:什么是智能合約?智能合約怎么部署、調用、執行?智能合約的原理?智能合約存在哪兒?如何區分調用的是智能合約?世界狀態數據庫、EVM、智能合約它們之間的關系?
什么是智能合約
指的是“一套以數字形式指定的承諾,包括合約參與方可以在上面執行這些承諾的協議”。早在1994年,美國計算機科學家尼克·薩博(Nick Szabo)就提出了智能合約的概念。
智能合約是一種基于區塊鏈技術的自動執行合約的計算機程序。它們是一組以代碼形式編寫的、在區塊鏈上運行的規則和邏輯。智能合約定義了在滿足特定條件時應該執行的操作,而無需中介方的干預。
以太坊是最為著名的支持智能合約的區塊鏈平臺之一。在以太坊中,智能合約是用一種稱為Solidity的編程語言編寫的。這些合約代碼被部署到以太坊區塊鏈上,并由全網節點驗證執行。智能合約的執行結果和狀態存儲在區塊鏈上,確保了透明性和不可篡改性。
智能合約可以執行各種任務,包括但不限于轉移數字貨幣,管理數字身份,執行投票和投資等。由于其自動執行和透明的特性,智能合約在去除信任第三方的同時提供了更多的安全性。
智能合約怎么部署、執行
拿以太坊來說,可以在以太坊虛擬機EVM中部署和調用智能合約。
在以太坊上,合約的執行是通過向合約地址發送交易來觸發的。合約地址是由合約創建者的地址和創建者賬戶的 nonce 生成的,所以在區塊鏈上唯一標識一個合約。
執行合約的過程如下:
-
創建合約: 首先,有人(創建者)通過發送一個特殊的交易(稱為合約創建交易)來部署合約。這個交易包含了合約的字節碼(即合約的編譯后的代碼)以及其他必要的參數。在這個交易中,創建者將以太幣(ETH)發送到合約地址,作為合約的初始資金。
-
合約創建交易: 這個合約創建交易被廣播到整個以太坊網絡,并被礦工包含在一個區塊中。
-
區塊鏈確認: 礦工通過執行交易中的合約字節碼來創建新的區塊。這就是合約在以太坊網絡中的創建過程。
-
觸發合約: 一旦合約被創建,任何人都可以通過向合約地址發送交易來調用合約。這個交易中包含了調用合約的數據,也就是要執行的合約函數及其參數。
-
合約執行: 當這個交易被礦工打包并寫入區塊鏈后,以太坊網絡中的每個節點都會執行合約的字節碼,模擬合約的執行過程。這確保了所有節點都達成相同的結果。
通過這種方式,合約的執行是通過向合約地址發送交易并將要執行的數據包含在交易中來觸發的。以太坊網絡的節點根據交易中的數據,按照合約的邏輯執行相應的操作。
智能合約的原理
在上面的圖中展示了智能合約的結構,它一般具有“值”和“狀態”兩個屬性,代碼中用If-Then和What-If語句預置了合約條款的相應觸發場景和響應規則。智能合約經多方共同協定、各自簽署后隨用戶發起的交易(transaction,Txn)提交,經P2P網絡傳播、礦工驗證后存儲在區塊鏈特定區塊中。用戶得到返回的合約地址及合約接口等信息后即可通過發起交易來調用合約。“礦工”受系統預設的激勵機制激勵,將貢獻自身算力來驗證交易。
“礦工”收到合約創建或調用交易后在本地沙箱執行環境(如以太坊虛擬機)中創建合約或執行合約代碼,合約代碼根據可信外部數據源[也稱為預言機(Oracle Machines)]和世界狀態的檢查信息自動判斷當前所處場景是否滿足合約觸發條件以嚴格執行響應規則并更新世界狀態。交易驗證有效后被打包進新的數據區塊。新區塊經共識算法認證后鏈接到區塊鏈主鏈,所有更新生效。
以太坊虛擬機EVM
EVM是一個計算引擎,有助于智能合約的部署和操作。沒有EVM,就不可能在以太坊協議上執行軟件程序。因此,EVM是以太坊核心架構的關鍵部分。
虛擬機
虛擬機是模擬物理計算機行為的程序。虛擬機有它的存儲和處理單元,在你的電腦上作為進程運行。這有點像一臺電腦在另一臺電腦上運行。
虛擬機類似于普通的Windows或MacOS軟件。這里的區別在于虛擬機被設計為執行更高級的功能。此外,與常規操作系統不同,虛擬機無法訪問計算機的其他部分,如存儲或帶寬。
如果你使用模擬器在PC上玩過Android游戲,那么虛擬機可能很熟悉。雖然模擬器和虛擬機有很大不同,但它們都接近硬件的能力,可以在“Sandbox(沙盒)”環境中執行代碼。
圖靈完備性
英國數學家艾倫·圖靈(Alan Turing)發明了第一臺圖靈機器,它是當今計算機的先驅。只要有足夠的時間和資源,圖靈整機可以處理任何計算,無論多么復雜。
現在,讓我們將這些想法結合起來,定義以太坊虛擬機:
以太坊虛擬機(EVM)是一個巨大的虛擬機,允許部署和執行代碼。您只需安裝必要的客戶端軟件即可訪問EVM,并使用它在以太坊上執行程序。本質上,EVM充當“世界計算機”,在分散的環境中執行軟件操作。
由于沒有集中控制,EVM由幾個個人/公司維持,這些個人/公司向系統提供計算能力,以換取獎勵。因此,它有助于創建任何一方都無法單方面關閉的抗審查應用程序。
EVM是圖靈完備的,因為它可以用于執行各種復雜度的計算。這就是以太坊與比特幣的區別,因為比特幣是圖靈不完整的,限制了其功能。
比特幣的主要功能是“分布式賬本”,它規定了價值轉移的規則。除了處理價值轉移,以太坊(通過EVM)還支持智能合約的部署。因此,以太坊被描述為“分布式狀態機”。
“State”(狀態)是指在任何時間點有關系統的信息。在以太坊中,狀態指的是特定時刻存在的地址、賬戶余額和智能合約代碼。每個事務都會導致以太坊的狀態發生變化(狀態轉換),這種變化會反映在整個網絡中。
智能合約存在哪兒
在以太坊中,合約的代碼并不一直存儲在以太坊虛擬機(EVM)中。相反,合約的代碼在合約被創建時被寫入區塊鏈,并存儲在區塊鏈的合約賬戶中。
當你部署一個合約時,一筆特殊的交易會被創建,其中包含合約的字節碼(即合約的二進制表示)。這筆交易會觸發區塊鏈上的一個區塊,其中包含了合約的創建,并在合約賬戶中存儲了合約的字節碼。
合約地址是通過合約創建者的地址和創建者賬戶的 nonce 計算得到的。這確保了合約地址在以太坊網絡中的唯一性。
當你向一個合約地址發送交易時,以太坊節點會檢查這個地址是否與合約地址匹配。如果匹配,以太坊節點將執行合約賬戶中存儲的合約代碼,并提供交易數據供合約執行。
合約賬戶
在以太坊中,合約賬戶的存儲方式與普通賬戶有所不同。合約賬戶并不像普通賬戶那樣關聯著私鑰和地址,而是關聯著合約代碼和存儲空間。
合約賬戶的存儲位置是以太坊的世界狀態數據庫中。以太坊使用類似數據庫的結構來存儲全網狀態,其中包括賬戶余額、合約代碼、合約存儲數據等。這個數據庫的每個狀態都對應一個區塊,因此以太坊的全網狀態會隨著每個區塊的產生而更新。
具體而言,合約賬戶的數據存儲在該賬戶的地址下。合約地址是由創建合約的交易的發送者地址和發送者賬戶的 nonce 值計算得到的。這個地址唯一地標識了一個合約賬戶,并在以太坊的世界狀態數據庫中存儲了該合約的代碼和數據。
需要注意的是,雖然合約賬戶的地址是由創建者和 nonce 計算得到的,但賬戶的私鑰并不直接存在。私鑰用于簽署交易和控制賬戶,而合約賬戶沒有私鑰,其執行是由交易觸發的,依賴于合約代碼的邏輯。
世界狀態數據庫
在以太坊中,世界狀態數據庫是一個持久性的、全局的狀態存儲系統,用于跟蹤和管理整個以太坊區塊鏈網絡上的賬戶和合約的狀態信息。它的作用主要包括:
-
存儲賬戶信息: 世界狀態數據庫存儲了每個賬戶的當前余額、合約代碼、合約存儲數據等信息。
-
提供全局狀態: 通過記錄每個賬戶的狀態,世界狀態數據庫提供了全局的區塊鏈狀態,反映了每個賬戶的當前情況。
-
支持智能合約: 智能合約是以太坊上的自動執行代碼,合約的狀態和數據存儲在世界狀態數據庫中。這使得合約可以隨著交易和區塊的執行而改變狀態。
-
存儲區塊鏈歷史: 世界狀態數據庫還存儲了區塊鏈的歷史狀態,每個區塊都對應一個狀態。這使得可以回溯查看歷史狀態,驗證交易的有效性。
原理:
世界狀態數據庫的原理涉及默克爾樹和數據結構的設計。每個區塊包含一個狀態根,這個狀態根是默克爾樹的根節點,包含了所有賬戶狀態的哈希值。當一個新的區塊生成時,世界狀態數據庫會更新,新的狀態被計算并存儲,形成新的狀態樹。這確保了數據的不可篡改性和完整性。
通過采用默克爾樹結構,以太坊實現了高效的狀態變化和驗證機制。當需要驗證一個賬戶的狀態時,只需檢查相應的默克爾證明即可,而不需要遍歷整個數據庫。這樣的設計在保持全局一致性的同時,提高了性能和可擴展性。
在以太坊中,每個節點都有自己的本地世界狀態數據庫。這是因為以太坊是一個分布式的區塊鏈網絡,每個節點都需要獨立地維護和更新自己的狀態數據庫。每個節點都通過區塊鏈網絡接收和驗證交易,執行智能合約,然后更新本地的世界狀態。
盡管每個節點都有自己的本地狀態數據庫,但由于區塊鏈的共識機制,最終每個節點都應該達到相同的共識狀態。這就是分布式共識的核心概念:盡管每個節點可能從不同的出發點開始,但通過共識算法,最終它們將達到相同的狀態,即相同的世界狀態。這確保了整個網絡的一致性。
如何區分我調用的是智能合約?
以太坊中,交易中包含一個稱為 to 的字段,該字段指定了交易的接收者地址。如果 to 字段為 null 或未設置,那么這筆交易將被認為是一個合約創建交易。
當你發送一個交易給一個合約地址時,以太坊網絡通過這個地址找到相應的合約,并執行合約中與交易數據相對應的函數。這是通過交易中的輸入數據(稱為 input data)來實現的。
合約的地址是由合約的創建者和創建者賬戶的 nonce 生成的,所以在區塊鏈上是唯一的。當你向一個合約地址發送交易時,以太坊網絡知道這個地址是一個合約地址,因此會執行與交易數據相對應的合約代碼。
簡而言之,以太坊知道你調用的是一個合約而不是一個簡單的交易,主要是通過交易中的 to 字段和交易的輸入數據。如果 to 字段指定了一個合約地址,以太坊網絡就會執行該合約中與輸入數據相對應的函數。
世界狀態數據庫、EVM、智能合約的關系
在以太坊中,世界狀態數據庫(World State)、EVM(Ethereum Virtual Machine)和智能合約之間有密切的關系。以下是它們之間的關系:
-
EVM與智能合約:
- 執行環境: EVM是以太坊的運行時環境,負責執行智能合約的字節碼。
- 智能合約代碼: 智能合約是由開發者用 Solidity、Vyper 等語言編寫的程序代碼。這些代碼被編譯成EVM可執行的字節碼。
-
EVM與世界狀態數據庫:
- 狀態維護: EVM通過讀取和更新世界狀態數據庫來維護智能合約的狀態。
- 狀態讀寫: 在執行智能合約時,EVM可以讀取狀態世界數據庫中的當前狀態,并根據智能合約的執行結果更新這些狀態。
-
世界狀態數據庫與智能合約:
- 狀態存儲: 世界狀態數據庫是以太坊的全局數據庫,存儲了所有賬戶(包括用戶賬戶和智能合約賬戶)的當前狀態。
- 智能合約狀態: 智能合約的狀態,包括變量值等信息,被存儲在世界狀態數據庫中。每個智能合約都有一個唯一的地址,對應世界狀態數據庫中的一個條目。
綜合而言,智能合約通過EVM執行,并在執行過程中讀寫世界狀態數據庫。EVM作為虛擬機執行智能合約的字節碼,而世界狀態數據庫則負責存儲智能合約和賬戶的當前狀態。這三者的協同工作構成了以太坊上智能合約的執行和狀態管理機制。