基于Hyperledger Fabric与星际文件系统相结合的数据存储框架
2023-01-09刘文选赵金东
刘文选,赵金东
(烟台大学 计算机与控制工程学院 山东 烟台 264003)
0 引言
随着网络交易的不断产生,区块数量也在不断增加,导致其占用的存储空间越来越大,区块链的数据存储问题面临着严峻的挑战[1]。比特币和以太坊作为区块链1.0和2.0的代表,其中比特币区块大小只有1 M,每秒大约只能处理7个交易,而以太坊每秒也只能处理15个交易。Hyperledger Fabric作为区块链3.0的代表,成为解决区块链数据存储问题的新势力。Hyperledger Fabric是一种分布式分类帐技术,要求所有的参与者必须经过身份验证才能参与区块链的交易[2],并且具有完备的权限控制和安全保障以及模块化设计和可插拔的架构,在不可更改的分布式账本上可以提供丰富的查询功能,具有可扩展、高性能、低信任的优势等[3]。
星际文件系统(InterPlanetary file system,IPFS)是一个面向全球的、点对点的分布式文件系统。在IPFS中文件及数据具有存在的唯一性,每个上传的文件都会被赋予一个唯一的hash地址,该地址不可篡改,也不可删除,从而保证了文件和数据的安全性[4],并且数据在节点中分布式存储,而不是每个节点都保存全部数据,可以大大节省网络存储空间。
将Hyperledger Fabric与IPFS相结合,一是由于Hyperledger Fabric不需要昂贵的挖矿计算来提交交易,并且可以在短延迟内构建可扩展的区块链;二是由于IPFS对数据的存储具有唯一性,并且还有文件重复检测机制,不会出现资源冗余问题[5]。因此,本文提出一种基于Hyperledger Fabric与IPFS相结合的数据存储框架。使用该存储框架时,将账本中的世界状态存放到Level DB中,将交易日志数据打包成数据块存放到IPFS中,此时IPFS会返回一个hash值,然后把该hash值存放到区块链上,从而有效地缓解区块链数据存储压力。
1 相关工作
Zheng等[6]提出一种将区块链和IPFS技术相结合的框架,把区块链事务数据上传到IPFS,IPFS在接收数据后响应hash。如果其他节点需要这些事务数据,它们可以使用这个IPFS散列值向IPFS请求事务数据。但是所使用的账户树技术仅包括参与其中的同行的交易网络,这种方法是不保存旧交易记录的,因此该框架具有一定的局限性。Mukne等[7]使用Hyperledger Fabric和IPFS进行土地记录管理,以解决当前印度土地记录管理系统面临的问题。但是该方案面临的最大挑战是将现有的土地记录管理系统转移到新的土地管理系统上。Palai等[8]采用不记录过期交易历史的记录块技术,将新的交易记录保存在头部文件中,从区块链中删除过期交易记录。这种方法虽然通过减少块的大小来缓解存储压力,但是由于只有头部部分存储,所以不可能追溯整个交易。Chou等[9]提出BC-Store框架,该框架在IPFS集群系统上部署了一个数据访问模型,对区块链的冷/热数据进行分类,热数据存储在本地缓存中,冷数据存储在IPFS集群中,从而大大缩短了区块链初始同步时间,并节省了大量的存储空间。潘恒等[10]使用Hyperledger Fabric和IPFS设计了一种病人可控的电子病历安全访问方案。该方案提出一种HyperEHR模型,该模型采用基于Hyperledger Fabric联盟链和云存储的架构,实现了不同机构用户对医疗数据的操作,具有较高的互操作性。并且,该模型将各医院、诊所产生的病历信息和访问控制策略加密存储在云端IPFS中,提高了存储的安全性。结果表明,Hyperledger Fabric和IPFS相结合使用,不仅具有较好的可扩展性,还可以保证安全性。
在上述文献以及文献 [11-15]的启发下,本文提出基于Hyperledger Fabric与IPFS相结合的存储框架来存储数据。本文方案具有以下优势:一是采用了Hyperledger Fabric联盟链,该联盟链更适用于隐私保护以及交易速度和内部监管等高要求的应用,而其他文献提出的方案大多采用了比特币和以太坊作为底层平台;二是将交易日志存储到IPFS中,将IPFS返回的hash值存放到区块链上,大大节省了存储空间。
2 Hyperledger Fabric
Hyperledger Fabric是第一个运行以标准通用编程语言编写的分布式应用程序的区块链系统,无须系统性地依赖加密货币,与现有的区块链平台形成了鲜明对比[16]。Hyperledger Fabric是Hyperledger项目的基石,最初是由IBM公司和Digital Asset创建[2]。以Fabric1.4为例,Hyperledger Fabric架构如图1所示。
图1 Hyperledger Fabric架构Figure 1 Hyperledger Fabric architecture
Hyperledger Fabric架构核心包括成员管理、智能合约、账本管理和交易管理。① 成员管理。成员管理主要是身份管理,身份管理包括三个方面:身份标识、身份认证、身份隐藏[17]。② 智能合约。Hyperledger Fabric的智能合约[18]也称为链码(chaincode),它是一段代码,主要负责具体的业务逻辑。③ 账本管理和交易管理。Hyperledger Fabric使用建立在HTTP/2上的P2P协议来管理分布式账本。根据具体需求采取可插拔的方式来设置共识协议,比如PBFT、Raft、PoW和PoS[19]等。
本文方案是将交易日志打包成数据块存放到IPFS中,因此需要先了解Hyperledger Fabric的交易流程。交易流程如图2所示。
图2 Hyperledger Fabric交易流程Figure 2 Hyperledger Fabric transaction flow chart
交易流程具体步骤如下。
1) 应用程序通过SDK调用证书服务,进行注册和登记,并获取身份证书。
2) 应用程序通过SDK向区块链网络发起一个交易提案,然后把本次交易要调用的合约标识、合约方法、参数信息以及客户端签名等发送给背书节点。
3) 背书节点收到交易提案后,将背书结果及各自的证书签名发给应用程序客户端。
4) 应用程序客户端收到背书节点返回的信息后,需要先判断与提案结果是否一致。如果没有足够的背书,则终止处理;否则,应用程序客户端把数据打包到一起组成一个交易并签名,发送给排序节点。
5) 排序节点对接收的交易进行共识排序,然后按照区块生成策略,将一批交易打包,生成新的区块,发送给提交节点。
6) 提交节点收到区块后,会对区块中的每笔交易进行校验,完成后将区块追加到本地的区块链,并修改世界状态。
3 Hyperledger Fabric+IPFS的数据存储框架结构
本文提出基于Hyperledger Fabric+IPFS的区块链存储框架,消除了现有区块链存储的局限性[20]。将世界状态存放到Level DB中,将交易日志存放到IPFS中,框架结构如图3所示。
图3 Hyperledger Fabric+IPFS框架结构Figure 3 Architecture framework of Hyperledger Fabric+IPFS
Hyperledger Fabric中的账本由世界状态和交易账本两部分组成,它们彼此不同但却相互关联。世界状态是一个数据库,存储了一组账本状态的当前值。通过世界状态,程序可以直接访问一个账本状态的当前值,无须遍历整个交易日志来进行计算。在默认情况下,账本状态是以键值对的方式来表示的,可以创建、更新和删除状态,因此世界状态能够频繁更改。交易账本是交易日志,记录了促成当前世界状态的所有改变。交易被收集在附加到区块链的区块中,有助于理解所有促成当前世界状态改变的历史。区块链数据结构与世界状态相差甚远,因为一旦把数据写入区块链就无法修改,它是不可篡改的。
当交易日志数据存储时,需要判断每一条数据是否为正确的传输格式。不同的数据有不同的ID,以单条交易日志为单位进行数据块打包,即一条数据作为一个独立的数据块,这样方便管理和查询。每次打包完数据块后立即存入IPFS,并获取IPFS存储块的地址。然后,将该数据块的IPFS地址以及文件指纹存入Fabric区块链进行保存。数据存储流程如图4所示。
图4 数据存储流程Figure 4 Data storage flow chart
通过上述的数据存储流程,可以实现算法1。
算法1数据存储
输入:交易日志数据。
输出:IPFS返回存储交易日志数据的hash值。
if 数据结构是合法的 then
blockdata=writeToIPFS
∥交易日志数据存入IPFS
return HI
∥HI代表存在IPFS上的交易日志数据返回的hash值
end
writeToFabric
当数据查询时,客户端发起请求获取原始数据,服务启动Fabric链,然后查询链码是否存在该ID下的IPFS地址信息,若不存在,则说明不存在数据,否则继续查询IPFS。根据IPFS上对应数据块文件的hash地址从IPFS上拿到原始交易日志数据,并可以利用Fabric上文件指纹与IPFS上原始交易日志数据进行比对验证,若两者一致,则可以确定该数据块未被篡改。数据查询流程如图5所示。
图5 数据查询流程Figure 5 Data query flow chart
通过上述的数据查询流程,可以实现算法2。
算法2数据查询
输入:Fabric上对应的链码。
输出:交易日志数据。
if 查询结果存在 then
get HI
∥查询结果存在,得到交易日志数据在IPFS上返回的hash值
blockdata=readFromIPFS
∥从IPFS中查询到的交易日志数据
end
return blockdata
将Hyperledger Fabric与IPFS相结合解决了区块链存储容量不足的问题。将世界状态存放在Level DB中,而大量的交易日志数据保存在IPFS中,然后把IPFS返回的交易日志数据位置的hash地址保存到Level DB中,这种解决方案有效缓解了数据存储的压力。交易日志数据存储过程如图6所示。
图6 交易日志数据存储过程Figure 6 Transaction log data storage procedure
Hyperledger Fabric实现不可改变的数据历史,IPFS帮助区块链不受限制地存储数据,二者相结合可以缓解数据存储的局限性。此外,上文中讨论账本时,似乎它只包括一个世界状态和一条区块链,但这显然过于简单化了。实际上,每个链码都有自己的世界状态,并且与其他链码的世界状态分离。在Hyperledger Fabric中,每个通道都有一个完全独立的账本,应用程序和智能合约可以在通道之间通信,以便在通道间访问账本信息。
4 实验仿真与分析
实验配置为Intel(R) Xeon(R) CPU E5-2697 v3@2.60 GHz双CPU和256 G内存,5台虚拟机集群,虚拟机配置CPU 4,内存16 G,硬盘1.8 T,虚拟机硬盘200 G,通过Docker搭建Hyperledger Fabric分布式集群和IPFS。
4.1 代码修改
本文提出的数据存储框架,其核心部分就是将交易日志数据存放到IPFS中。要实现超级账本中交易数据存取的改变,需要对源码中的账本操作部分进行修改。
在Hyperledger Fabric1.4中,blkStoreProvider的初始化函数在文件core/ledger/kvledger/kv_ledger_provider.go中:
func (p *Provider) initBlockStoreProvider() error {
∥索引配置,这是个字符串列表
∥调用了blkstorage的提供者新建函数
blkstorage.NewConf(
∥包装了两个参数,一个是根文件目录,另一个是最大区块文件大小
BlockStorePath(p.initializer.Config.RootFSPath)
∥修改成调用IPFS的存储地址
maxBlockFileSize
)
indexConfig
∥区块的存储状态信息
p.initializer.MetricsProvider
∥监控服务相关
)
…
}
账本读写配置信息在文件common/Ledger/blkstorage/fsblkstorage/fs_blockstore.go中:
AddBlock(block *common.Block) error
GetBlockchainInfo() (*common.BlockchainInfo,error)
∥获取当前区块链信息
RetrieveBlocks(startNum uint64) (ledger.ResultsIterator,error)
RetrieveBlockByHash(blockHash []byte) (*common.Block,error)
∥根据区块hash获取块
RetrieveBlockByNumber(blockNum uint64) (*common.Block,error)
RetrieveTxByID(txID string) (*common.Envelope,error)
∥根据交易ID获取交易
RetrieveTxByBlockNumTranNum(blockNum uint64,tranNum uint64) (*common.Envelope,error)
∥根据区块链高度和tranNum获取交易
RetrieveBlockByTxID(txID string) (*common.Block,error)
∥根据交易ID获取块
RetrieveTxValidationCodeByTxID(txID string) (peer.TxValidationCode,error)
∥根据交易ID获取交易验证代码
Shutdown()
4.2 实验仿真结果分析
4.2.1存储空间 假设本地存储容量为100 GB,每次的交易日志文件大小不超过20 MB,通过测试不同的交易日志文件个数,验证使用新框架能否达到预期的扩容结果。
图7显示了Hyperledger Fabric和Hyperledger Fabric+IPFS占用本地存储空间的对比情况。可以发现,当测试相同交易日志文件个数时,Hyperledger Fabric+IPFS框架占用的本地存储空间均小于Hyperledger Fabric存储交易日志文件时占用的本地存储空间。
图7 Hyperledger Fabric存储与Hyperledger Fabric+IPFS存储的对比Figure 7 Comparison of Hyperledger Fabric storage and Hyperledger Fabric+IPFS storage
4.2.2传输效率 使用Hyperledger Fabric+IPFS存储框架时,交易数据是被打包成数据块存储到IPFS,然后把返回的hash值存在区块链上,因此猜测该存储框架可能存在时间延迟现象。根据此猜测进行了仿真实验,实验时使用Hyperledger Fabric+IPFS存储框架和Hyperledger Fabric分别对1 000个不足20 MB、50 MB和100 MB的交易日志文件进行存储测试,通过测试发现,二者存储耗费的时间存在差值。Hyperledger Fabric+IPFS存储框架与Hyperledger Fabric数据存储的时间差见表1,这个差值的存在证实了我们的猜测。根据数据存储实验,进行了同样的数据查询实验,Hyperledger Fabric+IPFS存储框架与HyperLedger Fabric数据查询的时间差见表2。数据查询实验结果再次证实了我们的猜测。
表1 Hyperledger Fabric+IPFS存储框架与Hyperledger Fabric数据存储的时间差Table 1 Time difference of data storage between Hyperledger Fabric+IPFS storage framework and Hyperledger Fabric
表2 Hyperledger Fabric+IPFS存储框架与HyperLedger Fabric数据查询的时间差Table 2 Time difference of data query between Hyperledger Fabric+IPFS storage framework and Hyperledger Fabric
4.2.3安全性 Hyperledger Fabric与IPFS相结合可以节省存储空间,从而缓解数据存储压力。区块链Hyperledger Fabric与IPFS都具有高可靠性,保证了数据存储过程中的安全性。如果想要在IPFS中获取交易数据,首先需要验证Fabric上的链码,若查询结果正确,就可以获取存在区块链上的hash值,通过该hash值去IPFS系统中查询相对应的交易日志数据,然后取出想要获取的数据。若取数据的过程中无法获取hash值或无法配对hash值,则无法得到存在IPFS中的交易日志数据,因此不会出现盗取交易数据的情况,保证了数据的安全性。
5 结语
本文利用区块链Hyperledger Fabric和IPFS网络设计了一种数据存储框架,只有交易日志数据的hash值和世界状态存储在区块链。与目前可用的集中式存储系统不同,所提出的框架不依赖第三方,是完全分散的,确保了安全性、透明性。实验结果表明,运用该框架可以大大节省存储空间,扩大存储容量。尽管Hyperledger Fabric与IPFS的结合解决了数据存储的容量问题,但也导致了传输效率问题,并且IPFS网络需要很高的带宽,这将在以后的工作中加以考虑。