Skip to content

Commit

Permalink
GITBOOK-24: No subject
Browse files Browse the repository at this point in the history
  • Loading branch information
berryjam authored and gitbook-bot committed Mar 9, 2024
1 parent f588c42 commit 0de284d
Show file tree
Hide file tree
Showing 19 changed files with 796 additions and 92 deletions.
Binary file added .gitbook/assets/3.1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
17 changes: 14 additions & 3 deletions SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,20 @@

## 第三章. Bitcoin Core:参考实现

* [Icons](di-san-zhang-.-bitcoin-core-can-kao-shi-xian/icons.md)
* [Buttons](di-san-zhang-.-bitcoin-core-can-kao-shi-xian/buttons.md)
* [Inputs](di-san-zhang-.-bitcoin-core-can-kao-shi-xian/inputs.md)
* [综合介绍](di-san-zhang-.-bitcoin-core-can-kao-shi-xian/zong-he-jie-shao.md)
* [从比特币到比特币核心](di-san-zhang-.-bitcoin-core-can-kao-shi-xian/cong-bi-te-bi-dao-bi-te-bi-he-xin.md)
* [比特币开发环境](di-san-zhang-.-bitcoin-core-can-kao-shi-xian/bi-te-bi-kai-fa-huan-jing.md)
* [编译比特币核心的源代码](di-san-zhang-.-bitcoin-core-can-kao-shi-xian/bian-yi-bi-te-bi-he-xin-de-yuan-dai-ma/README.md)
* [选择比特币核心版本](di-san-zhang-.-bitcoin-core-can-kao-shi-xian/bian-yi-bi-te-bi-he-xin-de-yuan-dai-ma/xuan-ze-bi-te-bi-he-xin-ban-ben.md)
* [配置比特币核心构建](di-san-zhang-.-bitcoin-core-can-kao-shi-xian/bian-yi-bi-te-bi-he-xin-de-yuan-dai-ma/pei-zhi-bi-te-bi-he-xin-gou-jian.md)
* [构建比特币核心可执行文件](di-san-zhang-.-bitcoin-core-can-kao-shi-xian/bian-yi-bi-te-bi-he-xin-de-yuan-dai-ma/gou-jian-bi-te-bi-he-xin-ke-zhi-hang-wen-jian.md)
* [运行比特币核心节点](di-san-zhang-.-bitcoin-core-can-kao-shi-xian/yun-hang-bi-te-bi-he-xin-jie-dian.md)
* [配置比特币核心节点](di-san-zhang-.-bitcoin-core-can-kao-shi-xian/pei-zhi-bi-te-bi-he-xin-jie-dian.md)
* [比特币核心 API](di-san-zhang-.-bitcoin-core-can-kao-shi-xian/bi-te-bi-he-xin-api/README.md)
* [获取比特币核心状态信息](di-san-zhang-.-bitcoin-core-can-kao-shi-xian/bi-te-bi-he-xin-api/huo-qu-bi-te-bi-he-xin-zhuang-tai-xin-xi.md)
* [探索和解码交易](di-san-zhang-.-bitcoin-core-can-kao-shi-xian/bi-te-bi-he-xin-api/tan-suo-he-jie-ma-jiao-yi.md)
* [探索区块](di-san-zhang-.-bitcoin-core-can-kao-shi-xian/bi-te-bi-he-xin-api/tan-suo-qu-kuai.md)
* [使用比特币核心的编程接口](di-san-zhang-.-bitcoin-core-can-kao-shi-xian/bi-te-bi-he-xin-api/shi-yong-bi-te-bi-he-xin-de-bian-cheng-jie-kou.md)

## 第四章. 密钥和地址

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# 比特币核心 API

比特币核心 API 提供了一组命令,用于通过编程方式与运行中的比特币核心节点进行交互。这些命令可以通过 JSON-RPC 接口或使用 `bitcoin-cli` 命令行工具访问。以下是比特币核心 API 中常见的一些命令:

$ bitcoin-cli help 

\+== Blockchain == 

getbestblockhash 

getblock "blockhash" ( verbosity ) 

getblockchaininfo 

... 

walletpassphrase "passphrase" timeout 

walletpassphrasechange "oldpassphrase" "newpassphrase" 

walletprocesspsbt "psbt" ( sign "sighashtype" bip32derivs finalize )

每个命令都可以接受多个参数。要获取更多帮助、详细描述以及有关参数的信息,请在 `help` 后面添加命令名称。例如,要查看关于 `getblockhash` RPC 命令的帮助:

