自 Everest v1.0 发布,IOST 开发团队已进入主网上线的筹备期,对 IOST 网络的性能、去中心化和安全性、以及对开发者和用户的友好性进行了大量改进和优化工作。在 GitHub 代码更新长期名列前茅的同时,IOST 开发团队始终按时向社区公布详细的技术进展周报,并在全球范围内启动了开发者激励计划,已吸引大量优秀开发者加入 IOST 网络和生态的开发建设中。
Everest v2.0 是主网上线前最重要的阶段性里程碑,将为主网的如期上线奠定坚实基础。今天,我们很高兴宣布 Everest v2.0 正式上线!
Everest v2.0 已包含主网 Mainnet v1.0 的所有基本功能,许多开发者已开始在 Everest v2.0 上开发和测试各类 DApp 应用。同时,IOST 团队将坚定履行承诺,于 2019 年 2 月 25 日提前上线主网。
Everest v2.0 是什么?
我们将从以下 6 个方面讲解 Everest v2.0 的基本特性与独特优势:
IOST 经济模型
PoB 共识机制
智能合约系统
IOST 虚拟机( IVM )
高性能存储层
去中心化网络层
一、IOST 经济模型
影响区块链网络使用的因素包括所有的节点、计算机和连接这些节点的网络,以及这些节点处理和存储的所有数据。区块链上每一笔交易都会消耗资源,因此每一个区块链网络都需要设立机制管理这些资源的使用。
以太坊、EOS 和 IOST 的资源模型对比
EOS 网络将这些资源抽象为计算、网络和存储,以 CPU、NET 和 RAM 标记。在以太坊中,这些资源被统一打包为 GAS。
配置三种不同的资源会让系统变得复杂难用,但将计算、网络和存储统一打包则会让带宽和存储资源的利用率变得很低。
在实际情况中,应用程序要么对计算资源敏感,要么对存储资源敏感。计算和网络资源往往被同时使用,因此我们将计算和网络资源整合为 iGAS,并将存储资源重新设计为 iRAM。我们的资源模型为双资源的 iGAS-iRAM 模型。
通过使用 iGAS-iRAM 资源模型,我们在提高计算及存储资源利用率的同时降低了系统的复杂性与用户的使用门槛。
交易调度模型对比
在 HFFS (高费用者优先,Highest-Fee-First-Serve )的模型中,交易按照交易费用的高低次序被区块生产者(矿工)处理。网络拥堵时,用户可以通过支付更高的费用从而让交易更快被处理。
在 FCFS (先到先得,First-Come-First-Serve )模型中,交易按照发布时间被处理。如果网络拥堵,交易需要排队等待,甚至有可能在一定时间之后被丢弃。在这个模型中,无法保证交易一定会被执行。
在 IOST 交易调度中,我们使用 HFFS 模型,但无需支付交易费用。IOST 通过用户质押的代币每天以持续稳定的速率生成 iGAS。用户生成的 iGAS 并不会被稀释。用户可以使用 iGAS 发送交易,选择让交易被更快执行。因此在 IOST 调度模型中,用户可以实现免费交易,也能够调整交易的执行次序。
基于 DPoS 机制的 EOS 正面临计算资源危机。网络中可用的 CPU 资源波动性巨大,让 EOS 基本处于不可用的状态。
观察 EOS 我们可以发现:
你什么都不做,你的 CPU 资源被突然占满,不能做其他事情。
你花费 $100 来质押获得 CPU 资源,但玩了几局扑克牌后,这些资源都被花光了。
这些问题催生了 EOS 代币租赁服务,例如 Chintai、CPU Emergency、EOS Bank 等,来解决这个严峻的问题。
IOST 设计了一个不同的质押模型。在 IOST 的质押模型中,通过系统设计使得用户的可用资源不被稀释且不产生波动。任何用户的 CPU 资源和网络资源都是稳定的。iGAS 生成速率固定,1 IOST 在 24 小时区间内产生固定的 iGAS (目前为 1 万 iGAS )。与此同时,EOS 的 CPU 生成速率在 0.1 — 120 毫秒 /日之间波动。EOS 的 CPU 波动率超过一千倍,让用户体验变得不可预估。而 IOST 的固定速率生成模型可以让交易体验变得稳定可靠。
EOS CPU 资源波动
图片来自:labs.eostitan.com
二、PoB 共识机制
IOST 设计的 PoB 是一个比 DPoS 更去中心化的选举方案,并具有相同的扩展性且注重 censorship resistance。PoB 共识机制确保了一个公平合理的选举过程,使得大部分节点都有资格参与到区块生产中,而不是只有头部的少数节点进行区块生产。但是,获得票数越多的节点仍然拥有更大的机会生产区块。为此,我们并不直接采用投票结果作为选举结果,而是引入了一个积分体系—— Servi 来决定委员会成员。
在每轮委员会选举中,所有节点候选人的 Servi 获取速率与投票结果是成正比的。Servi 值排名最高的节点将会组成一个委员会并负责下一轮的区块生产。入选委员会的所有节点的 Servi 余额都要扣除其中最后一名的 Servi 值。也就是说,最后一名的 Servi 值清零,其他节点扣除等量的 Servi 值。
委员会选举样例
在 IOST 网络中,每 10 分钟就会进行一次委员会换届。由于 Servi 的自动清理机制,每天也许有上百个合格的节点被选入委员会。事实上, 由于换届选举每 10 分钟就进行一次,任何合格的节点最终都有机会进入委员会并负责下一个周期的区块生产。这种选举流程无疑使 PoB 机制比 DPoS 机制更去中心化。在 DPoS 机制的网络中,固定的极少数头部节点控制整个网络,而在 IOST 网络中,至少有上百个节点在不停地生产和验证区块。委员会成员的不断更换保证 IOST 网络更加动态、灵活。
PoB 共识机制的设计保证了区块生产的去中心化和 IOST 网络的公平公正,并具有与 DPoS 机制同样的可扩展性和吞吐速度。
三、智能合约系统
IOST 设计出了一个更灵活,控制功能更加强大的智能合约系统,具有多项独特优势:
这版的 IOST 测试网实现了智能合约的多语言支持。目前我们支持基于 V8 引擎的 JavaScript 智能合约编程,同时支持 Golang 模块高性能的合约交易。
现在 IOST 智能合约支持多重签名。智能合约可以检查调用栈,回答诸如 “ ABI 是被谁调用的” 等问题。智能合约还新增了对特殊权限设置的支持,例如升级和移除合约。这可以在很大程度上解决以太坊等平台中出现的合约难以管理和维护的问题。
IOST 的 JS 游戏的智能合约示例
在执行之后,智能合约会在区块中生成一个链上收据( Receipt ) 并寻求共识。我们支持使用 “远程进程调用”( RPC )追踪上链交易的 Receipt,让整个网络透明可信。
除了链上收据( Receipt)特点作为交易证明外,IOST 还支持在链下存储事件(Event)的功能。IOST Event 在系统级别实现,会给用户提供不同的事件主题( Event Topics)供其订阅。这些主题包括交易、区块、智能合约、区块生产者等的生命周期信息。事件主题( Event Topics)的功能让用户更容易访问 IOST 网络并获取相关信息。
四、IOST 虚拟机( IVM )
IOST 虚拟机本着优雅、易用和安全的原则而设计。在调研了不同版本的 EVM、EOS VM、C Lua (在 Everest v0.5 中采用)和 V8 后,我们的团队选择基于 V8 引擎进行开发,并解决了许多 EVM 和 EOS 虚拟机中存在的设计问题。
IOST 虚拟机结构
IVM 的核心是 VM Manager,包含如下功能:
VM 入口处理和其他模块的外部请求的交互,包含 RPC 请求、区块验证、交易验证等。入口接受的任务会在预处理和格式化后分配给 VMWorker,保证外部接口的统一性。
在 IVM 中,Worker 的数量(也就是 VMManager 的线程数量)基于虚拟机系统的工作量进行动态调整,来达到高效率重复利用的目的。在 Worker 之间,JavaScript 热启动和热点沙盒快照的存储可以帮助减少 VM 的生成,避免加载同一套代码时对 CPU 和内存带来巨大的工作负荷。这样的设计增加了系统的吞吐量,允许 IOST VM 在处理大量的合约(例如运行 fomo3D 应用)时依然保持高性能运转。
VM Manager 与状态数据库( State Database )之间拥有统一的接口。这能保证存取的原子性,避免数据库只写入部分数据,并能保证在资金不足、交易执行失败时退回整个交易操作。与此同时,状态数据库使用二级缓存进行存储,最终才将内容写入 RocksDB 中。这能在不同版本的数据中实现更短的存取时间,并为临时数据优化性能表现。
IVM 底层架构采用基于 V8 Isolate 功能的 JavaScript 沙盒,严格限制系统级函数调用,保证完全的线程隔离和安全的合约执行。
IVM 禁用了一系列具有不确定的时间和空间复杂度的函数和类库。这些库甚至会通过不同的参数生成指数级别的调用,例如 RegExp 正则表达式、Math 部分数学方法、ArrayBuffer、Proxy 等等。我们同样去除了大部分的高风险 JavaScript 函数,例如 eval、Function 等等。
在用户设置的 iGAS 和 iRAM 使用限制之外,IVM 同样为每个合约的执行设置 CPU 时间和内存大小的限制,避免恶意攻击。
IVM 重写了所有 JavaScript 的标准库,为每一个标准库函数添加了 iGAS 数据统计,避免通过使用标准库进行恶意攻击。
五、高性能存储层
IOST 实现了多版本并行控制缓存( MVCC,Multi-version Cached Control )的存储层。
IOST 存储层架构
具体而言,IOST 存储层的功能包括:
基于区块链的数据处理模式,我们使用 MVCC 缓存来处理请求,同时将其并行缓存到内存中,这可以增强数据层的性能与易用性。在区块链分叉时,我们不需要回滚状态,而是可以直接从缓存中读取状态。
IOST 存储层提供数据的最终存储。我们采用了最简单的键值数据库形式,实现不同数据库和不同服务层通讯( SLA,Service Level Agreement )的情形下的数据存取。
我们的存储层带有 commit manager 接入到最外层。Commit manager 处理多版本数据的管理与维护。更高层的操作则可以将这一层作为普通的数据库进行处理,并且可以切换到任意版本。
六、去中心化的网络层
IOST 实现了完全去中心化的网络拓扑结构,允许快速的节点发现、高效率的交易和区块全网广播。与此同时,我们限制网络中的数据冗余度,并在节点间实现安全的数据传输。最重要的功能特性如下:
我们通过在 TCP 协议上建立 TLS 安全传输层来加密数据传输。为了更好地利用每一个 TCP 连接,我们采用了多路传输技术来发送和接收数据,并在节点间动态建立多个数据流来最大化带宽使用。对于节点,我们使用 Kademlia 来存储路由表。这意味着 IOST 可以在网络传输数据时避免内容被监听和篡改。
为了减少带宽使用、加速数据传输,我们使用 Protocol Buffer 将结构化的数据进行序列化,并使用 Snappy 算法进行压缩。在我们的测试中,这一方案可以将数据尺寸压缩 80%以上。
IOST 网络层使用 UPnP 协议实现内网穿透。UPnP 和 UDP 打孔协议、STUN 协议等其他的解决方案不同——它在不发布服务器的情况下不需要公开端口。这意味着用户无需云端服务器,就可以使用消费级计算机来接入我们的网络,并和其他节点进行通讯。我们希望确保网络可以随时被任何用户接入。
结语
今天,每一位 IOST 区块链的贡献者都在为测试网 Everest v2.0 的全面实现激动不已。在此,我们想对 IOST 的全球开发者社区表示最诚挚的谢意,感谢你们夜以继日的奋斗与卓越的贡献。IOST 团队将坚定不移地履行我们对社区的承诺,在 2 个月后上线我们的主网 Mainnet v1.0。
欢迎大家来参与使用我们的测试网 Everest v2.0。开发者和项目方已经可以在 Everest v2.0 搭建 DApp 应用。
开发者文档:
Slack 开发者社区:
欢迎关注 IOST 的 Github 主页: https://github.com/iost-official/go-iost
我们一如既往地欢迎所有的想法和建议,并期待能够继续改进 IOST 区块链。