百度超級鏈突破智慧合約效能極限

買賣虛擬貨幣
關注區塊鏈的人,經常會聽到有關“智慧合約”的討論。智慧合約允許在沒有第三方的情況下進行可信交易,這些交易可追蹤且不可逆轉,是區塊鏈技術的關鍵。百度超級鏈在智慧合約上也進行了深入研發,實現高效能,且支援多種語言編寫,大大提高合約使用效率。本期超級鏈學院線上微課堂就帶你突破以往智慧合約的效能極限!明星講師超哥將主要圍繞以下幾點展開: 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語句的子blockif (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 admin@chaindaily --amount 1000000004.部署合約到剛才建立的合約賬號下 xchain-cli wasm deploy $path_to_contract/erc20.wasm -n erc20 --account admin@chaindaily -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,記憶體,磁碟等;具體兌換比例參照原始碼,當然開發者也可以透過提案投票的方式來更改這些引數。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;