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