《精通比特币》笔记 - bitcoin核心接口
前面我们介绍了如何安装及运行bitcoind
后台程序,今天我们来看一下它的接口API
(Application Programming Interface),读完了这篇文章后,相信你和比特币的距离会进一步的拉近,因为你不再停留在理论层面,而是真正的在使用它了。
在编译完bitcoin
后,我们可以在src目录下看到一个bitcoin-cli
的程序
$ ls ~/github/bitcoin/src/bitcoin-cli
/Users/fengyajie/github/bitcoin/src/bitcoin-cli
这个程序可以远程调用(RPC-Remote Procedure Call)bitcoind
所提供的接口,所以你需要先运行bitcoind
,如果你觉得编译bitcoin
太麻烦,我这里再给你提供一个更简单的方法——运行docker
版的bitcoin
,这样只要你拥有一个64bit的系统,安装docker
,下载一个bitcoin
的镜像,就可以运行起来了,其实我就是这样做的,你可以在这里查看如何使用docker-bitcoin
。
使用简介
先来看一下bitcoind
在我的Ubuntu
机器上的运行状态
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6e34fcf30ca7 amacneil/bitcoin "/entrypoint.sh bi..." 17 hours ago Up 17 hours 8332-8333/tcp, 18332-18333/tcp bitcoind
$ sudo du -h _data
77M _data/blocks/index
119G _data/blocks
3.3G _data/chainstate
1.2M _data/database
4.0K _data/bitcoin
122G _data
可以看到这个程序运行了17个小时,且积累了119G
的交易数据,好了,下面我们就来正式看一下bitcoin-cli
具备哪些功能吧。
一般每个程序都会提供帮助文档,bitcoin-cli
也不例外,你可以输入bitcoin-cli help
列出该程序具备的所有功能,功能很多,我这里只列出头部和尾部
$ sudo docker run --rm --network container:bitcoind amacneil/bitcoin bitcoin-cli help
== Blockchain ==
getbestblockhash
getblock "blockhash" ( verbose )
getblockchaininfo
……
……
setaccount "address" "account"
settxfee amount
signmessage "address" "message"
你可以把help
返回的结果当做一个功能索引来对待,要具体查看某个命令的功能,可以在help
后面再加上这个命令的名字,例如你想了解getblockhash
命令的用法,你可以这样做
$ sudo docker run --rm --network container:bitcoind amacneil/bitcoin 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:
"hash" (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/
可以看到getblockhash
返回一个指定区块高度的块的hash
值,具体操作一下试试
$ sudo docker run --rm --network container:bitcoind amacneil/bitcoin bitcoin-cli getblockhash 1000
00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09
更多有用的命令
获取Bitcoin Core的信息
如果你和我一样是使用的docker
版的bitcoin
,你可能需要查看它的版本号,这时可以使用getinfo
命令来获取
$ sudo docker run --rm --network container:bitcoind amacneil/bitcoin bitcoin-cli getinfo
{
"version": 140200,
"protocolversion": 70015,
"walletversion": 130000,
"balance": 0.00000000,
"blocks": 494413,
"timeoffset": -1,
"connections": 8,
"proxy": "",
"difficulty": 1364422081125.147,
"testnet": false,
"keypoololdest": 1510574936,
"keypoolsize": 100,
"paytxfee": 0.00000000,
"relayfee": 0.00001000,
"errors": ""
}
这个命令返回json
结构的数据,可以看到版本号是140200,对应于github
上的v0.14.2
,协议版本号是70015,且本机上所存储的区块数是494413(区块高度)。
查看交易数据
如果你完成了一笔交易,会有一个唯一的交易号(txid)与之对应,此时你可以通过getrawtransaction
命令来查看原始交易数据,该命令接受一个交易号作为参数,前提是本地已经包括所要查找的区块
$ sudo docker run --rm --network container:bitcoind amacneil/bitcoin bitcoin-cli getrawtransaction 0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2
0100000001186f9f998a5aa6f048e51dd8419a14d8a0f1a8a2836dd734d2804fe65fa35779000000008b483045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e381301410484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adfffffffff0260e31600000000001976a914ab68025513c3dbd2f7b92a94e0581f5d50f654e788acd0ef8000000000001976a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac00000000
getrawtransaction
命令返回的是一串16进制的字符串,如果要查看其中的具体内容,还需要对其进行解密,同样是用bitcoin-cli
这个工具完成,下面我们把刚才的结果作为参数传递给decoderawtransaction
命令
$ sudo docker run --rm --network container:bitcoind amacneil/bitcoin bitcoin-cli decoderawtransaction 0100000001186f9f998a5aa6f048e51dd8419a14d8a0f1a8a2836dd734d2804fe65fa35779000000008b483045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e381301410484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adfffffffff0260e31600000000001976a914ab68025513c3dbd2f7b92a94e0581f5d50f654e788acd0ef8000000000001976a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac00000000
{
"txid": "0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2",
"hash": "0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2",
"size": 258,
"vsize": 258,
"version": 1,
"locktime": 0,
"vin": [
{
"txid": "7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",
"vout": 0,
"scriptSig": {
"asm": "3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813[ALL] 0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf",
"hex": "483045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e381301410484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf"
},
"sequence": 4294967295
}
],
"vout": [
{
"value": 0.01500000,
"n": 0,
"scriptPubKey": {
"asm": "OP_DUP OP_HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 OP_EQUALVERIFY OP_CHECKSIG",
"hex": "76a914ab68025513c3dbd2f7b92a94e0581f5d50f654e788ac",
"reqSigs": 1,
"type": "pubkeyhash",
"addresses": [
"1GdK9UzpHBzqzX2A9JFP3Di4weBwqgmoQA"
]
}
},
{
"value": 0.08450000,
"n": 1,
"scriptPubKey": {
"asm": "OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG",
"hex": "76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac",
"reqSigs": 1,
"type": "pubkeyhash",
"addresses": [
"1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK"
]
}
}
]
}
此时会返回一个可读的json数据结构,其中包括了全部的交易信息,vin
数组是交易的输入,vout
数组是交易的输出,可以看到,这笔交易包括1个输入和2个输出,同时输入来自于之前一笔交易的输出,从vin.txid
可以看出来,知道这一点后,你可以继续使用这两个命令来查看以前的交易情况。
查看区块
查看区块分两个步骤
- 根据区块高度查看区块
hash
- 根据区块
hash
查看区块中的信息
第一个步骤由getblockhash
这个命令完成,第二个由getblock
完成,下面我们来查看区块高度为0的区块(创始区块)信息,先拿到区块hash
$ sudo docker run --rm --network container:bitcoind amacneil/bitcoin bitcoin-cli getblockhash 0
000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
再通过返回的hash
(000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
)去查看区块中的信息
$ sudo docker run --rm --network container:bitcoind amacneil/bitcoin bitcoin-cli getblock 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
{
"hash": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",
"confirmations": 494423,
"strippedsize": 285,
"size": 285,
"weight": 1140,
"height": 0,
"version": 1,
"versionHex": "00000001",
"merkleroot": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
"tx": [
"4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"
],
"time": 1231006505,
"mediantime": 1231006505,
"nonce": 2083236893,
"bits": "1d00ffff",
"difficulty": 1,
"chainwork": "0000000000000000000000000000000000000000000000000000000100010001",
"nextblockhash": "00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048"
}
可以看到第0个区块里只包含1个交易信息,前面的大部分区块应该都是中本聪自己挖的,通过这些命令你可以找到一些“历史足迹”,有意思吧,赶紧动手自己玩一下吧。
可编程接口
最后,如果你对上面这些接口调用的实现方式感兴趣,有两种方式可以帮助你更深入的了解
- 阅读bitcoin-cli的源码
- 阅读其他高级语言的实现,书中提供了这种方法,具体可以阅读
github.com/bitcoinbook/bitcoinbook/tree/second_edition/code/{rpc_example.py,rpc_transaction.py,rpc_block.py}
这几个文件的代码