BTC
ETH
HTX
SOL
BNB
查看行情
简中
繁中
English
日本語
한국어
ภาษาไทย
Tiếng Việt

技術分析:以太坊、比特幣和比特幣現金上的智能合約有什麼差異?

本文約7911字,閱讀全文需要約12分鐘
平分秋色,各有千秋。
AI總結
平分秋色,各有千秋。

編者按:本文來自頭等倉(ID:first_vip1),Odaily經授權轉載。

編者按:本文來自

頭等倉(ID:first_vip1)

,Odaily經授權轉載。

頭等倉(ID:first_vip1)

二級標題

頭等倉(ID:first_vip1)

圖片描述

二級標題

,Odaily經授權轉載。

圖片描述

圖片描述

二級標題

以太坊:自有狀態且圖靈完備

圖片描述

圖片描述

圖:EVM 費用結構

在執行智能合約功能期間,合約可以存儲和訪問必要的數據。根據其用途,這些數據可以存儲於不同的位置,即位於不同的數據位置。首先是「堆棧」(stack),其中包含計算中使用的值。只能輕鬆訪問堆棧中的前16 個項目,因此不適合長期存儲。下面顯示了使用堆棧進行計算。

圖片描述

圖:基於堆棧的計算

其次,為了補充堆棧,「contract memory」可用於在當前合約執行過程中存儲、檢索和傳遞數據。可以從內存中檢索這些值,以將其用於堆棧上進行計算,並將結果存儲回內存中。這些值僅在當前執行期間持續存在。在合約執行結束時,將擦除contract memory 內存和堆棧。

更多以太坊虛擬機如何工作的細節可參見MyCrypto 的文章。

編寫智能合約儘管所有智能合約都使用EVM,但大多數智能合約不是使用EVM 字節碼手工編寫的,就像大多數JVM 字節碼不是手工編寫的一樣。相反,有幾種高級語言可用於在以太坊中編寫智能合約,最受歡迎的語言是Solidity,除此之外還出現了Vyper,也是一種面向EVM 的編程語言。下圖包含一個非常簡單的Solidity 智能合約的示例。

這些部署的合約僅以EVM 字節碼的「碎片」形式存在於網絡中,幾乎無法單獨使用。為了與它們進行「接頭」,需要提供一個應用程序二進制接口(ABI),其中包括所有公共功能及其參數的列表。為了使用戶對這些合約有更多了解,Etherscan之類的服務幫助可以驗證合約源代碼,以便用戶可以在使用合同之前檢查代碼。

通過連接到以太坊節點並使用其JSON-RPC 接口,可以直接訪問所有智能合約。但是,許多智能合約卻是通過連接到節點並管理ABI 的前端應用程序訪問的。這可以通過眾多不同的以太坊SDK (例如web3.js 或ethers.js)之一來完成,它們可以在後台調用JSON-RPC。這為合約用戶提供了更好的體驗,相當於最困難的部分被形象化了。

二級標題

可以通過兩種不同的方式與智能合約進行交互:調用(Calls)和交易(Transactions)。調用是合約功能的本地調用,它不會向區塊鏈廣播任何內容。因此,調用過程是「只讀」的,不能對合約狀態進行任何更改,也不會產生任何費用。而交易是實打實的「寫入操作」,確實會廣播到網絡,並包含在區塊鏈中,並且會產生礦工費用。以ERC20 令牌為例,通過調用檢索token 餘額,同時通過發動交易轉移令牌。

智能合約間互操作以太坊的這些屬性(具有圖靈完備的EVM 和持久性存儲)允許創建在鏈上運行的任何類型的去中心化應用程序。一個很好的例子就是DeFi 生態系統,其中包括Maker,Uniswap 和Compound 等應用程序,以及ERC20 和ERC721 令牌標準。這些應用程序允許具有無限數量的動態參與者的複雜功能。

圖:rDai 中的DeFi 互操作性

二級標題

最重要的是,智能合約本身可以成為其他智能合約的「參與者」,從而實現這些合約之間的強大集成和組合。比如,持有代幣餘額並將其借給Compound 或與Uniswap 交易所的智能合約,或者是使用rDai 自動投資DAI 並將應計利息貢獻給慈善機構。

儘管智能合約可以彼此交互,但是鏈上的每個交易都必須來自外部帳戶。因此,以太坊智能合約間的交互仍然必須由用戶通過初始交易來觸發。在此初始觸發之後,合約間的交互類似於直接訪問。

