从块 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
中,scriptPubkey
是04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f OP_CHECKSIG
所以公钥是04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f
。请注意,这是 65 字节,因为早期的比特币版本使用未压缩的公钥。
【讨论】:
以上是关于从块 0 中获取密钥列表的主要内容,如果未能解决你的问题,请参考以下文章