在区块链中搜索项目
Searching for an item in a blockchain
A blockchain 是一条包含到前一个块的散列的链。每个块由单个哈希树(或 Merkle 树)组成。我讨论的是区块链的整体架构。
由于区块链的值位于哈希树内部,因此在区块链内部查找值的最佳方式是什么?我想遍历整个区块链以在树中搜索您希望找到的值是不可行的。是否缺少用于在区块链中的块内搜索值的搜索方法?
如果你只有一个区块链,每个区块都有 Merkle-trees,那么根据定义,这个数据结构不提供任何有效搜索任何东西的方法:
- Merkle 树的叶子中的所有哈希本质上都是 pseudo-random,并且不包含有关内容的可用信息
- merkle 树节点中的所有哈希值都是 pseudo-random 位序列,由 pseudo-random 位序列的串接哈希形成(加密强度 pseudo-random-无意义平方,
log N
次)
- 指向前一个块的散列毫无用处除了找到前一个块(pseudo-random-胡说八道
M
,其中M
是块数)
- 区块本身的哈希值也是如此
总而言之:不,块的哈希值和 Merkle-trees 对于搜索信息基本上没有用。它不仅 "inefficient", 设计 区块链中包含的数据中最无用的 "indexing"(因为哈希值一旦在数据翻转)。如果你想在这样的数据结构中找到任何东西,除了在线性时间内遍历它之外,你绝对无能为力。所有这些哈希所做的就是确保区块链不被篡改,没有别的。
但是,没有人强迫你每次遍历整个区块链你想在其中找到一些信息。相反,您可以
- 遍历整个区块链一次
- 构建在区块链中查找所需内容所需的任何其他数据结构(索引、搜索树、图表、指纹,以及您可以从区块链中的数据构建的任何内容)
然后根据每个请求,您只需
- 使用 pre-computed 数据结构高效地执行查询
并且每次添加一个新块时
- 更新所有预先计算的数据结构。
或者:偶尔重建您的数据结构,分别处理最后几个块。
与"the internet"非常相似。它是一个包含内容的节点网络。你如何在这些节点中找到任何东西?是不是每次要找东西都要遍历所有的节点?不,你问一个搜索引擎。因为搜索引擎已经在后台完成了工作,访问了网络中的(一些)节点,并对内容进行了索引,这样你就可以很容易地在其中找到东西。同样的事情,除了你的图表是线性的(如果你忘记了孤立的分支),并且之前添加到图表中的节点不会经常改变(永远不会,除非有人不成比例地强大地攻击你的区块链)。当你更新你的数据结构时,之前添加的节点的不变性当然应该用于提高效率:如果你已经看到这些节点,就没有必要每次都 re-scan 它们(不像在互联网上,其中的内容先前索引的节点节点可以更改)。
另一种(显而易见的)替代方案,如果你能影响区块链的设计:提前考虑一下可能有用的东西,将所需的数据结构烘焙到区块链中吧从一开始,不仅区块链本身,而且帮助导航区块链的数据结构都不能轻易修改。
A blockchain 是一条包含到前一个块的散列的链。每个块由单个哈希树(或 Merkle 树)组成。我讨论的是区块链的整体架构。
由于区块链的值位于哈希树内部,因此在区块链内部查找值的最佳方式是什么?我想遍历整个区块链以在树中搜索您希望找到的值是不可行的。是否缺少用于在区块链中的块内搜索值的搜索方法?
如果你只有一个区块链,每个区块都有 Merkle-trees,那么根据定义,这个数据结构不提供任何有效搜索任何东西的方法:
- Merkle 树的叶子中的所有哈希本质上都是 pseudo-random,并且不包含有关内容的可用信息
- merkle 树节点中的所有哈希值都是 pseudo-random 位序列,由 pseudo-random 位序列的串接哈希形成(加密强度 pseudo-random-无意义平方,
log N
次) - 指向前一个块的散列毫无用处除了找到前一个块(pseudo-random-胡说八道
M
,其中M
是块数) - 区块本身的哈希值也是如此
总而言之:不,块的哈希值和 Merkle-trees 对于搜索信息基本上没有用。它不仅 "inefficient", 设计 区块链中包含的数据中最无用的 "indexing"(因为哈希值一旦在数据翻转)。如果你想在这样的数据结构中找到任何东西,除了在线性时间内遍历它之外,你绝对无能为力。所有这些哈希所做的就是确保区块链不被篡改,没有别的。
但是,没有人强迫你每次遍历整个区块链你想在其中找到一些信息。相反,您可以
- 遍历整个区块链一次
- 构建在区块链中查找所需内容所需的任何其他数据结构(索引、搜索树、图表、指纹,以及您可以从区块链中的数据构建的任何内容)
然后根据每个请求,您只需
- 使用 pre-computed 数据结构高效地执行查询
并且每次添加一个新块时
- 更新所有预先计算的数据结构。
或者:偶尔重建您的数据结构,分别处理最后几个块。
与"the internet"非常相似。它是一个包含内容的节点网络。你如何在这些节点中找到任何东西?是不是每次要找东西都要遍历所有的节点?不,你问一个搜索引擎。因为搜索引擎已经在后台完成了工作,访问了网络中的(一些)节点,并对内容进行了索引,这样你就可以很容易地在其中找到东西。同样的事情,除了你的图表是线性的(如果你忘记了孤立的分支),并且之前添加到图表中的节点不会经常改变(永远不会,除非有人不成比例地强大地攻击你的区块链)。当你更新你的数据结构时,之前添加的节点的不变性当然应该用于提高效率:如果你已经看到这些节点,就没有必要每次都 re-scan 它们(不像在互联网上,其中的内容先前索引的节点节点可以更改)。
另一种(显而易见的)替代方案,如果你能影响区块链的设计:提前考虑一下可能有用的东西,将所需的数据结构烘焙到区块链中吧从一开始,不仅区块链本身,而且帮助导航区块链的数据结构都不能轻易修改。