06-智能合約
0 啥是智能合約?
定義
智能合約,又稱加密合約,在一定條件下可直接控制數字貨幣或資產在各方之間轉移的一種計算機程序。
角色
-
區塊鏈網絡可視為一個分布式存儲服務,因為它存儲了所有交易和智能合約的狀態 -
智能合約還是基于存儲服務之上的計算,即運行在區塊鏈上的代碼程序。

特點
智能合約,即先前設定好的代碼數字協議,在不可更改和公共監督情景下,去運行一個合約,違反合約的一方將付出事先約定好的代價,自動執行(無需借助外部力量)。
智能合約是公平的,第三方無法干預。
功能
智能合約不僅以與傳統合約相同方式定義協議的規則和處罰,還可自動強制執行這些義務。
它通過接受信息作為輸入,通過規則為輸入賦值,在合約中列出并執行這些合約條款。
實例
設想人壽保險,智能合約在保單持有人去世后,向指定受益人支付利益。
合約可以對在線死亡登記表進行實時檢查以確定支付時間,智能合約是可靠的,自動的。
架構地位
核心數據和核心業務邏輯運行在區塊鏈上,保證去中心化與上層業務系統進行銜接,提供用戶界面或業務集成:

意義
區塊鏈智能合約:從數據可信上升到業務可信。
1 假如沒有智能合約?
區塊鏈網絡將僅作為一個分布式存儲服務。區塊鏈主要功能將會是記錄和保存數據,而不會自動執行任何邏輯或業務規則。
沒有智能合約的區塊鏈網絡的特點和局限:
1.1 特點
-
去中心化存儲:區塊鏈仍提供去中心化的數據存儲功能,保證數據的完整性和防篡改性 -
數據透明性:所有節點可訪問相同數據,確保信息公開透明 -
安全性:通過共識機制和密碼學技術,確保數據安全性和不可篡改性
1.2 局限
-
缺乏自動化處理:無法在鏈上執行自動化的業務邏輯。如不能在特定條件下自動觸發資金轉移或更新數據 -
手動操作:所有業務邏輯和操作需要依賴鏈下的系統或人工操作,增加操作復雜性和潛在錯誤 -
有限的應用場景:僅能用于簡單的數據記錄和查詢,無法支持復雜的去中心化應用(dApps)
1.3 假如沒有智能合約的區塊鏈網絡的典型使用場景
-
數據記錄:例如,公證和時間戳服務,用于證明某個數據在某個時間點已經存在。 -
審計跟蹤:用于保存和跟蹤記錄的變更歷史,確保記錄的完整性和不可篡改性。 -
簡單交易:例如,比特幣的早期應用,僅支持簡單的轉賬功能,而沒有復雜的業務邏輯。
1.4 實例
若一個區塊鏈網絡沒有智能合約,其工作流程可能:
-
數據寫入:用戶通過客戶端,將數據寫入區塊鏈 -
數據存儲:區塊鏈網絡通過共識機制將數據記錄在區塊中,并存儲在各節點的賬本中 -
數據查詢:用戶或應用程序可查詢區塊鏈中的數據,但不能執行任何業務邏輯
如Alice向區塊鏈提交一筆交易,記錄她向Bob轉賬1個單位貨幣。區塊鏈網絡會驗證并記錄這筆交易,確保其不可篡改。但若無智能合約,無法在特定條件下自動執行轉賬或其他邏輯操作,所有業務流程要在鏈下由用戶或第三方系統手動處理。
綜上,無智能合約的區塊鏈網絡在功能上受限,只能提供基礎的分布式存儲和數據記錄功能,無法支持復雜的自動化業務邏輯和去中心化應用。
所以,智能合約
1.5 有啥用?
在區塊鏈社會里,大家共同維護一個區塊鏈賬本,所有交易數據無法篡改、不可偽造,還能減少人工對賬的出錯概率和人力成本。 隨智能合約普及,我們也會變得更佛系。面對潛在的糾紛,無需自己出馬,一切代碼說了算。
如乘飛機買延誤險,理賠就變得簡單多了:
-
投保乘客信息、航班延誤險和航班實時動態均以智能合約的形式存儲在區塊鏈上 -
一旦航班延符合賠付標準,賠償款將自動劃賬到投保乘客賬戶,保單處理十分高效 -
你也不需要跟工作人員費口舌、爭論計賠時間等問題
智能合約是以太坊區塊鏈上指定地址的代碼和數據集合,智能合約能直接相互發送消息,同時也能執行圖靈完備計算。
智能合約是建立在以太坊虛擬機字節碼基礎之上的。
一般不會直接編寫字節碼,而是使用像 Solidity 這樣的以太坊高級語言。
Solidity 是可以用來編寫以太坊智能合約的高級語言,它和js很像。
推薦使用 Solidity 語言,其使用的人比較多,意味著更好的生態,能找到更多的資源,有問題也更容易找到答案。
2 重要性
2.1 經濟活動可編程
代碼即法律,表達現實世界的經濟活動,滿足條件自動觸發的電子合約
2.2 現實事物可映射
智能提供豐富的數據結構,完成復雜的現實事物的標識和時序變化
2.3 區塊鏈2.0的標志
區塊鏈2.0通常指的是在比特幣之后出現的區塊鏈技術,其核心特征是支持智能合約(Smart Contracts)。智能合約是一種自動執行的合約,其中的條款和條件直接編碼到代碼中,無需第三方介入即可執行。
以太坊,HLFabric等都是建立在智能合約的基礎上。
3 智能合約框架

