EOSIO/eos 目前在github的项目活跃度方面排名第一,release版本更新的速度让人应接不暇。今天EOS的大版本1.1发布,我也有幸参与了贡献,本篇文章重点介绍1.1版本的重大功能升级。
关键字:eos, eos 1.1, MongoDB,Read-Mode: HEAD,sync,优雅退出,keosd的硬件支持
MongoDB plugin
我们知道目前eos的本地存储结构是简单的文件存储,对于备份和数据查询等管理角度,略显尴尬。新版本推出了MongoDB插件eosio::mongo_db_plugin,
eosio::mongo_db_plugin 将区块链数据归档至MongoDB数据库中。
这份区块链的数据是只读的,支持高可扩展以及方便的数据查询工作。
支持部署和访问一个MongoDB集群。
通过对源码的浏览,可以查看到该插件支持的主要函数功能:
void consume_blocks(); // 消费区块
void accepted_block( const chain::block_state_ptr& );
void applied_irreversible_block(const chain::block_state_ptr&);
void accepted_transaction(const chain::transaction_metadata_ptr&);
void applied_transaction(const chain::transaction_trace_ptr&);
这些功能有消费区块、接收区块、应用不可逆区块、接收交易、应用交易,在这些功能函数的实现中,也看到队列的使用,很可能我们未来不必自己引入第三方队列而直接使用这些新特性即可。这些功能从字面上就能感受到背后的潜力,未来会单独介绍这个插件。
Read-Mode: HEAD
配置nodeos为“只读头区块”模式,意味着所有RPC请求都会返回头区块的数据,头区块就是最新的一个区块。
它的含义主旨要抓住:就是它不会读取未确认的,或者花费在p2p网络中延迟的交易。
这个模式也跟我们之前讨论的交易确认的方案分析形成互动。我们可以通过这个模式下的请求判断出某个交易是至少被一个生产者确认的,但可能还没有最终定局。
nodeos的性能提升
一、同步速度加快
之前,一个新节点加入区块链时,需要尝试保持一个良好的网络状态,然后验证以及转播它接收到的交易。如果链数据有很大一部分需要同步到新节点,数据的验证准确度会降低,验证的耗费也会增多。所以新版本中:
新节点不转播交易,在它没完成数据同步之前。这样可以提高新节点同步的速度。
二、数据库大小警卫
EOSIO是通过两个内存数据库存储数据:一个是state DB,一个是reversible block DB。现在使用警卫保护:
- 允许运行的实例nodeos检测即将到来的限制
- 优雅退出,防止可怕的BAD_ALLOC异常引发的数据库脏数据,必须要replay整条链进行修复。这是一个从dawn3.0就困扰我的问题。
- 现在恢复一个数据库的操作,就像修改单个配置一样容易
- 重新启动的这个过程,再也不需要replay或resync的操作了。
Alpha:keosd的硬件支持
我们都知道,区块链的账户的私钥的保管是一个问题,登陆验证身份的过程也很容易涉及安全的风险,从1.1开始,正式引入了对keosd的硬件支持,当前目前仍旧是测试版本,还未成为生产版本。
Apple's Secure Enclave
使用苹果电脑的人们目前可通过Secure Enclave提供的基于硬件的秘钥保护他们的EOSIO账户。通过命令
cleos wallet create_key -n SecureEnclave
使用Secure Enclave wallet来创建key,不需要import操作。另外,mac中你要访问Secure Enclave的行为必须被签名。
YubiHSM 2
YubiHSM 2是一个外部硬件安全模块,可添加到任何用户的电脑通过USB端口。keosd现在允许任何使用Linux发行版和MacOS的用户保护他们的EOSIO账户,通过YUbiHSM 2提供的基于硬件的秘钥。这个手段可能会被生产者大量使用。
login 插件
登录插件是第一个支持基于EOSIO blockchain的应用验证概念的组件。插件API允许您来验证一个用户是否能够签名满足指定的权限。
目前login插件只是初步的设计,并无法上生产环境,就像存在了好几个版本的MongoDB插件在当前这个版本才被正式推出一样,login插件日后还会迎来大量修改。
其他的重要改变
- cleos以及rpc可通过二级索引读取table数据
- 多签名合约eosio.msig可以提案一个包含多个actions的transaction
- 添加系统账户eosio.sudo,这个账户只有超过三分之二绝对多数的active 区块生产者才能使用,它的子命令exec可以绕过所有的权限检查
- 发行原子的delegatebw / buyram事务,解决了账户余额足够却无法购买内存的和抵押cpu资源。
- 使用KiB 来购买内存,buyram
- 改进了错误提示,这些错误一般都是在校验环节,原来的错误日志很模糊不清晰
- RPC可以获取定时事务
- nodeos提供灰名单账户,阻止其访问资源在一个无人认领的拥堵链
- nodeos更好的控制块传输的时间,来弥补生产者之间的网络延迟,使用参数produce_time_offset_us
- nodeos检查点(通过signal emit的方式)可以在同步期间,执行确权块上链,共识相关。
- 支持导入导出可逆块数据库作为便携式文件格式,这个特性可以在数据备份设计中使用
- 提高生产者水印追踪,解决生产者出块后落选再次选中出块以后造成confirmed值延续很高的bug
- 日志更新使用ISO国际标准化时间戳