从块 0 中获取密钥列表

Posted

技术标签:

【中文标题】从块 0 中获取密钥列表【英文标题】:Getting a list of keys from block 0 【发布时间】:2019-10-29 13:21:54 【问题描述】:

使用本地区块链,是否可以使用 bitcoin-core rpc 命令查询一个块(例如创世块)并获取该块中使用的所有公钥的列表?如果可能,我需要使用哪些命令?

【问题讨论】:

【参考方案1】:

不完全是。这是因为现代输出包含地址(技术上是 scriptPubkeys),这些地址是公钥的编码散列,请参阅Types of Transactions。哈希不能被反转(或者比特币根本不起作用),所以为了揭示公钥,消费者必须提供它。您可以从花费的输出中提取公钥(通过scriptSig),但这并不简单。然而,对于遗留输出(如在创世块中),这无需花费即可实现,因为它们使用已弃用的交易类型(Pay-To-Pubkey)。

有几个命令可以使用。首先,获取区块中的交易:

    getblockhash
$ bitcoin-cli getblockhash 0
000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

其中 0 是创世区块的区块索引。

    getblock
$ bitcoin-cli getblock 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f 2


  "hash": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",
  "confirmations": 600908,
  "strippedsize": 285,
  "size": 285,
  "weight": 1140,
  "height": 0,
  "version": 1,
  "versionHex": "00000001",
  "merkleroot": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
  "tx": [
    
      "txid": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
      "hash": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
      "version": 1,
      "size": 204,
      "vsize": 204,
      "weight": 816,
      "locktime": 0,
      "vin": [
        
          "coinbase": "04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73",
          "sequence": 4294967295
        
      ],
      "vout": [
        
          "value": 50.00000000,
          "n": 0,
          "scriptPubKey": 
            "asm": "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f OP_CHECKSIG",
            "hex": "4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac",
            "reqSigs": 1,
            "type": "pubkey",
            "addresses": [
              "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"
            ]
          
        
      ],
      "hex": "01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000"
    
  ],
  "time": 1231006505,
  "mediantime": 1231006505,
  "nonce": 2083236893,
  "bits": "1d00ffff",
  "difficulty": 1,
  "chainwork": "0000000000000000000000000000000000000000000000000000000100010001",
  "nTx": 1,
  "nextblockhash": "00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048"

其中第一个参数是块哈希,2 是详细程度(即对于带有交易数据的 json 对象)。请注意,创世区块的数据不多,但对于较新的区块,这将非常大且缓慢。

    scriptPubkey 中提取公钥 幸运的是,创世区块使用了一种已弃用的交易类型,称为 Pay-to-Pubkey,它为我们提供了公钥,其形式如下:

<pubkey> OP_CHECKSIG

在第一个vout 中,scriptPubkey04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f OP_CHECKSIG

所以公钥是04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f。请注意,这是 65 字节,因为早期的比特币版本使用未压缩的公钥。

【讨论】:

以上是关于从块 0 中获取密钥列表的主要内容,如果未能解决你的问题,请参考以下文章

获取 Voldemort DB 中的密钥列表

从地图中获取密钥及其特定值

在启动时仅获取一次密钥保管库机密列表

如何从 Cloud Bigtable cbt 工具获取密钥列表?

获取 Django 中的缓存键列表

从 Map<String,List<String>> 获取密钥,知道列表值之一