3.1 廣域網的狀態一致性
-
不同節點得到一致執行結果 -
不同硬件環境得到一致的資源消耗
3.2 合約開發語言多樣性
適應不同開發者的開發習慣
支持不同的合約語言:
-
C++ -
GO -
JAVA -
Solidity
支持不同的合約類型:
-
WASM 合約 -
Native 合約 -
EVM 合約
合約語言/運行時相容矩陣:

-
環境準備 -
合約編寫 -
合約編譯 -
部署調用
3.3 合約執行的高性能
支撐真實落地場景的業務體量
3.4 不同業務場景的可擴展性
-
公開網絡和聯盟網絡的虛擬機需求 -
兼容已有的區塊鏈生態
4 WASM智能合約字節碼
將智能合約編譯成WebAssembly字節碼格式,以便在區塊鏈環境中高效、安全地執行。WASM(WebAssembly)是一種高效、可移植的低級字節碼格式,最初是為在瀏覽器中高效運行而設計的,但由于其安全性、跨平臺兼容性和高效性,逐漸在區塊鏈和智能合約領域中獲得廣泛應用。
4.1 優點
字節碼預編譯AOT,實現高性能
硬件無關中間碼,生成本地指令 編譯執行 V.S 解釋執行
WASM字節碼經過優化,可以接近本地執行速度,確保智能合約的高效執行。
資源限制及審計
-
設置資源限制,超限制自動退出 -
多緯度資源統計:CPU,內存,磁盤
安全性保障
-
內存越界檢查 -
限制系統資源訪問,類似web沙盒環境。WASM運行在沙盒環境中,隔離了智能合約執行和底層系統,減少了安全漏洞。 -
超資源自動退出保護機制,防惡意攻擊

可移植性
WASM字節碼可以在任何支持WASM的環境中執行,增加了智能合約的跨鏈兼容性
多語言支持
開發者可用多種編程語言(如Rust、C++、Go等)編寫智能合約,然后編譯成WASM字節碼
4.2 工作流程
-
編寫合約:開發者使用高層語言(如Rust)編寫智能合約。 -
編譯成WASM字節碼:使用編譯工具將智能合約編譯成WASM字節碼。 -
部署:將編譯后的WASM字節碼部署到區塊鏈網絡上。 -
執行:當調用智能合約時,區塊鏈節點將加載并執行WASM字節碼。

4.3 例子
1. 編寫智能合約(Rust)
#[no_mangle]
pub?extern?"C"?fn?add(a:?i32,?b:?i32)?->?i32?{
????a?+?b
}
2. 編譯為WASM字節碼
使用Rust工具鏈和wasm-pack
將代碼編譯為WASM字節碼:
wasm-pack?build?--target?web
編譯后生成的WASM字節碼文件可以部署到支持WASM的區塊鏈平臺。
3. 部署和調用
將生成的WASM字節碼文件部署到區塊鏈上,然后通過交易調用合約函數。例如,調用add
函數并傳遞參數a
和b
。
4.4 未來
WASM智能合約在區塊鏈領域具有廣闊的前景:
-
跨鏈互操作性:由于WASM的可移植性,未來不同區塊鏈平臺之間可以更方便地共享和執行智能合約。 -
更高性能:WASM的高效執行能力使得區塊鏈平臺可以支持更復雜和計算密集的應用。 -
更安全的合約執行:WASM沙盒環境提供了更好的安全性,減少了智能合約中的潛在漏洞。
5 Gas 計費原理-控制流圖分析

