FISCO BCOS 2.0原理解析:預編譯合約架構設計

FISCO BCOS 2.0提出了一套預編譯合約框架,允許用戶使用C++來寫智能合約。由於不進入EVM執行,預編譯合約可以獲得更高的性能,適用於合約邏輯簡單但調用頻繁,或者合約邏輯固定而計算量大的場景。

本文介紹預編譯合約的起源和實現,主要包括以下幾個方面:

  • Solidity合約的使用及遇到的難題;

  • FISCO BCOS 2.0新增預編譯合約,其架構設計和執行流程流程;

  • 在部分特定場景中,爲什麼預編譯合約比Solidity更優秀;

  • 預編譯合約在FISCO BCOS 2.0版本中的使用。

 

Solidity合約的使用與不足

 

在FISCO BCOS平臺中使用Solidity合約,一般需經過以下五個步驟。在開發完Solidity合約之後,必須要將編譯後的合約部署到底層平臺,根據平臺返回的地址才能夠調用合約的接口。

 

Solidity合約的優點是完全與以太坊兼容,開發資源豐富且比較通用,但是Solidity合約也存在虛擬機執行性能低、代價高和開發複雜的問題。尤其是對於聯盟鏈治理的場景,一些參數需要鏈上所有節點保持一致,非常適合使用合約管理,但如果使用Solidity實現,會導部署步驟非!常!復!雜!

FISCO-BCOS 1.3版本使用Solidity實現了一套系統合約,使用一個代理合約管理其他系統合約。其部署過程如下圖所示:

部署完系統合約後,需要將系統合約地址配置在代理合約中,然後將代理合約地址配置在節點配置文件並重啓,才能調用這一套系統治理的合約,並且之後的節點擴容也需要基於創世節點的配置操作,才能保持一致。

 

FISCO BCOS 2.0 新增預編譯合約

 

FISCO BCOS 2.0受以太坊內置合約啓發,實現了一套預編譯合約框架。未來,我們還會嘗試將現有的典型業務場景抽象,開發成預編譯合約模板,作爲底層提供的基礎能力,幫助用戶更快的更方便的在業務中使用FISCO BCOS。

 

預編譯合約的好處

可訪問分佈式存儲接口:基於這套框架,用戶可以訪問本地DB存儲狀態,實現自己需要的任何邏輯。

更好的性能表現:由於實現是C++代碼,會編譯在底層中,不需要進入EVM執行,可以有更好的性能。

無需學習Solidity語言即可上手:基於FISCO BCOS預編譯合約框架,開發者可以使用C++開發自己的預編譯合約,快速實現需要的業務邏輯,而不需要學習Solidity語言。

並行模型大幅提升處理能力:我們在2.0版本中基於預編譯合約和DAG實現了合約的並行執行,用戶只需要指定接口衝突域,底層會自動根據衝突域構建交易依賴關係圖,根據依賴關係儘可能並行執行交易,從而使得交易處理能力大幅提升。

 

預編譯合約與以太坊內置合約的對比

上述說到,FISCO BCOS 預編譯合約受以太坊內置合約啓發,但實現原理卻是大不相同的。

以太坊通過內置合約來避免EVM中複雜計算的代價,以太坊當前使用內置合約實現了8個函數(如下表所示)。可以看到,以太坊內置合約佔用了0x1-0x8這8個地址,每個內置合約實際上就是一個本地函數的調用,只能用於狀態無關的計算使用。

用戶在Solidity中使用內置合約,需要藉助call這個操作,依次輸入下列參數

call(gasLimit, to, value, inputOffset, inputSize, outputOffset, outputSize)

包括內置合約地址、輸入參數偏移、輸入參數大小、輸出參數偏移和輸出參數大小,對用戶而言,這不是一件簡單的事情。

而FISCO BCOS的預編譯合約框架,支持複雜的參數類型,支持通過AMDB讀取和存儲數據。每個預編譯合約地址固定,合約內可以實現多個接口,所實現接口的調用方式與原生Solidity完全相同。

 

下圖是比較直觀的對比:

注:√ 代表支持,× 代表不支持

 

FISCO BCOS預編譯合約架構

 

通過這一小節,你可以清楚瞭解預編譯合約模塊在FISCO BCOS中的位置,以及預編譯合約的執行流程。

如下圖所示,預編譯合約會被區塊執行引擎所調用,區塊驗證器通過區塊執行引擎來執行區塊,執行引擎執行區塊時,會根據被調用合約的地址,來判斷使用EVM還是預編譯合約引擎。

當被調用的合約地址是EVM合約時,執行引擎會創建並執行EVM來執行交易;當被調用合約地址是已註冊的預編譯合約地址時,執行引擎通過調用地址對應的預編譯合約接口來執行交易。

 

預編譯合約執行流程如下圖所示:

執行引擎首先根據預編譯合約地址拿到合約對象,然後通過調用合約對象的call接口來獲取執行結果。call接口中的操作主要包括:

  1. 根據調用參數解析出被調用的接口

  2. 根據ABI編碼解析傳入的參數

  3. 執行被調用的合約接口

  4. 將執行結果ABI編碼並返回


所以,開發者如果要開發預編譯合約,只需要實現其預編譯合約的call接口和在執行引擎中註冊所實現合約的地址即可。

 

預編譯合約在FISCO BCOS 2.0中的應用

 

系統合約

FISCO BCOS 2.0 基於預編譯合約實現了一套系統合約,使用系統合約來管理需要共識的鏈配置,包括對羣組內節點的加入、刪除、節點身份的轉換、CNS服務的管理、鏈權限的管理、CRUD合約的使用等。

FISCO BCOS當前系統合約及地址如下表:

 

CRUD合約支持

FISCO BCOS 2.0基於預編譯合約實現了AMDB存儲對應的預編譯合約,使得用戶能夠在Solidity中訪問AMDB存儲,也就是FISCO BCOS 2.0的CRUD合約寫法。通過這種方式,用戶可以將合約數據存儲在底層的AMDB存儲中,使得合約邏輯與數據分離,一方面提高合約處理性能,一方面使得升級合約邏輯更加方便。


 

我們鼓勵機構成員、開發者等社區夥伴參與開源共建事業,有你在一起,會更了不起。多樣參與方式:

1 進入微信社羣,隨時隨地與圈內最活躍、最頂尖的團隊暢聊技術話題(進羣請添加小助手微信,微信ID:fiscobcosfan);

2 訂閱我們的公衆號:“FISCO BCOS開源社區”,我們爲你準備了開發資料庫、最新FISCO BCOS動態、活動、大賽等信息;

3 來Meetup與開發團隊面對面交流,FISCO BCOS正在全國舉辦巡迴Meetup,深圳、北京、上海、成都……歡迎您公衆號在菜單欄【找活動】中找到附近的Meetup,前往結識技術大咖,暢聊硬核技術;

4 參與代碼貢獻,您可以在Github提交Issue進行問題交流,歡迎向FISCO BCOS提交Pull Request,包括但不限於文檔修改、修復發現的bug、提交新的功能特性。

代碼貢獻指引:

https://github.com/FISCO-BCOS/FISCO-BCOS/blob/master/docs/CONTRIBUTING_CN.md

 

本文首發於公衆號【FISCO BCOS開源社區】,如轉載請註明出處,原創不易,謝謝珍惜

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章