将平面文件中的一百万行放到区块链中

时间:2016-05-27 16:23:26

标签: blockchain ethereum hyperledger

我有一个平面文件,每行包含诸如

之类的记录
AX101 12345 PQR 101
AX102 18390 XYZ 091
AX101 81249 PQR 871

我的设置在Hyperledger的网络中连接了一些机器与vagrant和docker。

测试1
对于这个测试,我只运行一个验证对等体,它应该读取包含超过百万行的平面文件,并将每一行作为新块。目的是测试这样做的速度。有什么可能是达到这个目标的最佳方式?

方法1 :代码可能位于智能合约中的GoLang中
方法2 :一个独立的读者"用另一种语言通过API将数据发送给验证对等体(我认为会慢一些)


测试2
一旦(希望)当所有数据都在区块链上时,我需要解析所有条目,例如AX101,这里的速度不是问题,而是拿起所有条目。

任何指针都会有所帮助!

2 个答案:

答案 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”}作为值。这种数据结构可以在导入时构建。仅当您不打算使用字符串的其他部分运行查询时才有效。