程序员区块链研习社区块链大学

《精通比特币》笔记 - bitcoin核心接口

2017-11-15  本文已影响832人  程序员在深圳

前面我们介绍了如何安装及运行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可以看出来,知道这一点后,你可以继续使用这两个命令来查看以前的交易情况。

查看区块

查看区块分两个步骤

  1. 根据区块高度查看区块hash
  2. 根据区块hash查看区块中的信息

第一个步骤由getblockhash这个命令完成,第二个由getblock完成,下面我们来查看区块高度为0的区块(创始区块)信息,先拿到区块hash

$ sudo docker run --rm --network container:bitcoind amacneil/bitcoin  bitcoin-cli getblockhash 0
000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

再通过返回的hash000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f)去查看区块中的信息

$ 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个交易信息,前面的大部分区块应该都是中本聪自己挖的,通过这些命令你可以找到一些“历史足迹”,有意思吧,赶紧动手自己玩一下吧。

可编程接口

最后,如果你对上面这些接口调用的实现方式感兴趣,有两种方式可以帮助你更深入的了解

  1. 阅读bitcoin-cli的源码
  2. 阅读其他高级语言的实现,书中提供了这种方法,具体可以阅读github.com/bitcoinbook/bitcoinbook/tree/second_edition/code/{rpc_example.py,rpc_transaction.py,rpc_block.py}这几个文件的代码
上一篇下一篇

猜你喜欢

热点阅读