美文网首页程序员区块链研习社区块链大学
《精通比特币》笔记 - bitcoin核心接口

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

作者: 程序员在深圳 | 来源:发表于2017-11-15 13:33 被阅读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}这几个文件的代码

    相关文章

      网友评论

        本文标题:《精通比特币》笔记 - bitcoin核心接口

        本文链接:https://www.haomeiwen.com/subject/fqqzmxtx.html