二級標題

比特幣:無狀態且簡單

所有比特幣交易(包括定期轉賬)均由基於堆棧的、被稱為「比特幣腳本」(Script)的編程語言支持。上文提到以太坊的EVM 是為圖靈完備且可互操作的智能合約而設計的,而比特幣腳本卻有意添加各種限制,並且以根本不同的方式工作。解釋比特幣腳本就想EVM,比特幣腳本使用堆棧(Stack)來保存值(Value)並在這些值上執行計算。但與EVM 不同的是,堆棧是比特幣腳本中唯一可用的數據位置。這意味著,很難存儲多個值以便在以後的合約執行中使用。更重要的是,這意味著不可能存儲或修改那些在合約執行期間仍存在的值(但EVM 可以)。

比特幣的模型允許獨立且高效得多地驗證交易,這使得併行化和分片交易更加容易。但是,如果沒有任何可變的數據存儲,在比特幣上創建像以太坊那樣的複雜智能合約就更加困難,比如,ERC20 合約必須跟踪代幣餘額並進行更改。

圖片描述

除了這些狀態差異之外,還有其他一些因素限制了比特幣智能合約的複雜性。值得注意的是,比特幣腳本缺乏對某些算術函數以及任何形式的循環或遞歸的支持。其合約還具有520 個字節的有效大小限制,並且最多只能包含201 個操作碼。

比特幣上的大多數智能合約都屬於幾類簡單合約。例如,可以由多個參與者使用的多重簽名合約,或哈希時間鎖定合約(HTLC)。

而且由於比特幣上的這些合約非常簡單,大多數價值是通過將不同的合約與其他脫鏈應用程序邏輯相結合而捕獲的。這樣,可以將簡單的合同組合起來以創建複雜的解決方案,例如閃電網絡或跨鏈拍賣等等。

解釋比特幣交易比特幣每一筆交易都是通過所謂的「交易輸出」實現的。當這些交易輸出在某個賬戶中可用,它們就被稱為未用交易輸出(UTXOs)。這些UTXOs 被鎖定腳本(或scriptPubKey)鎖定,並被指定好了使用條件。嘗試使用UTXOs 時,會提供一個解鎖腳本(或ScriptSig),然後這些腳本一起執行計算。僅當腳本執行無錯誤且結果值為正確(TRUE)時,交易才生效。

與EVM 一樣,所有比特幣節點都執行這些腳本來驗證交易,但是比特幣區塊鏈並沒有Gas 成本的概念,因此,按交易數據的每個字節向礦工支付費用。為了限制節點必須完成的工作量,在一些更密集的腳本操作上也加入了一些限制。

與智能合約互動比特幣中的智能合約的編寫使用P2SH 模式(頭等倉注:有翻譯為「向腳本哈希支付」)。 P2SH 模式中的鎖定腳本包含腳本哈希,並且需要提供完整腳本(稱為贖回腳本)以及該贖回腳本的解鎖腳本的解鎖腳本。下圖顯示了這種模式。

圖:P2SH 模式

二級標題

比特幣節點分兩個階段驗證這些智能合約交易。首先,對「贖回腳本」進行哈希處理,並對照「鎖定腳本」中的哈希值進行檢查。如果它們匹配,則用「鎖定腳本」去解鎖「贖回腳本」,就好像「贖回腳本」才是初始的鎖定腳本一樣。

這些部署上的差異鼓勵綜合使用這兩種智能合約。一個很好的例子是LocalCryptos,它支持以太坊和比特幣的非託管本地交易。對於以太坊,它使用一個大的智能合約來跟踪所有交易,而對於比特幣,它為每筆交易創建單獨的合約。

二級標題

儘管這些高級語言在比特幣中不太重要,但它們確實存在。 Ivy 是比特幣中「最精緻」的高級語言,該語言由Dan Robinson 於2017 年創建。下圖給出了一個用Ivy 編寫的智能合約示例。如果接收者未及時使用該合同,則該合約可用於發送可以由發送者收回的款項。

圖片描述

最近,Blockstream 的幾位研究人員發布了Miniscript,該語言專注於智能合約的分析和可組合性,而不是抽象底層系統。考慮到比特幣合約往往缺乏抽象的複雜性,這似乎是正確的道路。

二級標題