$ bitcoin-cli help getblockhash

getblockhash height

Returns hash of block in best-block-chain at height provided. 

Arguments:

1. height (numeric, required) The height index 

Result: "hex" (string) The block hash 

Examples:

\>bitcoin-cli getblockhash 1000

\> curl --user myusername --data-binary '{"jsonrpc": "1.0", "id": "curltest", 

"method": "getblockhash", 

"params": \[1000]}' -H 'content-type: text/plain;' http://127.0.0.1:8332/

在帮助信息的末尾,你会看到两个RPC命令的示例,使用了bitcoin-cli助手或HTTP客户端curl。这些示例演示了如何调用该命令。复制第一个示例并查看结果:

$ bitcoin-cli getblockhash 1000 00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09

结果是一个区块哈希,在接下来的章节中将会详细介绍。但是目前,该命令应该在你的系统上返回相同的结果,表明你的Bitcoin Core节点正在运行,接受命令,并且有关于区块 1,000 的信息返回给你。 

在接下来的章节中,我们将演示一些非常有用的RPC命令及其预期的输出。\
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# 获取比特币核心状态信息

比特币核心通过 JSON-RPC 接口提供不同模块的状态报告。最重要的命令包括 getblockchaininfo、getmempoolinfo、getnetworkinfo 和 getwalletinfo。 

比特币的 getblockchaininfo RPC 命令早已介绍过。getnetworkinfo 命令显示有关比特币网络节点状态的基本信息。使用 bitcoin-cli 运行它:

$ bitcoin-cli getnetworkinfo

```json
{
"version": 240001,
"subversion": "/Satoshi:24.0.1/",
"protocolversion": 70016,
"localservices": "0000000000000409",
"localservicesnames": [
"NETWORK",
"WITNESS",
"NETWORK_LIMITED"
],
"localrelay": true,
"timeoffset": -1,
"networkactive": true,
"connections": 10,
"connections_in": 0,
"connections_out": 10,
"networks": [
"...detailed information about all networks..."
],
"relayfee": 0.00001000,
"incrementalfee": 0.00001000,
"localaddresses": [],
"warnings": ""
}
```

返回的数据采用 JavaScript 对象表示法(JSON)格式,这种格式可以轻松地被所有编程语言“消费”,但也非常易读。在这些数据中,我们看到比特币核心软件和比特币协议的版本号。我们还可以看到当前连接数以及有关比特币网络和与此节点相关的各种信息设置。

{% hint style="info" %}
bitcoind 需要一些时间,也许超过一天的时间,来赶上当前的区块链高度,因为它要从其他比特币节点下载区块并验证这些区块中的每一笔交易 —— 在撰写本文时,这些交易已经接近 10 亿笔。您可以使用 getblockchaininfo 来检查其进度,以查看已知区块的数量。本章后续示例假定您至少已经到达了区块 775,072。因为比特币交易的安全性取决于区块,所以以下示例中的一些信息将根据您的节点有多少区块而略有变化
{% endhint %}
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# 使用比特币核心的编程接口

比特币命令行助手 bitcoin-cli 对于探索比特币核心API和测试功能非常有用。但是,API的整个目的在于以编程方式访问函数。在本节中,我们将演示如何从另一个程序访问比特币核心。

\
比特币核心的API是一个JSON-RPC接口。JSON是一种非常方便的数据呈现方式,可以让人类和程序都轻松读取。RPC代表远程过程调用,这意味着我们通过网络协议调用远程(位于比特币核心节点上的)过程(函数)。在这种情况下,网络协议是HTTP。

\
当我们使用bitcoin-cli命令获取命令的帮助时,它向我们展示了使用curl的示例,这是一种功能多样的命令行HTTP客户端,用于构建这些JSON-RPC调用之一:

\
$ curl --user myusername --data-binary '{"jsonrpc": "1.0", "id":"curltest", 

"method": "getblockchaininfo",

 "params": \[] }' -H 'content-type: text/plain;' http://127.0.0.1:8332/

该命令显示了 curl 发送一个 HTTP 请求到本地主机 (127.0.0.1),连接到默认的比特币 RPC 端口 (8332),并使用纯文本编码提交一个 jsonrpc 请求,请求 getblockchaininfo 方法。

您可能会注意到 curl 会要求发送凭据以及请求一起发送。比特币核心在每次启动时会创建一个随机密码,并将其放置在数据目录下,命名为 .cookie。bitcoin-cli 辅助工具可以在给定数据目录的情况下读取此密码文件。类似地,您可以复制密码并将其传递给 curl (或任何更高级别的比特币核心 RPC 封装),如示例 3-3 所示。

