關注區塊鏈的人,經常會聽到有關“智能合約”的討論。智能合約允許在沒有第三方的情況下進行可信交易,這些交易可追蹤且不可逆轉,是區塊鏈技術的關鍵。百度超級鏈在智能合約上也進行了深入研發,實現高性能,且支持多種語言編寫,大大提高合約使用效率。
本期超級鏈學院線上微課堂就帶你突破以往智能合約的性能極限!明星講師超哥將主要圍繞以下幾點展開:
1.超級鏈智能合約有哪些特點?
2.超級鏈智能合約與以太坊的異同點?
3.超級鏈智能合約執行的運行模式是怎樣的?
4.超級鏈智能合約如何做到高性能?
5.超級鏈智能合約能為開發者提供的能力?
快來繼續往下看吧!
Q1:什么是智能合約?
智能合約(英語:Smart contract )是一種旨在以信息化方式傳播、驗證或執行合同的計算機協議。智能合約允許在沒有第三方的情況下進行可信交易,這些交易可追蹤且不可逆轉。智能合約概念于1995年由Nick Szabo首次提出。
智能合約的目的是提供優于傳統合約的安全方法,并減少與合約相關的其他交易成本。
Q2:超級鏈的智能合約有什么特點
1.多語言支持,支持C++/Go等高級語言。
2.高性能,獨創的XuperModel數據模型來最大化合約并行執行能力。
3.安全,支持合約資源審計以及屏蔽操作系統接口,保證合約安全。
4.可擴展性,可以擴展合約的多語言以及鏈上資源的訪問能力。
5.隔離性, 不同合約調用之間互不影響。
確定性,同樣的參數和環境下得到一致的結果。
Q3:超級鏈智能合約跟hyperledger fabric合約的異同點
相同點:
1.超級鏈和fabric的智能合約都使用了兩階段提交的預執行模型,最大化的并發合約的執行
2.超級鏈和fabric都可以使用高級語言,如go等編寫智能合約,降低合約的開發門檻。
不同點:
1.fabric的合約是運行在docker的常駐進程,一個不規范的合約會導致多次合約調用互相影響,如全局變量的使用等。超級鏈的每次合約調用都會啟動一個單獨的合約上下文,結合ModelCache,徹底做到多次合約調用相互隔離,互不影響。
2.fabric的合約沒有對合約的資源做限制,理論上合約里面的一個死循環會導致合約無法順利執行。超級鏈的智能合約會設置資源的上限(cpu,內存等),一旦合約的執行超過上限會自動停止,杜絕死循環的情況發生。
3.合約里面的代碼還是會訪問系統的一些資源,比如文件系統,隨機數等,都會導致合約的不確定性。超級鏈的智能合約對任何訪問系統資源的系統調用都做了隔離,是一個行為完全可控的沙盒環境,不會出現不確定的行為。
Q4:超級鏈智能合約跟以太坊合約的異同點
相同點:
1.超級鏈和以太坊的智能合約都具有確定性,即相同的輸入得到相同的輸出。
2.超級鏈和以太坊的智能合約都支持合約的資源審計,從而保證合約安全。
不同點:
1.目前以太坊的合約虛擬機是EVM,里面的大部分指令都是256bit的,導致性能比較低。超級鏈使用的合約指令是WASM,是運行于瀏覽器的匯編指令,有Google,Apple,Molliza, Microsoft四大公司聯合貢獻,指令接近機器匯編,性能很高。
2.目前運行于以太坊的語言主要是Sodility,通過編譯成EVM的字節碼從而運行在以太坊上,然而由于EVM的很多指令跟以太坊的功能高度耦合,導致通用編程語言很難編譯到EVM指令上,因此以太坊的多語言支持比較弱。超級鏈得益于WASM指令,很多高級語言都可以編譯到WASM上,如C++,Go,Rust等,另外超級鏈使用了XuperBridge來擴展合約訪問鏈上的能力,跟指令解耦,有更好的擴展能力。
Q5:超級鏈智能合約是怎么運行WASM指令的
超級鏈合約執行有兩種運行模式,
1.一種是解釋執行,這種模式在讀取合約代碼之后,首先把合約代碼翻譯成一種內存數據結構,之后根據指令類型逐條執行,類比傳統的解釋型語言的解釋器。這種模式的優點是部署合約比較快,缺點是性能比較慢一些。
2.另一種是編譯執行,這種模式在讀取合約代碼之后,首先把合約翻譯成native cpu指令,如x86指令,之后交給cpu來運行編譯之后的指令。這種模式的優點是運行速度很快,缺點是由于需要預先編譯,部署速度會比較慢,但編譯是一次性動作,后續執行直接復用編譯結果。
Q6:超級鏈智能合約是如何支持資源統計的
主要分三步:
第一步:分析合約的字節碼,根據字節碼分函數構建出一個控制流圖。什么是控制流圖呢?我們大體上把合約的指令按照是否會引起跳轉分為兩類,一類是順序執行的指令,如add, load等;一類是loop,if等會引起跳轉的指令,而控制流圖就是一個以控制指令為節點的能表現合約的指令流向的一個圖。
第二步,有了控制流圖我們就可以插入資源檢查的指令了,我們把所有的控制指令的子指令序列看做一個鏈表,如下面代碼所示的if語句的子block
if (flag) {
n += 1;
sum += n;
}
由于非跳轉指令是順序執行的,我們只需要在鏈表的開頭加上檢查資源的指令就可以了,不需要在每個指令后面都加上資源檢查。
第三步,在翻譯為機器碼或者解釋器解釋到資源檢查指令的時候,根據當前已經累加的資源counter比對limit值,如果超出則直接終止虛擬機的執行,否則繼續執行。
Q7:超級鏈智能合約是怎么通過XuperBridge來擴展鏈上能力的
XuperBridge設計了一套標準接口以及序列化方法,合約虛擬機只需要把不同語言的不同訪問方式統一為XuperBridge的接口形式就可以訪問鏈上資源,在形式上類似我們平時用的RPC調用,當我們需要擴展接口的時候只需要增加新的接口方法就行,超級鏈正是通過這種形式支持了多種虛擬機,如WASM,Docker,EVM等,而不需要為每一種虛擬機設計一種接口來訪問鏈上資源。
Q8:超級鏈智能合約是怎么做到高性能的
超級鏈合約主要從以下幾個方面來做到高性能:
1.合約指令選取的是WASM,WASM自身本身就比較貼近硬件底層,因此性能比較好。
2.合約虛擬機支持翻譯合約指令到native指令,運行速度接近native程序。
3.合約的執行分兩步,第一步是預執行,每個合約運行的時候都有一個唯一的上下文來隔離不同的合約運行,上下文里面會收集合約執行過程中對數據的讀寫結果,執行完畢后會生成一個對數據修改的讀寫集;第二步,把讀寫集上鏈打包成交易上鏈,這個時候通過XuperModel會對讀寫集進行沖突檢測,如果兩個讀寫集沒有任何沖突則直接通過,有沖突的則會失敗。正是通過這種方式來最大化合約的并行執行和校驗能力。
Q9:基于超級鏈智能合約能做什么
目前的超級鏈智能合約提供了如下能力:
· 設置合約方法的ACL以控制不同的合約方法訪問權限。
· 以KV的形式存儲數據到鏈上和以及查詢鏈上數據。
· 跨合約調用的能力,不同合約之間可以直接互通調用。
· 轉賬給合約以及從合約轉出
· 查詢歷史交易以及區塊
后續會逐漸加上一些新的功能,如SQL和文件系統的接口來豐富合約的功能
Q10:怎么部署一個超級鏈的智能合約
以超級鏈example目錄下的ERC20合約為例,需要以下步驟:
1. 編譯合約,進入到源代碼的contractsdk/cpp目錄,執行build.sh腳本
2.準備合約賬戶,調用xchain-cli account new --account 1111111111111111 來創建合約賬號,合約必須部署到合約賬號下
3.保證合約賬號有充足的token,因此我們轉給合約賬戶一些token xchain-cli transfer --to XC1111111111111111@xuper --amount 100000000
4.部署合約到剛才創建的合約賬號下 xchain-cli wasm deploy $path_to_contract/erc20.wasm -n erc20 --account XC1111111111111111@xuper -a ‘{“totalSupply”:“10000000”}’
至此一個ERC20合約已經部署上鏈,后續可以調用合約的相關接口來使用合約,具體文檔見https://xuperchain.readthedocs.io/zh/latest/advanced_usage/create_contracts.html
需要注意事項如下:
1.不同語言的合約需要在部署的時候需要指明各自的runtime,否則會部署失敗
2.合約賬號需要充足的token來部署合約
Q11:哪里能找到更多的超級鏈智能合約例子
超級鏈開源代碼里面包含了一些使用合約的例子,涵蓋了ERC20,ERC721,存證等合約例子,后續會有更多的示例給大家。
分享結束后,群里涌現出的精彩問題,摘取部分分享給各位。
問:是不是所有區塊鏈應用都必須要有智能合約?
答:自從以太坊發明了在區塊鏈上運行智能合約后,智能合約幾乎已經成為了新鏈的標配。因為有了智能合約,開發者就可以表達復雜的業務邏輯,在之前這些邏輯可能都是鏈下行為,不夠“區塊鏈”,可以說智能合約讓區塊鏈進入了2.0。
問:智能合約中有對關聯數據的直接查詢嗎。還是說通過關鍵字段再查另外數據?因為c++語言是可以有主鍵設置類似的,但是go語言就沒有這樣的設置。
答:目前智能合約里面的數據是KV的形式存儲的,可以認為唯一的主鍵就是key,c++中包裝了一個table的數據接口來輔助生成多索引,go里面目前還沒有這樣的數據結構。后面可以期待一下超級鏈合約支持SQL。
問:如果有三個硬盤存儲數據,不同的數據業務可以通過指定方式放到指定硬盤嗎?
答:目前超級鏈支持多盤部署,但按照業務劃分硬盤暫時不支持。
問:請問智能合約什么時候可以支持java語言編寫?
答:Java語言的支持在計劃中,可能先以native合約的形式提供,WASM的支持在調研中。
問:可以跨智能合約調用嗎?如果智能合約不在同一條鏈上也可以調用嗎?
答:多個智能合約之間可以互相調用,前提是得有對應的權限。但是目前超級鏈的智能合約只能在一個鏈上互通,多鏈技術正在研發中。
問:目前,超級鏈智能合約支持哪些資源消耗統計啊?它們與gas的兌換比例是如何衡量的?
答:支持資源消耗統計的有:CPU,內存,磁盤等;具體兌換比例參照源碼,當然開發者也可以通過提案投票的方式來更改這些參數。
責任編輯:ct
評論
查看更多