基于区块链的分布式云存储架构
合同存证系统采用基于区块链的分布式云存储架构。
整个合同文件的流转过程分为三个步骤:
首先将用户的合同文件分成若干个大小相同的块并用椭圆加密算法加密;
然后,以区块链技术的交易机制为媒介完成合同数据的存储和流转;
最后,利用Merkle树验证合同文件的完整性。
此外,加入随机文件副本存储策略以便用户可以从云上快速检索文件以减轻P2P网络的负担,并实现容错机制。

基于区块链的分布式云存储架构
1.合同文件分块和加密
为了便于传输数据包、提升网络性能,首先要将用户的合同文件分成相同大小的块(例如32MB、64MB……)。
如果最后块的大小比指定值小,则以实际大小存放。然后,基于椭圆曲线加密ECC算法生成用户的公钥、私钥对(pk,sk),并对合同文件块加密。
ECC允许用户在没有任何密钥生成中心或第三方参与的情况下解密他们的文件。
与此同时,利用数字签名算法ECDSA生成签名密钥对(spk,ssk)。
该算法由Neal Koblitz和Neal Koblitz共同提出,也是由ECC和DSA组合而成。
在合同流转时,发送者使用ssk在合同文件块上签名,并由接收者使用spk进行验证。
2.使用区块链存储和流转合同文件信息
众所周知,区块链由一个个区块链接而成,每个区块上保存着时间有序的交易数据。
交易大小和规模产生的时间和空间消耗,将影响每笔交易的共识效率和区块链整体的运行效率。
因此,不宜在交易中携带数据量较大的文件。

区块链的结构
我们仅存储合同文件的元数据,即合同文件块的哈希值、合同文件块的URL地址以及合同文件块副本的URL地址,而不是在区块链中存储合同文件本身。
因为区块链是高冗余的,这样做不仅可以为用户节约大量的内存空间、提高运行速度,还更安全。
即使攻击者截获了交易数据,也无法获取原始的合同数据。在我们的架构中,区块链上记录的不是传统意义上的交易,而是合同元数据从一方流转到另一方的过程,这个过程同样也带有时间戳。
因此,当用户要更新一个合同文件时,只需要发起新的交易;同样的,当用户审查合同文件时,也只需要审查与之相关的最新交易,因为它是该合同文件的最终状态。
当用户需要验证他们的数据时,可以根据身份信息从区块链中追溯交易记录,然后通过区块链上记录的文件位置验证他们的数据。
3.文件完整性验证

Melkle哈希树的结构
Melkle树由SHA256单向哈希计算生成,而SHA2562是两次SHA256运算。Melkle树首先通过配对数据,即最底层的叶子节点Ti构建。
在比特币系统中Ti通常指交易,而在本章的系统中指合同元数据从数据所有者(DataOwner,DO)向数据使用者(Data User,DU)的流转过程。
它们经过哈希运算后得到h(Ti),然后进行两两配对和再哈希,一层一层向上哈希直到得到最终的计算结果,即Melkle树根。
在树中,包含合同信息的每个叶子节点都可以通过其相应的路径进行验证。
通过比较它们的Melkle树根,我们就可以知道叶子节点中的合同元数据是否被篡改过。
SHA256将任何输入都输出为256位的字符串,它是不可逆的,输入稍有变化,其输出就会有很大的变化。
由计算过程可知,Melkle根存储了所有合同文件块相关的信息,因此合同文件的完整性验证仅需要验证Melkle根,计算成本非常低。
4.合同文件副本及文件存储策略
为了保证架构的可靠性和性能,可以采用随机存储策略将合同文件块存储到P2P网络的节点上,并使用冗余的文件副本来实现容错机制。
合同文件副本在上传前也要经过加密,其数量(一般是固定的)由合同文件块的数量及文件副本放置策略决定。
在传统的分布式云存储架构中,文件被分成相同大小的块并分布到不同的数据节点(DN)上。
例如,Hadoop的HDFS存储策略是将文件夹及其副本一式三份存储到一个数据中心或服务器中,其中第一个副本放置在上传文件的数据节点上,如果是集群外提交,则随机选择一台磁盘、内存、CPU不太忙的节点存储;第二个副本放置在与第一个副本不同机架上的节点上;第三个副本放置在与第二个副本相同机架的相邻节点上。
为了安全起见,合同文件块及其副本被随机放置在用户节点周围,这样恶意攻击者就几乎无法获取合同文件的所有分块。


