深度了解NEO3 Preview1的改进与优化

NEO3的Preview1版本在系统架构、稳定性和性能等多个方面进行了优化与改进,同时对定价模型进行了重新设计,从而大大降低了开发成本。所有这些变更旨在全面支持基于NEO3的大规模商业应用的开发和落地。
下面总结了NEO3 Preview1中的一些特性。后续版本中将包含更多新功能,敬请期待。
NEO3 Preview1 部分特性简介 
「架构优化」
账户模型
智能合约
– 原生合约
– 合约Manifest与ScriptHeader
– 新增的智能合约APIs
 交易
– 使用单一的交易类型实现与区块链的交互
– 有限作用域的见证人签名
– 存储合约执行结果
 区块
 NeoVM
「稳定性增强」
「性能增强」
「定价模型」
系统费
网络费
操作码费用
与NEO2.x的比较
架构优化
· 账户模型
NEO2.x中可以通过两种方式在NEO上创建资产。第一种是使用RegisterTransaction交易创建全局资产,第二种则是通过编写智能合约来创建合约资产。事实上,全局资产的使用是很少的,而合约资产因其灵活性与功能性成为了大多数应用程序的选择。由于全局资产没有与智能合约进行整合,要想在智能合约中对全局资产进行管理是非常困难的。
因此,在NEO3中,所有基于UTXO的全局资产都被移除并替换,取而代之的是基于合约的账户模型。NEO和GAS实现为原生合约同时符合NEP-5、NEP-10规范,从而统一了所有资产的操作方式。
· 智能合约
– 原生合约
原生合约是使用原生代码实现的,而不是在NeoVM中运行的opcode脚本,并以互操作服务的形式供NeoVM使用。原生合约公开其服务名称,供其他合约调用。当前包含NeoToken、GasToken与PolicyContract三种原生合约。
1. NeoToken,简称NEO,Neo的管理通证,用于执行对Neo网络的管理权,符合NEP-5标准。
2. GasToken,简称GAS,Neo的燃料通证,用于支付手续费,符合NEP-5标准。
3. PolicyContract,配置共识策略的合约,保存了共识过程中相关参数,包含区块最大交易数、低优先级交易数和大小限制、每字节的网络费等。
–  合约Manifest 和ScriptHeader

当前每个合约都需要提供一个Manifest文件来描述其相关属性,包括Groups, Features, ABI, Permissions, Trusts, SafeMethods等,如下所示:

深度了解NEO3 Preview1的改进与优化

1. Groups:声明合约所属的组。一个Group由一个公钥和合约哈希的签名组成。
2. Features:声明合约可用的特性。其中属性值storage表明合约可以访问存储区,payable表明合约可以接受资产的转入。
3. ABI:声明智能合约的接口信息,可以参考NEP-3。接口的基础属性包括:
– Hash:16进制编码的合约脚本哈希;
– EntryPoint:提供了合约入口方法的详细信息,包括方法名、方法参数以及方法返回值;
– Methods:由合约方法的详细信息构成的数组;
– Events:由合约事件构成的数组。
基于ABI信息,可实现合约间的相互调用。
4. Permissions:声明合约可调用的其他合约和方法。执行合约调用时,会检查Permission中配置的权限,若没有相应权限,则调用操作会执行失败。
5. Trusts:声明合约可以被哪些合约或者哪些合约组安全地调用。
6. SafeMethods:声明哪些方法是SafeMethod,SafeMethod通常是不会修改存储区,只读取区块链数据的方法,如果一个方法被标记为安全的,那么其他合约调用该方法时不会给用户接口返回警告信息。
–  新增的智能合约APIs
新增System.Runtime.Notify,允许在合约之间传递消息。例如,考虑一个运行去中心化交易所的合约。当用户需要充值时,首先他会向该合约转入一定的NEP-5代币,然后调用其deposit方法进行充值。在deposit方法中,合约可以通过调用System.Runtime.Notify来确认用户是否真正地转账了代币。
此外,还添加了 Neo.Json.Serialize和Neo.Json.Deserialize接口,使合约能够处理JSON格式的数据,同时简化合约的开发。
· 交易
–  使用单一的交易类型实现与区块链的交互
在NEO 2.x中,有9种不同的交易类型:
– MinerTransaction
– IssueTransaction
– ClaimTransaction
– EnrollmentTransaction
– RegisterTransaction
– ContractTransaction
– StateTransaction
– PublishTransaction
– InvocationTransaction
这些交易类型要么与特定的应用程序场景相关,要么提供更多的功能。但NEO3中只存在一种交易类型,格式如下:

深度了解NEO3 Preview1的改进与优化

