EOSIO 2.0 - 增強性能,提高安全性和新的開發人員工具
版本歷史
- block.one在2018年6月正式發佈EOSIO 1.0版本
- block.one在2019年6月1日發佈會上正式宣佈推出EOSIO 2.0
- block.one在2020年1月10日正式發佈EOSIO 2.0版本
總覽
- EOS VM
- 網絡代碼多線程
- WebAuthn
- 加權閾值多簽名區塊生產
- EOSIO Quickstart Web IDE
- Chain API
提高性能(更快)
1. EOS-VM
不同於以太坊的EVM,EOS有自己獨立的一套基於WebAssembly的智能合約引擎。
- 2018年6月block.one發佈WebAssembly編譯器Binaryen
- 2018年12月,eos1.3發佈WebAssembly編譯器Wabbit(WABT),處理速度是Binaryen的 2 倍。
- 2019年6月, block.one發佈EOS 2.0的消息,其中包括EOS-VM,這是一種專爲區塊鏈智能合約設計的新型WebAssembly引擎。與EOSIO 1.0(Binaryen)相比,EOS-VM將智能合約的速度提高了 16 倍。
應用場景
要解決的問題: 無限制內存分配,加載時間延長和堆棧溢出 (比如無限遞歸或循環). 從而提升整體性能和可靠性
既提高了一條區塊鏈上的單線程性能,也使得鏈間通信成爲可能,它是實現區塊鏈鏈間通信的第一步
特性:
- 執行速度極快 (節省用戶CPU資源)
- 極快的解析 / 加載
- 高效的限時執行
- 確定性執行 (軟件浮點和硬件浮點選項)
- 爲並行執行的設計
- 支持本機代碼的低開銷調用
- C++ Header Only (純頭文件代碼)
傳統.cpp代碼要求使用者要麼使用底層運行庫兼容的預編譯版本,要麼重新編譯,操作起來非常麻煩,而純頭文件代碼則簡單得多,直接#include就可以了
該引擎由三個組件組成, 三個新的WASM Runtimes
Runtimes | Descript | Configrable | Recommend |
---|---|---|---|
EOS VM解釋器 - EOS VM Interpreter |
從頭開始設計的WASM解釋器,極快的解析/加載 也爲了將來支持智能合約的調試 |
nodeos --wasm-runtime=eos-vm | non-producing nodes |
EOS VM即時編譯器 - EOS VM Just In Time Compiler (JIT) |
a low latency single pass compiler for x86_64 platforms | nodeos --wasm-runtime=eos-vm-jit | BP |
EOS VM優化編譯器 - EOS VM Optimized Compiler |
a high performance WASM tier-up runtime available on the x86_64 Linux platform 性能比JIT快一個數量級 |
nodeos --eos-vm-oc-enable --eos-vm-oc-compile-threads 在後臺優化編譯,保存到 data/code_cache.bin |
non-producing nodes |
任何EOS VM運行時都不需要重播或激活任何共識協議升級。可以隨意在它們之間切換(包括啓用和禁用EOS VM Optimized Compiler)
性能基準測試
以上性能基準顯示了各種EOS VM組件的相對優勢。 EOSIO 2.0將EOS VM JIT作爲大多數智能合約執行的一線編譯器,而EOS VM Optimized Compiler嘗試在後臺編譯相同的智能合約,並將其部署以在鏈上以極快的速度隨後執行。這種分層架構使EOSIO 2.0能夠利用快速啓動和優化的智能合約代碼編譯功能
- binaryen的運行模式是字節碼的方式,運行速度最慢
- wabt是基於棧的虛擬機,運行效率會比binaryen運行效率高
- wavm模式是JIT運行方式,速度快,但是由於需要預編譯,加載速度實在是太慢了,並不能爲Eos的主鏈所用
2. 網絡代碼多線程支持
Block.One還聲稱通過向其添加多線程支持大大改善了區塊鏈的網絡代碼。多線程是中央處理單元同時執行多個執行線程的能力。
改動
- v1.8.x: net_plugin具有線程池功能,只開了一個線程用於P2P服務
- v2.0.0: 向net_plugin添加了多線程支持。現在,net_plugin中的幾乎所有處理,包括區塊傳播,事務處理,區塊/事務打包/解壓縮以及其他進程,都由與主應用程序線程不同的單獨線程來處理。通過隔離這些過程,發現多生產者EOSIO網絡上的事務處理和區塊處理性能有了顯着改善。
- 可由參數
net-threads
配置(默認爲2)控制net_plugin線程池工作線程數
- 可由參數
提高TPS
- EOSIO 1.0版本TPS約爲5000-6000
- 在EOS-VM優化的情況下,EOSIO 2.0版本TPS號稱是原來的4倍,單鏈可以達到2萬左右的TPS(當然這僅僅是在單線程交易中,取決於交易的類型,畢竟每筆交易都有所不同)。
影響TPS的要素
- 塊的大小
- 塊執行時間的限制
- 共識
- 出塊間隔時間
- PBFT的話,和塊的確認時間有關
- Transaction的P2P同步(打包,解壓,發送, 接收等)
- Client 發送交易的RTT
- IO
- 驗籤
- 權限判斷
- 執行智能合約的性能
提高安全性(更安全)
3. WebAuthn
協議
一種廣泛接受的安全身份驗證標準,無需進行瀏覽器擴展或附加軟件即可進行交易簽名(使用硬件簽名設備,例如YubiKey
5)。
WebAuthn是最近由W3C(萬維網聯盟)最終確定的Web身份驗證API標準,並在不同程度上得到Chrome,Firefox和Edge網絡瀏覽器以及某些移動平臺的支持。該標準使用諸如安全密鑰(例如 YubiKey
)之類的身份驗證器或內置平臺身份驗證器(例如生物特徵識別碼)啓用無密碼的主要和多因素用戶身份驗證流程。
背景
EOS 2.0將成爲首個採用WebAuthn協議的區塊鏈網絡。WebAuthn是由萬維網聯盟(W3C)發佈的Web標準。 WebAuthn是FIDO聯盟指導下的FIDO2項目的核心組成部分。該項目的目標是標準化接口,以使用公鑰加密技術對用戶進行基於Web的應用程序和服務的身份驗證。在客戶端可以通過多種方式實現對WebAuthn的支持。Block.one表示,採用WebAuthn協議,EOS應用的安全性和易用性將因此得到提升。
應用場景 (還處於測試階段)
吸引新用戶加入區塊鏈應用程序的主要痛點之一就是保護私鑰和公鑰,如果操作不當,則會帶來安全風險。通過此版本的對WebAuthn
的支持,開發人員可以開始在其EOSIO應用程序中使用WebAuthn測試事務簽名。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-mrNTonOE-1580977741996)(https://github.com/EOSIO/eosio-webauthn-example-app/raw/master/screenshots/screenshot-i.png?raw=true%22)]
示例: EOSIO WebAuthn Example Web App
此示例應用程序演示了在私有鏈上運行的應用程序如何:
- 爲用戶生成與WebAuthn兼容的密鑰
- 瀏覽器提示用戶使用其安全密鑰或內置平臺身份驗證器進行身份驗證
- 用戶使用這些密鑰簽名
預計將發佈其他示例,試圖概述Dapp開發者如何利用WebAuthn進行具有更高安全性的授權機制的 contract actions
實施細節
WebAuthn公鑰以新的前綴開頭PUB_WA
, 包含3個字段:
- prime256v1 / secp256r1壓縮公鑰(與PUB_R1相同的33字節格式)
- 創建WebAuthn簽名時指示用戶存在的單個字節
- 該密鑰的作用域範圍來源(依賴方ID)
三個級別的用戶狀態
- 用戶不存在(儘管無法通過瀏覽器AFAIK使用)
- 用戶在場(例如,這將映射到身份驗證器上的觸摸)
- 用戶驗證(更嚴格的用戶狀態驗證,例如指紋驗證)
WebAuthn簽名以新的前綴開頭SIG_WA。它們包含3個字段:
- prime256v1 / secp256r1 緊湊簽名(與SIG_R1相同的65字節格式)
- 身份驗證者數據-身份驗證者添加的二進制數據和部分簽名。例如,其中包含用戶狀態詳細信息
- 客戶端json-瀏覽器生成的JSON和簽名的一部分。例如,它包含瀏覽器在其中生成簽名的來源。
keosd錢包支持, 在分支webauthn_keosd_wallet
中,仍處實驗階段
硬錢包EOS Yubico Key
在EOS 2.0採用WebAuthn協議的基礎上,block.one和於yubico合作發佈硬件錢包EOS Yubico Key。EOS用戶可以使用 EOS Yubico Key通過WebAuthn簽署鏈上交易。其作用類似於知名的EOS瀏覽器插件錢包scatter。
4. 加權閾值多簽名區塊生產 WTMsig
背景
當前的共識規則要求每個區塊生產者僅需要一個加密區塊簽名密鑰。該密鑰,無論是存儲在磁盤上並通過軟件加載還是由硬件錢包保護,都代表了區塊生產者操作的單點故障隱患。如果該密鑰丟失或暫時無法訪問包含該密鑰的硬件模塊,則區塊生產者別無選擇,只能丟掉區塊,從而影響整個網絡的吞吐量。
實施細節
- 塊生產者可以定義一個閾值和一組加權的公共密鑰,並使用關聯權重之和對塊進行簽名,以使閾值滿足閾值。
- 驗證邏輯將強制所有新塊中的現有
new_producers
字段block_header
必須爲空,無論其來源如何。 block_header_extension
將引入一個新的,用於根據新producer_authority
類型宣佈新的生產者計劃。- 一個新的內在函數
set_proposed_producers_ex
將是有效且可鏈接的- 允許使用舊格式以及新格式
producer_authority
- 允許使用舊格式以及新格式
應用場景
- 旨在爲塊生產者提供完整的高可用性解決方案, 爲冗餘基礎結構提供一個多籤許可層
- 允許BP冗餘部署, 無需共享私鑰等敏感數據
- 允許區塊生產抵禦惡意參與者對該基礎設施某些部分的危害
共識協議升級
WEBAUTHN_KEY
:增加了對WebAuthn密鑰和簽名的支持(#7421)WEBAUTHN_KEY
協議功能的激活意味着eosio::newaccount或eosio::updateauth動作現在可以將WebAuthn公鑰作爲提供的一部分authority- public_key 的類型可以爲 WebAuthn公鑰的序列化
WTMSIG_BLOCK_SIGNATURES
:增加了對塊生產的加權閾值多重簽名(WTMsig)授權的支持eosio.contracts
的版本v1.9.0-rc1regproducer2向eosio.system合同中添加了一個新操作,使塊生產者候選者可以註冊WTMsig
塊簽名授權。(只能部署在已激活WTMSIG_BLOCK_SIGNATURES
協議)
兩個功能都需要通過特權preactivate_feature
內在函數進行激活, 需要獲得絕大多數區塊生產者的批准(eosio.msig)
這兩個協議功能中任何一個的激活將立即排除不支持該協議功能的任何節點(例如,運行v2.0.x之前版本的nodeos的任何節點)
新開發者工具(更簡單)
5. EOSIO Quickstart Web IDE
這個工具在雲服務中運行,使新開發人員能夠建立智能合約和Web應用程序開發環境以及完全集成的單節點個人測試網,因此他們可以在幾分鐘之內從入門到構建。
- 自動部署一個單節點私鏈 nodeos和keosd
- 智能合約的在線IDE, 帶編譯環境, 無需再配置eosio.cdt;
- 使用 cleos 部署調用智能合約
- 單元測試
- DAPP的前端IDE, 帶預覽與調試
應用場景
想解決新開發人員的入門障礙——那些首次前往eosio hackathon或首次在EOSIO上進行開發的開發人員。通常,設置區塊鏈開發環境是一個多步驟的過程,可能需要數小時甚至數天才能完成。這就是爲什麼要構建EOSIO Quickstart Web IDE,這是一個開發工具,它使新開發人員可以在幾分鐘之內從入門到準備就緒。
Setup (目前處於Alphy版本)
https://github.com/EOSIO/eosio-web-ide
https://gitpod.io/#https://github.com/cucubao/eosio-web-ide
- Fork this repo to your personal GitHub account so that you can save your work into your personal Github account.
- browser to the following URL https://gitpod.io/#https://github.com/your-github-account/eosio-web-ide
- … (之後在WEB IDE內按readme操作)
6. Chain API
get_table_rows: 查詢與展示uint128和int128類型數據時, 不再以小端字節序十六進制表示
在uint128和int128ABI類型現在表示爲十進制數,而不是舊的小端十六進制表示。這意味着get_table_rowsRPC 返回的錶行的JSON表示形式將使用與以前版本不同的形式來表示字段。這也意味着使用輔助索引搜索的RPC請求的lower_boundand upper_bound字段將需要使用新的十進制表示形式。此更改使的ABI序列化和ABI類型與eosjs和abieos一致。
在get_table_rows與二次索引類型使用時RPC喜歡sha256,i256和ripemd160有這樣的加擾字節中的錯誤lower_bound和upper_bound輸入字段。現在,此版本解決了這些問題,使客戶端可以使用這些索引類型正確搜索錶行。
參考
- https://github.com/EOSIO/eos/releases/v2.0.0
- https://www.8btc.com/article/545516?from=groupmessage&isappinstalled=0
- https://www.jianshu.com/p/34dbc3f0a4b8
- https://github.com/EOSIO/eos/pull/7421