示例 3-3. 使用基于 cookie 的身份验证与比特币核心

$ cat .bitcoin/.cookie **cookie**:17c9b71cef21b893e1a019f4bc071950c7942f49796ed061b274031b17b19cd0

$ curl --user **cookie**:17c9b71cef21b893e1a019f4bc071950c7942f49796ed061b274031b17b19cd0 --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "getblockchaininfo", "params": \[] }' -H 'content-type: text/plain;' http://127.0.0.1:8332/

{"result":{"chain":"main","blocks":799278,"headers":799278, "bestblockhash":"000000000000000000018387c50988ec705a95d6f765b206b6629971e6978879", "difficulty":53911173001054.59,"time":1689703111,"mediantime":1689701260, "verificationprogress":0.9999979206082515,"initialblockdownload":false, "chainwork":"00000000000000000000000000000000000000004f3e111bf32bcb47f9dfad5b", "size\_on\_disk":563894577967,"pruned":false,"warnings":""},"error":null, "id":"curltest"}

或者,您可以使用 Bitcoin Core 源代码目录中提供的辅助脚本 `./share/rpcauth/rpcauth.py` 创建一个静态密码。

如果您正在自己的程序中实现 JSON-RPC 调用,您可以使用通用的 HTTP 库来构建该调用,类似于前面的 curl 示例所示。

然而,大多数流行的编程语言都有库可以以更简单的方式“包装” Bitcoin Core API。我们将使用 python-bitcoinlib 库来简化 API 访问。该库不是 Bitcoin Core 项目的一部分,需要按照通常的 Python 库安装方式进行安装。 请记住,这需要您运行一个 Bitcoin Core 实例,该实例将用于进行 JSON-RPC 调用。

示例 3-4 中的 Python 脚本执行了一个简单的 `getblockchaininfo` 调用,并打印了 Bitcoin Core 返回数据中的块参数。

示例 3-4. 通过 Bitcoin Core 的 JSON-RPC API 运行 getblockchaininfo

```python
from bitcoin.rpc import RawProxy
# Create a connection to local Bitcoin Core node
p = RawProxy()
# Run the getblockchaininfo command, store the resulting data in info
info = p.getblockchaininfo()
# Retrieve the 'blocks' element from the info
print(info['blocks'])
```

运行后,我们得到以下结果:

$ python rpc\_example.py 

773973

它告诉我们本地 Bitcoin Core 节点的区块链中有多少个区块。这并不是令人惊讶的结果,但它演示了使用该库作为简化接口访问 Bitcoin Core 的 JSON-RPC API 的基本用法。

接下来,让我们使用 getrawtransaction 和 decodetransaction 调用来检索 Alice 对 Bob 的付款的详细信息。在示例 3-5 中,我们检索 Alice 的交易并列出交易的输出。对于每个输出,我们显示接收者地址和价值。作为提醒,Alice 的交易有一个输出支付给 Bob,另一个输出是 Alice 的找零。

示例 3-5. 检索交易并迭代其输出

```python
from bitcoin.rpc import RawProxy
p = RawProxy()
# Alice's transaction ID
txid = "466200308696215bbc949d5141a49a4138ecdfdfaa2a8029c1f9bcecd1f96177"
# First, retrieve the raw transaction in hex
raw_tx = p.getrawtransaction(txid)
# Decode the transaction hex into a JSON object
decoded_tx = p.decoderawtransaction(raw_tx)
# Retrieve each of the outputs from the transaction
for output in decoded_tx['vout']:
print(output['scriptPubKey']['address'], output['value'])
```

运行此代码,我们得到:

$ python rpc\_transaction.py bc1p8dqa4wjvnt890qmfws83te0v3qxzsfu7ul63kp7u56w8qc0qwp5qv995qn 0.00020000 bc1qwafvze0200nh9vkq4jmlf4sy0tn0ga5w0zpkpg 0.00075000

前面的两个例子都相当简单。你不真的需要一个程序来运行它们;你可以同样使用bitcoin-cli助手。然而,下一个例子需要几百个RPC调用,并更清晰地展示了编程接口的使用。 

在示例3-6中,我们首先检索一个块,然后通过引用每个交易ID检索其中的每个交易。接下来,我们遍历每个交易的输出,并累加其值。 

示例3-6。检索一个块并添加所有交易输出

