本发明涉及去中心化的区块链智能合约数据存储的设计领域,尤其涉及一种基于Java智能合约的数据集合存储方法。
背景技术:
区块链技术,区块链是一种新型去中心化协议,能安全地存储数字货币交易或其他数据,信息不可伪造和篡改;智能合约是一种可以在区块链网络环境中部署和执行的一段代码,这段代码的部署以及执行都是可以在区块链网络中以交易的形式呈现,其部署和执行结果可以随着交易被全网共识;目前智能合约支持的语言包括Solidity、Java等等,智能合约也在基于区块链的各种业务应用中广泛应用。
传统联盟区块链智能合约执行引擎包括evm和jvm,以jvm为例,jvm无法采用直接映射到区块链账本的集合类型来存储数据,需要按键值对的形式读取或写入到账本中,且无法保证所有写入数据的原子性,在插入部分数据后合约执行失败需要将合约数据回滚,这部分压力将会落在区块链节点上,如何让Java智能合约方便的使用自定义集合来操作账本的同时又保证一次交易执行的账本数据修改的原子性,保证区块链智能合约执行引擎稳定高效是一项全新的挑战。
技术实现要素:
针对现有技术的不足,本发明提出一种基于Java智能合约的数据集合存储方法,既保证了与区块链账本的直接交互集合方便使用,同时又解决了多次账本数据操作的存储原子性问题。
本发明的目的是通过以下技术方案来实现的:一种基于Java智能合约的数据集合存储方法,该方法具体包括如下步骤:
步骤一:使用Java智能合约存储数据,必然离不开对集合的使用,在Java智能合约中必须为合约的集合成员变量初始化,之后调用不同集合的构造函数;list集合初始化时,将会创建有序的集合,将集合的初始大小、集合内的缓存进行以及元素的泛型类型初始化;map集合初始化时,将会创建无序的集合,将集合的初始大小、集合内的读写缓存以及键值对的泛型信息进行初始化;初始化后可以集合进行操作,写入的数据可以映射到区块链账本,同时可以利用集合从账本中读取数据;
步骤二:合约集合分别实现了标准JDK的map和list接口,当Java智能合约需要将数据持久化时,可以调用数据集合暴露的接口,将数据存入到不同的数据集合中;有序的数据集合list将会记录存入数据的顺序,可以通过角标的方式来获取;无序的数据集合map则会将数据的键值进行哈希计算来保证存入账本时键值的长度,同时可以将完整的map元素数据持久化,方便下次获取;
步骤三:为了提高数据存取的性能,对Java智能合约的数据集合的元素内容进行了缓存;缓存可分为读缓存和写缓存,当插入新数据时会将数据加载到读写缓存中,写缓存最终会根据某种规则将其中的数据写入到账本中去,而读缓存则可以在读取数据时更高效的获取,降低延迟和减少对账本的操作,获取到的数据同样会加入到读缓存中;
步骤四:Java智能合约数据集合需要与账本不断的发生交互,在读取数据阶段,list集合将以角标作为账本的键值来访问,获取到的数据进过反序列化为list指定的泛型类型数据;map集合则以自身键值的哈希值来访问账本,由于经过哈希计算后丢失了键值的内容,所以map集合需要将键值对一起进行反序列化来从账本还原为原始的map元素,向账本中存储数据时也是一样的道理;
步骤五:最终在Java智能合约执行完成之后,会对数据进行统一写入区块链账本中,这样可以保证数据的原子性;判断合约数据集合在执行前后是否一致,来做是否写入账本的操作,写入账本的数据将从集合的写缓存中获取,最终以与读取方式一致的序列化形式将数据记录进账本,之后清空集合中的缓存来释放空间。
进一步地,所述的步骤二中,调用数据集合暴露的接口指的是,实现了标准JDK制定的在java.util包下的两个标准集合类型接口:List和Map的具体实现,分别实现了两种具备改接口功能的集合。
进一步地,所述的步骤三中,对合约的数据集合的元素内容进行了缓存,会将新插入的数据和从账本读取的数据均写入读缓存中。
进一步地,所述的步骤四中,将map键值哈希计算是为了控制写入账本的键值长度,list集合则不存在这个问题。
进一步地,所述的步骤五中,不将每次集合操作都写入账本而将数据写入写缓存,在合约执行完交易成功后再将数据写入可以保证原子性。
本发明的有益效果如下:
本发明应用于联盟链背景下的区块链网络智能合约执行引擎上,既保证了与区块链账本的直接交互集合方便使用,同时又解决了多次账本数据操作的存储原子性问题,提高了智能合约的执行效率,是Java智能合约下jvm执行引擎的大突破。
附图说明
图1是本发明的方法的List集合流程图;
图2是本发明的方法的Map集合流程图。
具体实施方式
下面根据附图和优选实施例详细描述本发明,本发明的目的和效果将变得更加明白,以下结合附图和实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
如图1和2所示,一种基于Java智能合约的数据集合存储方法,该方法具体包括如下步骤:
步骤一:使用Java智能合约存储数据,必然离不开对集合的使用,在Java智能合约中必须为合约的集合成员变量初始化,之后调用不同集合的构造函数;list集合初始化时,将会创建有序的集合,将集合的初始大小、集合内的缓存进行以及元素的泛型类型初始化;map集合初始化时,将会创建无序的集合,将集合的初始大小、集合内的读写缓存以及键值对的泛型信息进行初始化;初始化后可以集合进行操作,写入的数据可以映射到区块链账本,同时可以利用集合从账本中读取数据;
步骤二:合约集合分别实现了标准JDK的map和list接口,当Java智能合约需要将数据持久化时,可以调用数据集合暴露的接口,将数据存入到不同的数据集合中;有序的数据集合list将会记录存入数据的顺序,可以通过角标的方式来获取;无序的数据集合map则会将数据的键值进行哈希计算来保证存入账本时键值的长度,同时可以将完整的map元素数据持久化,方便下次获取;
步骤三:为了提高数据存取的性能,对Java智能合约的数据集合的元素内容进行了缓存;缓存可分为读缓存和写缓存,当插入新数据时会将数据加载到读写缓存中,写缓存最终会根据某种规则将其中的数据写入到账本中去,而读缓存则可以在读取数据时更高效的获取,降低延迟和减少对账本的操作,获取到的数据同样会加入到读缓存中;
步骤四:Java智能合约数据集合需要与账本不断的发生交互,在读取数据阶段,list集合将以角标作为账本的键值来访问,获取到的数据进过反序列化为list指定的泛型类型数据;map集合则以自身键值的哈希值来访问账本,由于经过哈希计算后丢失了键值的内容,所以map集合需要将键值对一起进行反序列化来从账本还原为原始的map元素,向账本中存储数据时也是一样的道理;
步骤五:最终在Java智能合约执行完成之后,会对数据进行统一写入区块链账本中,这样可以保证数据的原子性;判断合约数据集合在执行前后是否一致,来做是否写入账本的操作,写入账本的数据将从集合的写缓存中获取,最终以与读取方式一致的序列化形式将数据记录进账本,之后清空集合中的缓存来释放空间。
进一步地,所述的步骤二中,调用数据集合暴露的接口指的是,实现了标准JDK制定的在java.util包下的两个标准集合类型接口:List和Map的具体实现,分别实现了两种具备改接口功能的集合。
进一步地,所述的步骤三中,对合约的数据集合的元素内容进行了缓存,会将新插入的数据和从账本读取的数据均写入读缓存中。
进一步地,所述的步骤四中,将map键值哈希计算是为了控制写入账本的键值长度,list集合则不存在这个问题。
进一步地,所述的步骤五中,不将每次集合操作都写入账本而将数据写入写缓存,在合约执行完交易成功后再将数据写入可以保证原子性。
本发明中,实现了将Java标准集合List和Map映射到区块链账本的键值对数据上,做到操作数据能够像操作普通Java集合一样方便,同时又不需要全量加载大量的合约数据,在需要时进行懒加载,节省了空间,增加缓存策略可以提高合约数据获取的速度;再此基础上,把需要增加或者更新的数据记录在写缓存中,在合约执行期间不需要实时写入到账本中去,减少不必要的操作,在合约执行完成后,将写缓存中的数据同时写入到账本中,可以保证合约执行结果数据的原子性,减轻区块链节点的回滚压力。
本领域普通技术人员可以理解,以上所述仅为发明的优选实例而已,并不用于限制发明,尽管参照前述实例对发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实例记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在发明的精神和原则之内,所做的修改、等同替换等均应包含在发明的保护范围之内。