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接口中的操作主要包括:
根據調用參數解析出被調用的接口
根據ABI編碼解析傳入的參數
執行被調用的合約接口
將執行結果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開源社區】,如轉載請註明出處,原創不易,謝謝珍惜