Gas 計費是區塊鏈平臺(如以太坊)用來防止資源濫用和激勵資源使用優化的機制。智能合約執行過程中每一步操作都會消耗一定量的Gas,用戶需要為這些操作支付費用。Gas 費用通常以加密貨幣(例如以太幣)支付。
Gas 計費原理
-
初始Gas分配:在交易開始前,用戶需要指定一個Gas上限(即最大愿意支付的Gas量)和Gas價格(每單位Gas愿意支付的費用)。在交易執行時,這個Gas上限會被鎖定,確保不會超過用戶設定的最大Gas量。
-
操作計費:智能合約執行過程中,每個操作指令(如算術運算、存儲操作、合約調用等)都有預定義的Gas消耗。虛擬機(如以太坊的EVM)會根據操作指令的類型和數量逐步扣除Gas。
-
Gas不足處理:如果執行過程中Gas消耗超過了用戶設定的Gas上限,交易會被強制中止并回滾,但已經消耗的Gas不會退還。
-
剩余Gas退還:如果交易執行完畢且未耗盡所有的Gas,上限中未用盡的部分會退還給用戶。
控制流圖分析
控制流圖(CFG)是用來表示程序所有可能執行路徑的圖結構,節點表示基本塊(basic blocks),邊表示控制流(control flow)。在智能合約中,CFG可以幫助分析程序的Gas消耗情況。
示例智能合約控制流圖
假設有一個簡單的智能合約,偽代碼如下:
function?foo(x)?{
????if?(x?>?10)?{
????????y?=?x?*?2;
????}?else?{
????????y?=?x?+?10;
????}
????return?y;
}
其控制流圖如下所示:
[Start]|v[Entry: x > 10]/ \/ \v v
[y = x * 2] [y = x + 10]\ /\ /v v[Return y]
Gas 計費過程
-
進入合約:Gas 消耗包括調用合約的基礎費用和傳遞參數的費用。
-
條件判斷:根據條件判斷的復雜度,會消耗一定量的Gas。
-
分支執行:
-
若 x > 10
,執行y = x * 2
,算術運算消耗Gas。 -
若 x <= 10
,執行y = x + 10
,算術運算消耗Gas。
-
-
返回結果:返回結果的過程會消耗Gas。
通過控制流圖,可以直觀地分析不同路徑上的Gas消耗情況,并優化智能合約代碼以減少Gas使用。例如,在上述示例中,可以通過合并相似的計算路徑來減少條件判斷的復雜度。
Gas 計費優化
-
減少存儲操作:存儲操作(如寫入合約存儲)是最昂貴的操作之一,盡量減少寫操作可以顯著降低Gas消耗。 -
優化計算:避免不必要的復雜計算,使用低Gas消耗的操作替代高Gas消耗的操作。 -
減少條件判斷:減少條件分支的復雜度和數量,優化控制流路徑。 -
合約重用:通過模塊化設計,重用常見操作,減少重復代碼帶來的額外Gas消耗。
總結
Gas計費是區塊鏈智能合約執行中的重要機制,通過控制流圖分析,可以幫助理解和優化智能合約的Gas消耗。結合具體操作和優化策略,可以有效地降低智能合約的執行成本,提高運行效率。
6 合約執行事務流程

從用戶發起交易請求到交易完成被區塊鏈網絡記錄:
-
用戶發起交易請求:
-
用戶通過錢包或DApp(去中心化應用)向區塊鏈網絡提交一筆交易請求。 -
交易請求中包含調用的智能合約地址、函數名、參數、Gas上限和Gas價格等信息。
-
-
交易廣播:
-
用戶的交易請求通過節點被廣播到整個區塊鏈網絡。 -
所有全節點都會接收到這筆交易請求。
-
-
交易驗證:
-
節點對交易請求進行驗證,包括簽名驗證、Nonce驗證(防止重放攻擊)和檢查用戶賬戶是否有足夠的余額支付Gas費用。 -
驗證通過的交易被放入交易池中等待打包。
-
-
礦工打包交易:
-
礦工節點從交易池中選取若干交易進行打包。 -
選取策略通常優先選擇Gas價格較高的交易,以獲得更多的手續費收入。
-
-
交易執行:
-
礦工節點在虛擬機(如以太坊的EVM)中執行交易。 -
虛擬機按順序執行交易中的每一條指令,并逐步扣除Gas。 -
若交易中的Gas不足,交易會被中止并回滾,但已經消耗的Gas不會退還。
-
-
智能合約調用:
-
在交易執行過程中,合約函數被調用,執行相應的邏輯。 -
合約調用過程中可能會涉及狀態修改、事件觸發、調用其他合約等操作。 -
執行結束后,結果(包括狀態變更、返回值等)被記錄下來。
-
-
交易結果打包:
-
礦工將交易執行結果和狀態變更打包成一個新的區塊。 -
新區塊包含區塊頭(包含區塊號、時間戳、前一區塊哈希等信息)和交易列表。
-
-
區塊廣播:
-
新區塊通過P2P網絡廣播給其他節點。 -
其他節點收到新塊后,對區塊和其中的交易進行驗證。
-
-
共識算法:
-
區塊鏈網絡使用共識算法(如PoW、PoS等)對新塊進行共識驗證。 -
驗證通過后,區塊被添加到區塊鏈上,交易被正式確認。
-
-
客戶端確認:
-
客戶端通過監聽交易或區塊事件,確認交易已上鏈。 -
用戶可以查詢交易狀態,查看交易是否成功、Gas消耗情況等。
-
流程關鍵點
-
Gas機制:交易執行過程中每一步操作都會消耗一定量的Gas,防止資源濫用。 -
交易驗證:確保交易的合法性,包括簽名驗證和賬戶余額檢查。 -
共識機制:通過共識算法保證區塊鏈的去中心化和安全性。 -
狀態變更:合約調用過程中會涉及狀態變更,必須確保狀態變更的一致性和不可篡改性。
7 合約并發執行原理