```python
// Some codepyth
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
# 探索和解码交易

在“从在线商店购买”中,Alice从Bob的商店购买了商品。她的交易已记录在区块链上。让我们使用 API 通过传递交易ID(txid)作为参数来检索和检查该交易:

\
$ bitcoin-cli getrawtransaction 466200308696215bbc949d5141a49a41\\\
38ecdfdfaa2a8029c1f9bcecd1f96177

01000000000101eb3ae38f27191aa5f3850dc9cad00492b88b72404f9da13569 8679268041c54a0100000000ffffffff02204e0000000000002251203b41daba 4c9ace578369740f15e5ec880c28279ee7f51b07dca69c7061e07068f8240100 000000001600147752c165ea7be772b2c0acb7f4d6047ae6f4768e0141cf5efe 2d8ef13ed0af21d4f4cb82422d6252d70324f6f4576b727b7d918e521c00b51b e739df2f899c49dc267c0ad280aca6dab0d2fa2b42a45182fc83e817130100000000

{% hint style="info" %}
交易ID(txid)并不具有权威性。在区块链中找不到txid并不意味着该交易未被处理。这被称为“交易可塑性”,因为在交易确认之前,交易可以被修改,从而改变其txid。一旦交易被包含在一个区块中,其txid就不能更改,除非发生了区块链重组,其中该区块从最佳区块链中被移除。在交易获得几个确认之后,区块链重组变得十分罕见。
{% endhint %}

命令getrawtransaction以十六进制表示返回一个序列化的交易。为了解码它,我们使用decoderawtransaction命令,并将十六进制数据作为参数传递。您可以复制getrawtransaction返回的十六进制数据,并将其粘贴为decoderawtransaction的参数:

$ bitcoin-cli decoderawtransaction 01000000000101eb3ae38f27191aa5f3850dc9cad0\
0492b88b72404f9da135698679268041c54a0100000000ffffffff02204e00000000000022512\
03b41daba4c9ace578369740f15e5ec880c28279ee7f51b07dca69c7061e07068f82401000000\
00001600147752c165ea7be772b2c0acb7f4d6047ae6f4768e0141cf5efe2d8ef13ed0af21d4f\
4cb82422d6252d70324f6f4576b727b7d918e521c00b51be739df2f899c49dc267c0ad280aca6\
dab0d2fa2b42a45182fc83e817130100000000

```json
{
"txid": "466200308696215bbc949d5141a49a4138ecdfdfaa2a8029c1f9bcecd1f96177",
"hash": "f7cdbc7cf8b910d35cc69962e791138624e4eae7901010a6da4c02e7d238cdac",
"version": 1,
"size": 194,
"vsize": 143,
"weight": 569,
"locktime": 0,
"vin": [{
"txid": "4ac541802679866935a19d4f40728bb89204d0cac90d85f3a51a19...aeb",
"vout": 1,
"scriptSig": {
"asm": "",
"hex": ""
},
"txinwitness": [
"cf5efe2d8ef13ed0af21d4f4cb82422d6252d70324f6f4576b727b7d918e5...301"
],
"sequence": 4294967295
}],
"vout": [{
"value": 0.00020000,
"n": 0,
"scriptPubKey": {
"asm": "1 3b41daba4c9ace578369740f15e5ec880c28279ee7f51b07dca...068",
"desc": "rawtr(3b41daba4c9ace578369740f15e5ec880c28279ee7f51b...6ev",
"hex": "51203b41daba4c9ace578369740f15e5ec880c28279ee7f51b07d...068",
"address": "bc1p8dqa4wjvnt890qmfws83te0v3qxzsfu7ul63kp7u56w8q...5qn",
"type": "witness_v1_taproot"
}
},
{
"value": 0.00075000,
"n": 1,
"scriptPubKey": {
"asm": "0 7752c165ea7be772b2c0acb7f4d6047ae6f4768e",
"desc": "addr(bc1qwafvze0200nh9vkq4jmlf4sy0tn0ga5w0zpkpg)#qq404gts",
"hex": "00147752c165ea7be772b2c0acb7f4d6047ae6f4768e",
"address": "bc1qwafvze0200nh9vkq4jmlf4sy0tn0ga5w0zpkpg",
"type": "witness_v0_keyhash"
}
}
]
}
```

\
交易解码显示了此交易的所有组件,包括交易输入和输出。在这种情况下,我们看到该交易使用了一个输入,并生成了两个输出。这笔交易的输入是来自先前确认的交易的输出(显示为输入txid)。这两个输出对应于付款给Bob和找零返回给Alice。

我们可以通过使用相同的命令(例如getrawtransaction)检查在此交易中引用其txid的先前交易来进一步探索区块链。从一笔交易跳转到另一笔交易,我们可以跟踪一系列交易,从而了解硬币是如何从一个所有者传递到下一个所有者的。

\
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# 探索区块

探索区块与探索交易类似。然而,区块可以通过区块高度或区块哈希来引用。首先,让我们通过区块高度找到一个区块。我们使用getblockhash命令,该命令以区块高度作为参数,并返回该区块的区块头哈希:

$ bitcoin-cli getblockhash 123456

0000000000002917ed80650c6174aac8dfc46f5fe36480aaef682ff6cd83c3ca

现在我们知道了我们选择的区块的区块头哈希,我们可以查询该区块。我们使用getblock命令,并将区块哈希作为参数:

$ bitcoin-cli getblock 0000000000002917ed80650c6174aac8dfc46f5fe36480aaef682f\
f6cd83c3ca

```json
{
"hash": "0000000000002917ed80650c6174aac8dfc46f5fe36480aaef682ff6cd83c3ca",
"confirmations": 651742,
"height": 123456,
"version": 1,
"versionHex": "00000001",
"merkleroot": "0e60651a9934e8f0decd1c[...]48fca0cd1c84a21ddfde95033762d86c",
"time": 1305200806,
"mediantime": 1305197900,
"nonce": 2436437219,
"bits": "1a6a93b3",
"difficulty": 157416.4018436489,
"chainwork": "[...]00000000000000000000000000000000000000541788211ac227bc",
"nTx": 13,
"previousblockhash": "[...]60bc96a44724fd72daf9b92cf8ad00510b5224c6253ac40095",
"nextblockhash": "[...]00129f5f02be247070bf7334d3753e4ddee502780c2acaecec6d66",
"strippedsize": 4179,
"size": 4179,
"weight": 16716,
"tx": [
"5b75086dafeede555fc8f9a810d8b10df57c46f9f176ccc3dd8d2fa20edd685b",
"e3d0425ab346dd5b76f44c222a4bb5d16640a4247050ef82462ab17e229c83b4",
"137d247eca8b99dee58e1e9232014183a5c5a9e338001a0109df32794cdcc92e",
"5fd167f7b8c417e59106ef5acfe181b09d71b8353a61a55a2f01aa266af5412d",
"60925f1948b71f429d514ead7ae7391e0edf965bf5a60331398dae24c6964774",
"d4d5fc1529487527e9873256934dfb1e4cdcb39f4c0509577ca19bfad6c5d28f",
"7b29d65e5018c56a33652085dbb13f2df39a1a9942bfe1f7e78e97919a6bdea2",
"0b89e120efd0a4674c127a76ff5f7590ca304e6a064fbc51adffbd7ce3a3deef",
"603f2044da9656084174cfb5812feaf510f862d3addcf70cacce3dc55dab446e",
"9a4ed892b43a4df916a7a1213b78e83cd83f5695f635d535c94b2b65ffb144d3",
"dda726e3dad9504dce5098dfab5064ecd4a7650bfe854bb2606da3152b60e427",
"e46ea8b4d68719b65ead930f07f1f3804cb3701014f8e6d76c4bdbc390893b94",
"864a102aeedf53dd9b2baab4eeb898c5083fde6141113e0606b664c41fe15e1f"
]
}
```

确认(confirmations)条目告诉我们这个区块的深度——有多少个区块是在其之上构建的,这表明改变该区块中任何交易的难度。高度告诉我们在该区块之前有多少个区块。我们看到了该区块的版本、创建时间(根据其矿工)、之前的11个区块的中位时间(对矿工来说更难以操纵的时间测量),以及区块的大小以三种不同的度量方式(其传统的剥离大小、完整大小和权重单位中的大小)。我们还看到了一些用于安全性和工作证明的字段(默克尔根、随机数、位、难度和链工作量);我们将在第12章中对这些进行详细探讨。

\
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# 比特币开发环境

如果您是一名开发人员,您将希望建立一个开发环境,其中包括编写比特币应用程序所需的所有工具、库和支持软件。在这一高度技术的章节中,我们将逐步介绍这个过程。如果材料变得过于密集(而且您实际上并没有建立开发环境),请随时跳到下一章,那里的内容不那么技术性。
Loading

0 comments on commit 0de284d

Please sign in to comment.