3

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

AX101 12345 PQR 101
AX102 18390 XYZ 091
AX101 81249 PQR 871

我的设置有几台机器连接到 Hyperledger 上的网络中,带有 vagrant 和 docker。

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

方法 1:代码可以位于智能合约中的 GoLang
方法 2:另一种语言的单独“阅读器”,通过 API 将数据发送到验证对等点(我认为会慢一些)


测试 2
有一次(希望)当所有数据都在区块链上时,我需要解析 AX101 的所有条目,这里的速度不是问题,但提取所有条目是。

任何指针都会有所帮助!

4

2 回答 2

1

此答案假设您正在谈论 Hyperledger 结构:

没有办法避免编写链码(智能合约)来将数据添加到数据库中。区块链中的所有数据都归创建它的链码所有,并且只能由创建它的链码访问。没有共享数据的概念,或者只是将数据写入区块链。因此,您需要执行方法 2,并通过其“添加新记录”方法(您将创建该方法)将数据发送到链码。

要访问数据,您将为您的链代码创建一个查询方法。您可以通过存储数据的方式来控制测试 2 中的解析速度。这里有链码可用的数据库 API 的 Godoc 文档:https ://godoc.org/github.com/hyperledger/fabric/core/chaincode/shim

于 2016-05-27T19:20:13.677 回答
1

测试 1
方法 1 不是最佳解决方案的原因有很多。首先,如果您尝试从智能合约在 GoLang 中运行初始导入,则此导入将作为单个事务执行。
在这两种情况下,无论在何处启动此导入(在“Init”或链代码的“Invoke”方法中),您都会遇到“超时”问题。
第二 - 这种方法破坏了区块链的想法。智能合约不应该从外部来源(文件)中提取数据,因为任何人都可以修改它们,结果整个链将进入不一致的状态。

测试 2
Hyperledger 并非设计为数据库,“解析所有条目以查找 AX101”不是它的主要目标。提供的描述非常有限,但是对于如何“模拟”这种行为有几个想法:

可能的选项 1:您可以尝试使用“RANGE_QUERY_STATE” - 只有当您尝试按字符串“AX101...”的第一部分运行搜索时,它才会起作用。</p>

可能的选项 2:使用“AX101”作为键,使用 {“12345 PQR 101”、“81249 PQR 871”} 作为值。这样的数据结构可以在导入时构建。仅当您不打算使用字符串的其他部分运行查询时才有效。

于 2016-05-27T19:54:19.200 回答