通過允許多個智能合約交易并行處理,可以顯著提高系統的吞吐量和響應速度。
-
交易分類:
-
首先,將待處理的交易按照涉及的賬戶或智能合約進行分類。不同賬戶或合約的交易可以并發執行,而相同賬戶或合約的交易則需要按順序執行以避免沖突。
-
-
依賴關系檢測:
-
通過依賴關系檢測算法,確定交易之間的依賴關系。依賴關系指的是交易之間存在數據讀寫沖突的情況。 -
例如,交易A需要讀取交易B寫入的數據,則A依賴于B,需要等待B執行完畢才能執行A。
-
-
構建依賴圖:
-
根據依賴關系構建一個依賴圖(DAG,Directed Acyclic Graph),其中每個節點代表一個交易,邊表示依賴關系。 -
DAG圖確保了并發執行的正確性,即交易的執行順序符合依賴關系。
-
-
并發執行引擎:
-
使用并發執行引擎對交易進行調度和執行。引擎根據DAG圖中的依賴關系,選擇可以并行執行的交易集。 -
同時滿足無依賴關系的交易可以并行執行,依賴關系中的交易按順序執行。
-
-
狀態隔離:
-
每個交易在執行過程中操作的狀態(如賬戶余額、合約存儲等)在隔離的環境中進行,以確保并行執行時不會互相影響。 -
使用沙盒技術或事務管理機制實現狀態隔離,保證數據的一致性和隔離性。
-
-
結果合并:
-
所有交易執行完畢后,將各個交易的執行結果(狀態變更、事件觸發等)合并到全局狀態中。 -
確保最終的全局狀態一致性,即所有交易的結果都正確應用到區塊鏈上。
-
-
共識與確認:
-
并發執行完成后,交易結果進入共識階段,由區塊鏈網絡通過共識算法進行驗證和確認。 -
確認通過的交易結果被持久化到區塊鏈中,完成整個并發執行流程。
-
流程關鍵點
-
并發調度:通過依賴圖調度交易執行,確保無依賴關系的交易可以并發執行。 -
狀態隔離:使用沙盒或事務管理技術,確保并行執行時的狀態隔離和數據一致性。 -
依賴檢測:檢測交易之間的讀寫依賴關系,構建依賴圖以指導并發執行。
并發執行的優勢
-
提高吞吐量:并發執行可以顯著提高區塊鏈網絡的交易處理能力,增加每秒交易處理數量(TPS)。 -
縮短確認時間:并發執行減少了交易等待時間,縮短了交易確認所需的時間,提高了用戶體驗。 -
優化資源利用:并發執行可以更高效地利用節點的計算資源,提高區塊鏈系統的整體性能。
挑戰與解決方案
-
數據沖突:需要有效的依賴關系檢測和沖突解決機制,避免并發執行時的數據沖突。 -
隔離與一致性:確保并發執行環境中的狀態隔離和最終的一致性,保證數據的準確性和可靠性。 -
復雜性管理:并發執行引擎的設計和實現較為復雜,需要處理多種并發場景和異常情況。
通過上述原理和流程,可以有效地實現智能合約的并發執行,提高區塊鏈系統的性能和可擴展性。
獲取更多干貨內容,記得關注我哦。
本文由 mdnice 多平臺發布