【问题标题】:Bitcoin block and transaction regex比特币区块和交易正则表达式
【发布时间】:2017-09-16 16:06:02
【问题描述】:

我希望能够确定给定的哈希是否代表一个区块、区块高度或交易。

我知道区块就像 ^[0-9]+$ 并且 ^0$ 是有效的,因为它是创世区块。 我知道一个块在 base58 中,长度为 64,通常以 0 开头。 我知道一个事务在 base58 中,长度为 64。

现在我得到了正则表达式:

  • 块高度:^(0|[1-9][0-9]*)$
  • 区块哈希:^0+[BASE58]{63}$
  • 交易哈希:^[BASE58]{64}$

但我发现了一些以 0 开头的交易,所以我猜比特币协议中只有以 0 开头的区块不属于比特币协议的一部分。 我还运行了一个难度为 1 的 regtest 本地(假)网络,并且所有块都不以 0 开头。

是否有任何可靠的方法(最有可能使用正则表达式)来区分区块哈希和交易哈希?

【问题讨论】:

  • 对比特币一无所知,但您可能应该删除块哈希正则表达式中的+,否则它会在开始时允许多个零,之后仍然有 63 个 base58 字符。
  • 比特币的难度迫使区块通过查找带有前导零的哈希来挖掘,所以这是故意的。但是这个正则表达式会导致我暴露的问题。
  • 如果不是每个单独的散列模式将块与交易区分开来,那么我猜它一定是顺序。你如何区分它们(视觉上)?

标签: regex bitcoin


【解决方案1】:

您需要解决两个主要问题:第一个也是更简单的问题,即交易或区块哈希的格式。这些是交易或块的相应序列化表示的 SHA256 哈希,这意味着这些只是 32 字节数组,通常以十六进制表示给用户。因此,检查两者有效性的正则表达式很简单

^[a-fA-F0-9]{64}$

正如您所指出的,比特币中的区块(虽然不是莱特币等其他加密货币)将有前导零,由于难度最低,至少有 8 个零,因此您也可以使用以下内容:

^[0]{8}[a-fA-F0-9]{56}$

但请记住,交易也可能属于该类别,因为它们有时会产生带有前导零的散列(预计每 1/4294967296 个交易都会有这样的散列)。

第二个更难的问题是检查哈希是否实际对应于交易或区块。可以这样想,虽然有很多有效的电子邮件地址,但真正对应实际用户的却很少。要执行此检查,您必须拥有区块链的完整副本并查找匹配的项目,或者您可以拥有另一个数据结构,例如索引或布隆过滤器,以检查此类项目是否确实存在。

【讨论】:

  • 好吧,我不确定前导 0 是否可以安全地作为硬性规则。而且我想我必须调用 RPC 来检查第二个(更难的)问题是否存在这样的事务。
猜你喜欢
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 2014-03-08
  • 2016-02-08
  • 2018-04-28
  • 2019-01-30
  • 2014-01-22
  • 1970-01-01
相关资源
最近更新 更多