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

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

【问题讨论】:

    标签: blockchain rpc bitcoin json-rpc


    【解决方案1】:

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

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

    1. getblockhash
    $ bitcoin-cli getblockhash 0
    000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
    

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

    1. 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 对象)。请注意,创世区块的数据不多,但对于较新的区块,这将非常大且缓慢。

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

    <pubkey> OP_CHECKSIG

    在第一个vout 中,scriptPubkey04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f OP_CHECKSIG

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 2019-05-25
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 2016-10-11
      • 1970-01-01
      相关资源
      最近更新 更多