我有一个平面文件,每行包含诸如
AX101 12345 PQR 101
AX102 18390 XYZ 091
AX101 81249 PQR 871
我的设置在Hyperledger的网络中连接了一些机器与vagrant和docker。
测试1
对于这个测试,我只运行一个验证对等体,它应该读取包含超过百万行的平面文件,并将每一行作为新块。目的是测试这样做的速度。有什么可能是达到这个目标的最佳方式?
方法1 :代码可能位于智能合约中的GoLang中
方法2 :一个独立的读者"用另一种语言通过API将数据发送给验证对等体(我认为会慢一些)
测试2
一旦(希望)当所有数据都在区块链上时,我需要解析所有条目,例如AX101,这里的速度不是问题,而是拿起所有条目。
任何指针都会有所帮助!
答案 0 :(得分:1)
这个答案假设你在谈论Hyperledger结构:
没有办法避免编写链码(智能合约)来将数据添加到数据库中。区块链中的所有数据都由创建它的链代码拥有,并且只能由创建它的链代码访问。没有共享数据的概念,或者只是将数据写入区块链。因此,您需要执行方法2,并通过其“添加新记录”方法(您将创建)将数据发送到链代码。
要访问数据,您需要为链代码创建查询方法。您可以通过存储数据的方式控制测试2中的解析速度。这里有链代码可用的数据库API的Godoc文档:https://godoc.org/github.com/hyperledger/fabric/core/chaincode/shim
答案 1 :(得分:1)
测试1
有几个论点为什么方法1不是最好的解决方案。
首先,如果您尝试从智能合约中在GoLang中运行初始导入,则此导入将作为单个事务执行。
无论引入此导入的位置(在您的链代码的“Init”或“Invoke”方法中)都无关紧要,在这两种情况下都会遇到“超时”问题。
第二种 - 这种方法破坏了区块链的想法。智能合约不应该从外部源(文件)中提取数据,因为任何人都可以修改它们,因此整个链将进入不一致的状态。
测试2
Hyperledger并非设计为数据库,“解析说AX101的所有条目”不是它的主要目标。
提供的描述非常有限,但是有一些关于如何“模仿”这种行为的想法:
可能的选项1: 您可以尝试使用“RANGE_QUERY_STATE” - 仅当您尝试按字符串“AX101 ...”的第一部分运行搜索时,它才有效。
可能的选项2: 使用“AX101”作为键,使用{“12345 PQR 101”,“81249 PQR 871”}作为值。这种数据结构可以在导入时构建。仅当您不打算使用字符串的其他部分运行查询时才有效。