負熵學會網站對廣義的智能合約是這樣定義的:能夠讓用戶自己定義所需交易邏輯的代碼程序,幾乎存在于所有區塊鏈系統,包括最廣為人知的比特幣,以及以太坊、超級賬本、Parity、Zcash等。
從編程語言表現或者運行環境考慮,智能合約可以分為腳本型、圖靈完備型、可驗證合約型三種。
比特幣系統可以允許通過編寫基于堆棧的操作碼來實現簡單的交易邏輯,比如改變比特幣花費的前提條件,這個系統稱為比特幣腳本系統。以太坊提供一種基于圖靈完備語言的智能合約平臺,也是最早的圖靈完備智能合約。
以太坊系統提供以太坊虛擬機,合約代碼在EVM內部運行。以太坊用戶使用特定語言編寫智能合約代碼,并編譯成EVM字節碼運行。超級賬本提供另一種圖靈完備智能合約,它在Docker容器環境中運行語言無關的智能合約,即智能合約代碼可以使用任何編程語言進行編寫,之后被編譯器編譯并打包進Docker鏡像,以容器作為運行環境。
隨著波卡多鏈系統的發展,開發者針對跨鏈互操作的智能合約設計了新的開發語言。比如波卡的TrustBase項目提供了基于Substrate框架、兼容WebAssembly虛擬機的智能合約開發系統,并自主研發了全新的易用語言Subscript,開發波卡原生完備智能合約。
本文將對比特幣、以太坊和波卡區塊鏈中的智能合約主流開發語言進行梳理闡述。從最初的比特幣腳本語言到如今的Subscript,讀者得以窺見智能合約語言的發展脈絡。
一、比特幣腳本語言
這是一種基于堆棧的逆波蘭式簡單執行語言,它用于編寫比特幣交易中未花費交易輸出的鎖定腳本和解鎖腳本。鎖定腳本確定了花費輸出所需要的條件,而解鎖腳本用來滿足UTXO上鎖定腳本所確定的條件,解鎖并支付。當一條交易被執行時,每個UTXO的解鎖腳本和鎖定腳本同時執行,根據執行結果來判定該筆交易是否滿足支付條件。
比特幣腳本語言被設計得非常簡單,類似于嵌入式裝置,僅可在有限的范圍內執行,可做較簡單的處理。腳本指令被稱為操作碼,分為常量、流程控制、棧操作、算術運算、位運算、密碼學運算、保留字等。后文中提及的OP-DUP等屬于棧操作指令。腳本是非圖靈完備的語言,包含的操作碼不具備循環和復雜的流控制功能,僅可執行有限的次數,避免了因編寫疏忽等原因導致的無限循環或其他類型的邏輯炸彈。比特幣腳本這種有限的執行環境和簡單的執行邏輯,有利于對可編程貨幣的安全性進行驗證,能夠防止形成腳本漏洞而被惡意攻擊者所利用。
杭州Web3 Hub于5月20日揭牌成立:金色財經報道,為更好落實《浙江省元宇宙產業發展行動計劃(2023—2025年)》,重塑杭州數字經濟第一城,加快推動元宇宙技術創新,由杭州上城區委、上城區人民政府主辦的上城區元宇宙產業發展論壇于5月20日舉辦,論壇上杭州Web3 Hub揭牌成立。[2023/5/20 15:15:59]
比特幣系統處理的大多數交易花費都是由“付款至公鑰哈希”腳本鎖定的輸出,即鎖定腳本中包含一個公鑰的哈希值,解鎖時通過包含公鑰和對應私鑰所創建的數字簽名的腳本來驗證。例如,用戶A向用戶B支付一筆交易,鎖定腳本可以表示為:
OP_DUPOP_HASH160〈BPublicKeyHASH〉OP_EQUALVERIFYOP_CHECKSIG
其中,BPublicKeyHASH為用戶B的公鑰的哈希。當用戶B解鎖該筆交易時,使用包含B的數字簽名和公鑰的解鎖腳本:
〈BSignature〉〈BPublicKey〉
比特幣系統中的節點把解鎖腳本與鎖定腳本組合,形成驗證腳本:
〈BSignature〉〈BPublicKey〉OP_DUPOP_HASH160
〈BPublicKeyHASH〉OP_EQUALVERIFYOP_CHECKSIG
該驗證腳本被放入堆棧中執行,輸出結果決定著交易的有效性。
二、以太坊圖靈完備型語言
由于比特幣等腳本語言不具備圖靈完備性,編寫的智能合約交易模式非常有限,只能用于虛擬貨幣類應用,因此VitalikButerin推出了支持圖靈完備語言的以太坊智能合約平臺。以太坊提供了智能合約專用開發語言,其他系統或平臺大多采用通用編程語言。
目前,以太坊提供了2種編程語言:Serpent和Solidity。Solidity在語法上類似于JavaScript,也是以太坊官方推薦的智能合約編程語言,它具有詳細的開發文檔;Serpent語言類似于Python語言,具備簡潔的特性。以太坊曾經提供了Mutan和LLL語言,Mutan是類似于C語言的一種高級語言,但該語言已于兩年前停止維護;LLL語言已經廢棄,官方代碼庫也已經無法訪問。
NFT項目Doodles發布“DOODLEMAP”:金色財經報道,NFT項目Doodles在社交媒體宣布正式推出“DOODLEMAP”,旨在提供Doodles生態系統的可視化表示,同時試圖展示團隊對以太坊生態系統和原始Doodles系列的持續投入。據Doodles首席品牌官Pharrell透露,預計將在2023年的“某個時候”發布Doodles Records:Volume 1。此外作為Doodles以太坊路線圖的一部分,Doodles還將推出“Doodles Records”和“The Stoodio”,目前尚不清楚“The Stoodio”具體內容,但可能是一個藝術或創意性工作室。[2023/3/4 12:41:44]
2.1 Solidity語言
Solidity是一種“面向合約”的高級編程語言,它是專門為編寫運行在EVM上的智能合約而設計的。其語法接近JavaScript,并且支持強類型、繼承、庫以及用戶自定義類型。但Solidity也有其獨特的語言特性:
1)特殊的數據類型———Address。運行在以太坊上的智能合約被當作一個特殊的賬戶———合約賬戶,類似于外部賬戶,合約賬戶也是由一個20字節的地址所定位。因此,Solidity語言設計了用于定義合約地址的Address。
2)靈活的變量聲明。在作用范圍內,狀態變量的定義聲明與調用沒有絕對的順序關系,定義聲明可以在調用語句之后。
3)兩種數據存儲方式:Memory和Storage。Memory類似其他高級語言的變量存儲方式,使用完被回收。默認的函數參數即為Memory類型;然而,在區塊鏈上有非常多的狀態需要永久記錄下來,狀態變量默認保存為Storage類型。在用戶編程過程中,也可以使用關鍵字靈活地手工指定數據的存儲方式。
4)數字貨幣支付屬性。Payable關鍵字使其在代碼層支持以太幣等數字貨幣的支付以及收款操作,使得合約可以接受交易并持有一定數量的貨幣。
Solana鏈上活動持續凍結,驗證者準備第二次嘗試重啟:2月26日消息,Solana網絡的深度凍結仍在繼續,驗證者正在準備第二次重啟嘗試,希望能夠恢復該鏈的用戶服務。
到紐約時間晚上,運行Solana基礎設施的驗證者早已得出結論,解決目前問題的最佳方法是同步重啟并分叉鏈。當驗證者意識到他們選擇了錯誤的重啟點時,第一次嘗試被放棄,進一步延長了延遲時間。
驗證者和開發人員表示,最初的問題是交易處理緩慢,現在已經演變成Solana上的活動幾乎完全中斷,例如停止出塊,交易沒有被處理或驗證。這意味著用戶們的鏈上加密資產不可移動,持續凍結,直到關鍵的后端基礎設施重新上線。
危機發生數小時后,Solana生態系統的關鍵人物仍在尋找事件發生的原因。一個主要的理論是,一個“fat block”影響了該區塊鏈的機制。值得注意的是,在問題開始前不久,該網絡正在升級。
截至發稿時,驗證者與Solana Labs的開發人員合作,再次嘗試重啟區塊鏈,并獲得了70%的stake支持,該網絡需要80%的絕對多數支持才能繼續運作。
另外,Solana Status發推稱,協調重啟正在進行中,以解決從1.13升級到1.14期間導致區塊終結速度顯著變慢的問題。[2023/2/26 12:29:55]
5)支持回滾的異常機制。對于異常事件,不是讓程序去捕獲處理,而是觸發回滾對應的代碼自動處理,從而保證合約中狀態數據的一致性以及合約執行的原子性。
6)嚴格控制可見性。函數和狀態變量共有4種可見性定義,即External,Internal,Public,Private,用來限制函數或狀態變量在合約內外以及繼承關系中的調用和訪問權限。Solidity還支持一些針對智能合約特性的獨特變量,它們作用于全局命名空間,主要用于獲取區塊鏈的相關信息,如表1所列。
初創公司 Solvo 發布用于加密投資的 iOS 應用程序:金色財經報道, 金融應用程序Solvo為對加密貨幣感興趣的投資者提供了一種更簡單、更透明的方式來訪問高質量的加密貨幣產品,它宣布推出其新應用程序和初始功能。Solvo 的候補名單于本周上線,首批 iOS 客戶將被邀請在 10 月份下載該應用程序。
Solvo 是一家在立陶宛注冊的歐盟公司,符合 5AMLD 和 FIU 要求。該公司已提交其 Crypto Exchange 以及 Crypto Custody 注冊。(finextra)[2022/10/1 18:36:39]
2.2Serpent語言
Serpent的設計非常類似于Python,它是一種專門編寫智能合約的高級語言,具備低級語言高效易用的編程風格以及針對智能合約的特性。最新版本的編譯器由C++語言編寫,目的是能夠更廣泛地嵌入客戶端程序。Serpent與Python之間雖然相似,但也有諸多不同之處:
1)Serpent的數值不能大于2256,否則會發生溢出;
2)Serpent不支持Decimal數值類型;
3)Serpent不支持List,Dictionary以及其他一些高級特性;
4)Serpent沒有第一類函數的概念,雖然合約中可以定義函數,也可以調用自己的函數,但是在調用過程中,變量不是永久存在的;
5)類似于Solidity,Serpent支持持久存儲變量的概念,即Storage型變量;
6)類似于Solidity,Serpent可以使用extern語句來調用其他合約,或從其他合約中調用函數;
7)作為運行在區塊鏈上的編程語言,Serpent同樣支持表1中的特殊變量。
2.3可驗證型語言Pact
Pact語言類似于Haskell語言,用于編寫直接運行在Kadena區塊鏈上的智能合約,主要應用于安全性和效率要求較高的商業交易場合。
比特幣獎勵公司GoSats完成400萬美元Pre-A輪融資,Y Combinator等參投:6月1日消息,比特幣獎勵公司GoSats完成400萬美元Pre-A輪融資, Y Combinator、Accel、Gossamer Capital等參投。GoSats計劃利用新資金擴大其業務,包括改進產品、加入更多品牌等。(Tech in Asia)[2022/6/1 3:55:17]
Pact智能合約由3部分構成:tables,Keysets,module。它們分別負責合約的數據存儲、合約授權驗證以及合約代碼code。該語言的主要特點有:語言邏輯結構屬于圖靈非完備,不支持循環和遞歸;代碼人工可讀,并且嵌入式地運行于區塊鏈上;支持組件化設計和導入;支持keyrow和列式數據庫模式;支持類型推斷;支持秘鑰輪換;支持與工業數據庫進行集成。Pact語法設計類似于LISP語言,代碼結構利于快速分析和執行語法樹。下面給出一段計算平均值的函數代碼:
“taketheaverageaandb”
2))
代碼定義了average函數,用于計算兩個數的平均值。這種語法特點能夠使計算機更加快速地執行代碼。
2.4超級賬本智能合約語言
超級賬本智能合約Chaincode一般由Golang編寫,同時也支持其他編程語言,如Java。Go是由RobertGriesemer,RobPike,Ken Thompson從2007年末主持開發,并最終于2009年11月開源的語言,屬于圖靈完備型。每個Go程序都是由包構成的,并且總是從main包開始執行。Go語言具有以下特點:
1)良好的并發機制,程序能夠充分利用多核和聯網機器。Go語言引入了goroutine來實現并發機制,并使用消息傳遞來共享內存。
2)設計簡潔。代碼風格簡潔,格式統一,閱讀性和可維護性高。該語言只有25個關鍵字,但能夠支持大部分其他編程語言支持的特性,如繼承、重載、對象等。
3)內嵌C語言支持。該語言可以直接包含C語言代碼,利用現有的豐富C程序庫。
4)錯誤處理。Go語言使用3個關鍵字來處理異常錯誤,與Java語言的Try-Catch模塊不同,能夠大大減少處理異常的代碼量。
5)支持自動垃圾回收。Go語言中不需要delete關鍵字,也不需要free方法來明確釋放內存。
2.5TrustBase智能合約語言
TrustBase平行鏈的開發語言Subscript是為WASM設計的原生智能合約語言,可以支持任何和Substrate架構兼容的智能合約開發平臺,開發波卡原生智能合約。
同時TrustBase平行鏈開發了支持Subscript語言的IDE和測試工具。Subscript提供以下開發工具來構建完善的合約開發生態:
1)Subscriptworkbench:基于瀏覽器的IDE開發環境;
2)Subscriptonechain:TrustBase的合約鏈;
3)SubscriptTempest:智能合約測試和驗證框架;
Subscript使用基于賬戶的方式進行數據的存儲,并以交易的形式部署合約。已部署的智能合約帶有狀態租金,租金用完合約就會暫停。這種設計與Polkadot智能合約跨鏈執行的生態有很好的相性。
基于Subscript開發的智能合約可以升級,這一點類似Solidity合約。合約的庫函數在合約語言中自帶實現(as實現),包含基本的密碼學函數,鏈上信息(隨機數、區塊高度、區塊時間等),以及智能合約操作(轉賬、調用其他合約、調用鏈上模塊)。
由于Subscript語言有著更易于理解的語義,利于開發者對圖靈完備的靈活性利用,使得基于Subscript開發的智能合約將更少地出現安全漏洞。
Subscript從API到語法都為WASM而設計,整體使用嚴格類型和語言檢查,同時提供了范型功能支持第三方庫的封裝,具體實現如下:
a、靜態的語法檢查。與針對動態類型運行環境的TypeScript不同,Subscript在編譯時具有嚴格的靜態語法檢查,避免了無法提前有效編譯TypeScript的動態特征。通過分配或推斷確定的類型,編譯器能夠從執行開始就產生可預測的性能,同時保證所產生的WASM目標代碼很小。
b、嚴格的類型。Subscript中的基礎類型為WASM標準而設計,使用WASM特定的整數和浮點類型。在處理數值類型時允許開發人員實現制定數值的理想類型。
c、底層訪問支持。智能合約與沙盒外環境交互時,能夠傳遞的參數僅限于基本的整數類型。Subscript提供了完備的語法可以用來定義外部接口類型。Subscript還自帶可訪問WASM底層的指令函數,提供整數運算,虛擬機棧訪問,內存加載等操作。
d、范型支持。能夠定義范型類型來支持代碼的復用,Subscript通過范型定義了一系列可復用的庫函數。
在庫函數方面,Subscript提供了豐富的庫函數供開發者調用,庫函數分為標準庫、核心庫、擴展庫三個部分。
2.5.1Subscript庫函數
Subscript標準庫包含了基本的數學運算、數組操作、字符串處理以及內存訪問等功能;Subscript核心庫(CoreLib)在合約代碼中可以通過函數直接訪問,如:
1、包含基本的密碼學函數,blake2b,sha3,sha256
2、鏈上信息(隨機數、區塊高度、區塊時間等)
3、智能合約轉賬、調用其他合約、調用鏈上其他模塊(XCMP跨鏈消息、質押、治理等)
Subscript擴展庫(SupportLib)是一個模塊化的合約庫函數集合,包括了眾多常用的合約模版。開發者通過擴展庫中的合約模版,可以自動集成當前廣泛使用的合約功能,增強合約的安全性,避免重復開發基礎功能。擴展庫包含的合約函數有:
1、ERC20兼容合約,提供和ERC20接口兼容的代幣庫函數
2、ERC721兼容合約,支持創建非同質化代幣
3、權限控制合約,通過使用合約基礎類為擴展合約提供基于賬戶的權限控制功能
4、代理合約,通過抽象合約接口實現合約的可升級功能
5、治理合約,提供通過投票實現的鏈上治理
6、多簽合約,能夠支持多種賬戶格式的多簽地址合約
三、波卡跨鏈智能合約語言對比
由于Subscript是針對波卡Polkadot跨鏈智能合約生態專門研發的語言,所以Subscript拿來與Parity基于rust開發的ink!語言進行比較最為合適。相比之下,Subscript提供了更加易用的特性:
1)無需rust開發基礎,Web開發者可以快速入門;
2)與JavaScript良好的互操作特性,便于與Dapp的集成;與javascript的交互性在于可以方便的使用javascript,typescript測試合約接口,模擬合約行為。
3)易用的開發環境支持,可以基于現有的jsIDE運行部署和測試。
表2對文中出現的所有語言特性進行對比
除了表中列舉的常用特性外,Subscript語言實現了基于波卡Substrate框架的WASM虛擬機兼容。不同于Solidity的EVM兼容,WASM與波卡分片多鏈結構有著更好的向后兼容能力。開發者使用Subscript語言開發波卡智能合約,不會產生類似以太坊智能合約平臺的歷史包袱,隨著未來波卡Polkadot平行鏈生態的豐富,這一點將變得至關重要。
四、結語
本文筆者從比特幣腳本語言開始,闡述了智能合約開發語言的發展歷程,并剖析了波卡跨鏈智能合約語言Subscript的特性。2020年9月,Subscript語言陸續完成了前期的開發和調試,并獲得了Web3基金會Grant認證。可以看出隨著區塊鏈不同賽道的發展,尤其是Polkadot波卡的跨鏈智能合約賽道的出現,與賽道要求適配的新生語言將被更多的開發者嘗試與使用。
來源:金色財經
金佳說幣:12.19大餅晚間行情分與操作策略從4小時圖來看,目前價格23040置附近波動,MACD紅色動量持續放量,KDJ三線目前處于50軸上方形成死叉后向上發散,CCII線常態區運行.
1900/1/1 0:00:00-------前言 每天行情波折不斷,我所能做的就是用我多年的經驗,帶領各位投朋友走向市場前端,給你想要的幫助.
1900/1/1 0:00:00比特幣23000美元了,香嗎?比特幣都已經23000美元,10萬美元還會遠嗎?你覺得,比特幣會超過10萬美元嗎?HUSD 跌至 0.87 美元,24 小時跌幅 11.9%:金色財經消息.
1900/1/1 0:00:00BTC行情分析 灰度、BB等全球加密資產管理公司,不斷加持BTC;香港證監會也頒發了加密貨幣交易所的第一張牌照,香港OSL交易所;意味著中國正在走向加密貨幣合法交易的正軌上面,這些基本面的變化.
1900/1/1 0:00:00LBank將于2020年12月18日16:30?(UTC+8)上線GRT,具體如下:開啟交易對:GRT/USDT開啟充值時間:2020.12.18?15:30?(UTC+8)Worldcoin:.
1900/1/1 0:00:00金色財經區塊鏈12月19日訊??提起十二年前那場海嘯般的次貸危機,仿佛一切還歷歷在目。起因是美國第四大投資銀行雷曼兄弟以高達6130億美元的巨額負債宣布破產.
1900/1/1 0:00:00