上文一方面是以太坊,它能夠創建許多功能強大且有用的智能合約,這些合約完全存在於以太坊鏈上,同時,由於其有狀態(Stateful)的性質,它還提出了擴展性問題。另一方面,比特幣的智能合約無狀態(Stateless)模型允許對智能合約交易進行獨立,簡單的驗證,但是其腳本系統限制了合同的實用性。

圖片描述

BCH 的功能升級要了解比特幣現金智能合約的可能性,我們需要查看其半年兩次的網絡升級。自2017 年最初的硬分叉以來,每年5 月和11 月都將執行這些網絡升級。我們特別討論了對比特幣腳本引擎的更改,儘管已進行了其他一些改進,例如Schnorr 簽名。

在比特幣的早期,由於一些操作碼不安全使用而被禁用。在比特幣現金分叉之後的第一年內,比特幣-ABC 節點的開發人員解決了這些問題,並重新引入了經過稍微修改的功能的操作碼,如下圖所示。最重要的是,該升級使在比特幣腳本中對結構化數據進行編碼和解碼成為可能。

圖片描述

此後半年,在2018 年11 月的比特幣現金網絡升級中發布了另一個新的操作碼。其中包括該更新OP_CHECKDATASIG,它使用戶可以驗證比特幣腳本中任何消息的簽名。如果我們結合2018 年推出的腳本更新,這些更新可用於將新穎有用的智能合約功能引入比特幣現金。

圖片描述

編寫智能合約相對於原始比特幣腳本,比特幣現金的新功能為其智能合約增加了很多額外的複雜性。這使得擁有一個通過高級語言、SDK 和工具提供更高級別抽象層的生態系統變得更加重要。

目前正在處理此問題的兩個大項目是Spedn (由筆名Tendo Pein 創建)和CashScript (由本文作者Rosco Kalis 創建,受以太坊的Solidity 語言的啟發)。儘管它們仍在積極開發中,但這些工具使處理比特幣現金中的智能合約變得更加容易。下文將使用CashScript 代碼片段來闡述一些功能。

可以在下面的HODLVault 示例合同中查看此示例。該合同強制執行HODLing,直到達到一定的BCH / USD 價格為止。所需的BCH / USD 價格供稿由oracle 提供程序發布,並由用戶傳遞到合同中。為了增加分散性,可以將智能合約設置為使用多個數據源,而不是信任單個集中式服務。

圖片描述

保證合同(Covenants)第二個大用例是稱為「保證合同」(Covenants)的技術,該技術的名稱來自物權法中用來限制對象使用的術語。就比特幣現金而言,它限制了智能合約中貨幣的使用。因此,儘管比特幣中的智能合約只能授權一般的貨幣支出,但比特幣現金合約能夠對可支出的金額或收款人的身份施加限制。

轉讓比特幣時,發送者必須提供簽名以授權交易。為了生成此簽名,發送方對交易的哈希表示進行簽名。此哈希稱為Sighash,而實際的交易數據包含在Sighash 原像中。

通過使用_OP_CHECKSIG_和_OP_CHECKDATASIG_具有相同的簽名,我們可以訪問Sighash 數據。數據格式可以在規範中進行檢查,並包含在下面的圖像中。一個重要字段是scriptCode,其中包含智能合約本身的字節碼。另一個是hashOutputs 允許用戶強制執行交易的輸出。

圖:比特幣現金Sighash 數據格式

結論

第一個使用保證合同技術的智能合約是Licho 的Last Will (最後的遺囑),這是一個智能合約,可讓用戶將死者的財產轉移到自己的財產上。合同定義了三個不同的功能。第一種允許繼承者在180 天后索取資金。第二個允許所有者的冷密鑰(ColdKey)以任何方式花錢。第三個允許所有者的熱密鑰(Hot Key)通過強制將全部合約餘額發送回合約來刷新180 天的期限。

展望未來

這是有用的保證合同的簡單示例之一,但是保證合同可實現甚至更複雜的功能。在《Last Will》合約簽訂後,其創建者Karol Trzeszczkowski 繼續創建了Mecenas,該公司可強制執行Patreon 等定期付款。

結論

保證合同最初是在題為《 Bitcoin Covenants》的論文中提出的,該論文需要一個新的操作碼_OP_CHECKOUTPUTVERIFY_。隨後提出了其他建議,例如_OP_CHECKTEMPLATEVERIFY_或_OP_CHECKSIGFROMSTACK_。後者與比特幣現金的盟約實施非常相似。可在Tendo Pein 的文章中學習到保證合同的更多信息。

开发者
ETH
BTC
歡迎加入Odaily官方社群