在上一篇「三分钟入门Neo3」文章中,我们介绍了脚本哈希(Script Hashes)在Neo2环境中的应用,以及它们可能对开发者和网络造成的负面影响。
尽管合同重定向能够解决数据迁移过程中的一些问题,但这一方案依旧需要第三方服务商手动更新其服务,才能使用新的合约哈希。因此,Neo创始人及核心开发者张铮文又提出了一个新方案「唯一合约ID」(Unique Contract IDs)。
唯一合约ID
张铮文介绍了「唯一合约ID」带来的好处:
“主要区别在于,使用GUID不需要添加重定向记录,并且合约可以随时升级,而无需记录其他信息以防止重新部署旧合约。因为如果部署了旧合约,则会创建新的GUID。”
此方案不仅能够减缓数据迁移对于合约存储的压力,还能在合约更新后依旧保留原有的标识符(脚本哈希)。将每个ID分配给每个已部署的合约,并在代码更新过程中一直存在。这意味着与Neo智能合约集成的服务商将不再需要在合约更新时手动更新其基础架构。
实施合约ID
初步方案提出后,张铮文先在本地测试了此方案的可行性,并提供了一个切实的「唯一合约ID」生成方案。
NGD软件开发者刘梦雨在确认该提案时强调,考虑到合约存储遭到威胁后会造成哈希冲突,所以将合约的数据前缀以ID形式编码,不仅能够缓解存储空间,也能保证存储的安全性。
注意到对「唯一合约ID」安全性与的要求,刘梦雨建议了两种备选方案来生成所需的合约ID。在最初建议使用区块高度,事务索引和生成密钥的syscall计数器之后,又提出了「全局计数器」的概念。
全局计数器的优势在于简单。每次将合约部署到Neo3中,它都会使用计数器来确定并获取下一个可用的ID号,与此同时计数器的数字也会递增。每个新的部署都会重复此过程,以确保每个合约都收到唯一的ID号。
刘梦雨实施了这两种方案,但是事实证明,全局计数器最受开发者喜爱,因为它消除了对哈希冲突的担忧。但这个方案有个缺点是混淆原生合约与新合约的类别,如果将来需要添加新的本地合约,全局计数器(以及所有合约ID)将受到影响。
核心开发者Shargon则提出建议,认为原生合约应采用负值,具有递减的ID(-1,-2,-3 ..等),以便原生合约与新合约都可以使用相同的全局计数器,互不影响彼此的ID分配。
尽管「唯一合约ID」最初是为了防止DoS攻击而设计的,但这也为开发者、第三方服务商提供了许多其他帮助,并有助于减缓区块的存储空间。
(责任编辑:admin)