区块链完整的数据是由多个区块组成的链式结构组成的,区块之间通过哈希指针连接,每个区块包含了一定量的交易数据和其他元数据。区块链中节点需要存储完整的全部的数据,通过高冗余的存储方式确保数据的公开、透明、不可篡改、可追溯,但随着区块数量的不断增加,区块链的存储将会成为瓶颈。轻节点和分片方案虽然能够缓解区块链的存储压力,但存储开销依然会随着区块高度的增长而增加;链下存储方案才能有效提高区块链系统的存储可扩展性,但将全部数据移至链下存储和处理会降低区块链系统的性能。为了降低区块链网络的存储压力,提出一种基于动态虚拟节点的链下存储模型——DVNOS(Dynamic Virtual Node Off-Chain Storage Model),将区块链数据移至链下存储的同时通过区块热度鉴别机制和区块置换算法区分经常访问和使用的数据和不经常访问和使用的数据,经常访问和使用的数据存放在资源受限的节点组成DHT网络中,不经常访问和使用的数据存放在IPFS网络中,通过将以提高区块链的存储可扩展性。
区块链数据移至链下IPFS系统能够极大降低区块链网络的存储压力,但IPFS系统是由诸多非区块链节点维护,这些节点可能是异构的,存储能力也不同。为了避免节点存储负载不平衡,在现有Kademila算法的基础上对存储路径的选择进行改进,优先将数据存放在存储负载最小的节点,平衡分布式系统的存储负载,路径选择可由以下步骤完成。
1) 将接收到区块数据划分为n个分片,使用哈希函数计算各分片对应的地址。
2) 在分布式网络中查询与目标节点N最近的m个节点,得到集合{ A },得到最远异或距离D,依次访问这m个节点,请求该节点查询与节点N异或距离最近的m个节点,得到集合{ B },如果集合{ B }中有节点与N的异或距离小于D,将该节点放入集合{ A },如果没有,则返回集合{ A }继续查询,直到所有节点检索完毕。
3) 根据剩余存储空间的大小,将距离目标节点异或距离最近的集合{ A }中的节点自大到小进行排序。
4) 向集合{ A }中的前n个节点发送写入请求,即存储能力较强的节点,如果n ≤ m,将数据写入,如果n > m,将区块数据重新划分为n-m个分片,回到步骤2重新查询。
5) 数据写入完成,更新网络中节点存储余量。
存储路径选择的流程如图所示。