–  有限作用域的见证人签名
当前交易签名是全局有效的,为了让用户能更细粒度地控制签名的作用范围,NEO3中对交易结构中的cosigners字段进行了变更,可实现签名只限于验证指定合约的功能。Cosigner的结构如下:

深度了解NEO3 Preview1的改进与优化

Scopes字段定义了签名的作用范围,包括以下四种类型:

深度了解NEO3 Preview1的改进与优化

–  存储合约执行的结果
目前,交易执行的结果(成功或失败)也会被存储。可以通过查询交易信息来确认交易在NeoVM中是否执行成功,例如跨链交易的确认。
· 区块
目前,我们给区块和区块见证人的大小设置了上限MaxSize (以更好地防止垃圾交易攻击),并将区块时间戳的单位更改为毫秒,从而可用于物联网应用。
· NeoVM
NeoVM是用于执行智能合约的轻量级虚拟机。它的特点是启动快,资源消耗低,支持多种高级编程语言,允许开发人员使用熟悉的工具构建合约。
在NEO3.0中,通过将操作码费用的计算转移至ApplicationEngine并简化指令,来实现NeoVM与区块链的完全解耦,使其成为一个单纯的虚拟机。下列操作码已被弃用:APPCALL, TAILCALL, SHA1, SHA256, HASH160, HASH256, CHECKSIG, VERIFY, CHECKMULTISIG, CALL_I, CALL_E, CALL_ED,CALLET, `CALLEDT`等。
这样做具有以下几个优点:
– 简化原生合约的开发
– 增加NeoVM在区块链外的应用场景
– 将NeoVM平滑集成到任何IDE中,并轻松调试智能合约,而无需加载区块链数据
稳定性增强
委托拜占庭容错(dBFT)是专门为区块链设计的共识机制。通过投票选举出一组共识节点,并由这些节点共同生成和验证区块。由于共识节点需要在新区块上链之前达成一致,dBFT保证了一区块终局性,这意味着NEO区块链不会发生分叉,且交易是不可逆的。一旦交易在区块链上得到确认,就不能撤销或取消。对于金融应用来说,交易的终局性是必要的。
在dBFT2.0中,我们增加了一个恢复机制,大大提高了共识算法的稳定性。在极少数情况下发生网络故障或节点故障时,可以实现快速恢复。
性能增强
NEO3增加了P2P消息的自动压缩机制,节省了大量的存储空间和带宽,同时提高了TPS。
部分压缩样本如下:

深度了解NEO3 Preview1的改进与优化

定价模型
· 系统费
系统费是根据NeoVM要执行的指令计算得出的费用,请参考GitHub上NEO3开发指南中的操作码费用部分,了解每个操作码的具体费用。NEO3取消了每笔交易10 GAS的免费额度,系统费用总额受合约脚本的指令数量和指令类型影响。计算公式如下所示:

深度了解NEO3 Preview1的改进与优化

· 网络费
网络费是用户向NEO网络提交交易时支付的费用,作为共识节点的出块奖励。每笔交易的网络费存在一个基础值,计算公式如下所示。只有当用户支付的网络费大于或等于此基础费用时,才会执行交易。否则,交易将被认定为无效交易。

深度了解NEO3 Preview1的改进与优化

其中,VerificationCost为NeoVM验证交易签名执行的指令相对应的费用,tx.size为交易数据的字节长度,FeePerByte为交易每字节的费用,目前在PolicyContract定义为0.00001GAS。
· 操作码费用
NeoVM操作码费用降低为原来的1/1000左右,可以显著降低合约开发成本。
· 与NEO2.x的比较

深度了解NEO3 Preview1的改进与优化

NEO3 Preview1版本可在https://github.com/neo-project/neo-cli/releases/tag/v3.0.0-preview1上下载。
以下是申请NEO3 Preview1 GAS的链接:https://neo.org/testcoin/apply
参考文献:
[1] Roadmap of NEO 3.0 Development
https://medium.com/neo-smart-economy/roadmap-of-neo-3-0-development-e2ae64edf226
[2] Native Contracts in NEO 3.0
https://medium.com/neo-smart-economy/native-contracts-in-neo-3-0-e786100abf6e
[3] Some Details about Changes in NEO 3.0
https://github.com/neo-ngd/NEO3-Development-Guide/blob/master/README.md#changes-in-neo3
[4] dBFT2.0
https://medium.com/neo-smart-economy/dbft-2-0-3-months-no-sporks-e2ab9fe1065b
[5] Opcode fee in NEO3
https://github.com/neo-ngd/NEO3-Development-Guide/tree/master/en/NeoVM#instructions