bitcoin学习rpc部分

JSON-RPC
RPC引用

涉及到的主要的文件

httprpc.h
rawtransaction.cpp
validation.h

字节序列为大端表示
举例:

> bitcoin-cli getblock
< 000000000000000082ccf8f1557c5d40b21edabb18d2d691cfbf87118bac7254

显示的 hash 值如下
5472ac8b1187bfcf91d6d218bbda1eb2405d7c55f1f8cc820000000000000000

RPC 服务用来支持管理,钱包,查询(网路,区块数据)
如果使用 bitcoin-qt 默认 RPC 服务是关闭的。可以在配置文件 bitcoin.conf 中设置 server=1
或者启动时添加参数 -server
如果使用 bitcoind 默认 RPC 服务是开启的。
使用 RPC 服务需要认证,通过 rpcuserrpcpassword 提供。
bitcoin-cli 是客户端命令行工具用来访问 RPC 服务

RPC 服务监听端口mainnet 8332, testnet,regtest mode 18332,只支持 POST 操作
可以使用 rpcport 设置,默认监听本地端口,外部不能访问
使用 HTTP basic authentication 认证。 Content-Type=text/plainContent-Length 设置为请求体长度
遵循 JSON-RPC 规范,

下面是目前了解到的所有命令。总共 101 个命令

新增命令

参考

searchrawtransactions

新增命令,通过地址获取所有的 UTXOs

tyler@ubuntu16:~/Documents/primecoin-core-desktop-src$ ./src/primecoin-cli -rpcuser=user -rpcpassword=password searchrawtransactions AVAiurQjh4CsxsHoqfPzQxAF3tCU7jFNL7
[
{
"txid": "a0dd0f30ae94e194221cfb27aee74d983c60d18062a9777b26cacfbfaef2b55e",
"hash": "a0dd0f30ae94e194221cfb27aee74d983c60d18062a9777b26cacfbfaef2b55e",
"version": 1,
"size": 108,
"vsize": 108,
"locktime": 0,
"vin": [
{
"coinbase": "02cd0d010400062f503253482f",
"sequence": 4294967295
}
],
"vout": [
{
"value": 19.02000000,
"n": 0,
"scriptPubKey": {
"asm": "02fa5626eeab2fe38de0e6af08d720108459420c43aadfcd2d8eb20bdb3146261e OP_CHECKSIG",
"hex": "2102fa5626eeab2fe38de0e6af08d720108459420c43aadfcd2d8eb20bdb3146261eac",
"reqSigs": 1,
"type": "pubkey",
"addresses": [
"AVAiurQjh4CsxsHoqfPzQxAF3tCU7jFNL7"
]
}
}
],
"hex": "01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0d02cd0d010400062f503253482fffffffff0180375e7100000000232102fa5626eeab2fe38de0e6af08d720108459420c43aadfcd2d8eb20bdb3146261eac00000000",
"blockhash": "0f0f1b6a376027421fd3ccbc142192750c06f8403bb155d8f5fc95cb49aaa1a3",
"confirmations": 2769364,
"time": 1373347816,
"blocktime": 1373347816
}
]
curl --user user:password --data-binary '{"jsonrpc":"1.0", "id":"curltest", "method":"searchrawtransactions","params":["ATyjPcDsQgHgCjX5mi1U3xgrKp36QRiWVj"]}' -H 'content-type: text/plain;' http://103.84.87.82:9912/

getaddressbalance

Requires Config: addressindex=1
从已确认交易中查询一个或多个地址的余额,返回单位是 satoshis
下面是 PrimeCoin 地址
AUwoythQxMwt9qW32fcBvoAC716kg4mtGm
ANqptFgMreMPaWkDtduUtL4pCb4TD44rdD
AHmMUftyK8d6TNcExDmj9JPFxNNobGCgZZ

AUwoythQxMwt9qW32fcBvoAC716kg4mtGm 的 txid
2ba413e793f565715a0fc29a96d46c2ebc61788644b6b17e1f7ac835c96c2c41

AajqvJzE7yAiNucm1Rvrcju8rKNG3s8XQu 的 txid
2ba413e793f565715a0fc29a96d46c2ebc61788644b6b17e1f7ac835c96c2c41

ATyjPcDsQgHgCjX5mi1U3xgrKp36QRiWVj 的 txid
62d0db870af1a15aa4109ccb92737ea8735a5fa9eac6e46a5ba2b75dd356264a

bitcoin-cli getaddressbalance '{"addresses": ["12c6DSiU4Rq3P4ZxziKxzrL5LmMBrzjrJX"]}'
{
"balance": 25527936,
"received": 25527936
}

说明:received 是接收到的资产,包括从同一个地址收到的找零

使用 http 访问

curl --user user:password --data-binary '{"jsonrpc":"1.0", "id":"curltest", "method":"getaddressbalance","params":["{\"addresses\":[\"AaigSgLkYT638VT7DswGGzLszUXdDexo4b\",\"AaigSgLkYT638VT7DswGGzLszUXdDexo4b\"]}"]}' -H 'content-type: text/plain;' http://127.0.0.1:9912/

调试指令

r -printtoconsole -rpcuser=user -rpcpassword=password -txindex=1 -addrindex=1

./src/primecoin-cli -rpcuser=user -rpcpassword=password getaddressbalance '{"addresses": ["12c6DSiU4Rq3P4ZxziKxzrL5LmMBrzjrJX"]}'

getaddresstxids

Requires Config: addressindex=1
搜索涉及到一个或多个地址的 txids,按照块排序,最近的块在最下面。只包括确认的交易,可以指定块的高度范围。

root@szftest:/home/user# ./src/primecoin-cli -rpcuser=user -rpcpassword=password getaddresstxids '{"addresses": ["12c6DSiU4Rq3P4ZxziKxzrL5LmMBrzjrJX"], "start": 220151, "end": 320261}'
[
"fd87f9adebb17f4ebb1673da76ff48ad29e64b7afa02fda0f2c14e43d220fe24",
"36ebe0ca3237002acb12e1474a3859bde0ac84b419ec4ae373e63363ebef731c",
"d658ab87cc053b8dbcfd4aa2717fd23cc3edfe90ec75351fadd6a0f7993b461d",
"ffd901679de65d4398de90cefe68d2c3ef073c41f7e8dbec2fb5cd75fe71dfe7",
"a66dddd42f9f2491d3c336ce5527d45cc5c2163aaed3158f81dc054447f447a2",
"065ef6b1463f552f675622a5d1fd2c08d6324b4402049f68e767a719e2049e8d",
"cea36d008badf5c7866894b191d3239de9582d89b6b452b596f1f1b76347f8cb",
"a3a6f902a51a2cbebede144e48a88c05e608c2cce28024041a5b9874013a1e2a",
"24087a08309ea5796ef139e65f13ce10db1e4465057b665b9d5102a640aac6be",
"91b21c74b6b9cc168fc9a079d0aadf4acc90706196a7278cd674611a9104122e",
"1b0235867691784492804fce22a18c2337c97d58a1c63fc275fe26137596d671",
"7f66c5e6a8bb4b9e640dfcb097232c740a43481dc02817959f48c48d3436b583"
]

getaddressutxos

Requires Config: addressindex=1
返回一个或多个地址的未消费输出,只包括已确认交易,按照区块高度排序

~$ bitcoin-cli getaddressutxos '{"addresses": ["12cbQLTFMXRnSzktFkuoG3eHoMeFtpTu3S"]}'
[
{
"address": "12cbQLTFMXRnSzktFkuoG3eHoMeFtpTu3S",
"txid": "1554a02d4eb1c7a73e3736922ed99530e360784e709896c42e5756e65b2da341",
"outputIndex": 2,
"script": "76a91411b366edfc0a8b66feebae5c2e25a7b6a5d1cf3188ac",
"satoshis": 1,
"height": 220151
},
{
"address": "12cbQLTFMXRnSzktFkuoG3eHoMeFtpTu3S",
"txid": "20fb69a94413637cb50f65e473f91d2599a04d5a0bf9bf6a5e9e843df2710ea4",
"outputIndex": 0,
"script": "76a91411b366edfc0a8b66feebae5c2e25a7b6a5d1cf3188ac",
"satoshis": 30000,
"height": 228208
},
...
]

curl --user myusername --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "getaddressutxos", "params": [{"addresses": ["Pb7FLL3DyaAVP2eGfRiEkj4U8ZJ3RHLY9g"]}] }' -H 'content-type: text/plain;' http://127.0.0.1:51935/

Block Chain RPCs 20 个

GetBestBlockHash

主链的最近一个区块的 header hash

GetBlock

通过 header hash 获取区块 0.13.0 更新

GetBlockChainInfo

当前区块链的信息

GetBlockCount

主链的区块数量

GetBlockHash

返回主链指定高度的 header hash

GetBlockHeader

通过指定的 header hash 获取区块头 0.12.0 新增

GetChainTips

返回每个本地区块链的最高区块信息

GetDifficulty

返回 POW 的难度值,是最小难度的倍数

GetMemPoolAncestors

返回 mempool 中的一个交易的所有在 mempool 的祖先 0.13.0 新增

GetMemPoolDescendants

返回 mempool 中的一个交易的所有在 mempool 的后代 0.13.0 新增

GetMemPoolEntry

返回指定交易的 mempool data 0.13.0 新增

GetMemPoolInfo

返回节点当前交易 memory pool 的信息 0.12.0 更新

GetRawMemPool

返回所有 memory pool 中的交易标识 TXIDs 0.13.0 更新

GetTxOut

返回一笔交易输出的详细信息,只有 UTXOs 是保证存在的。

GetTxOutProof

返回一个区块中的一个或多个指定交易的 16 进制格式的证明信息

GetTxOutSetInfo

返回已确认的 UTXO 集合的统计数据

PreciousBlock

标识在同一网络中,比其他先接收的区块 0.14.0 新增

PruneBlockChain

按照指定的高度或时间戳来修建区块链 0.14.0 新增

VerifyChain

校验每个本地链的入口

VerifyTxOutProof

验证指向的区块中的一笔或多笔交易的工作证明,成功返回交易信息,如果不在主链返回 RPC 错误 0.11.0 新增

Control RPCs 3 个 过期 1 个

GetInfo 过期

打印节点和网络的相关信息

Help

列出所有的 RPC 命令,或者指定 RPC 命令的相关帮助信息

Stop

安全停止服务

Generating RPCs 2 个

Generate

立即生成一个区块 0.11.0 新增, 0.13.0 更新

GenerateToAddress

立即挖一个区块到指定地址 0.13.0 新增

Mining RPCs 5 个

GetBlockTemplate

获取一个区块模板给挖矿软件使用

GetMiningInfo

返回挖矿相关的信息 0.14.0 更新

GetNetworkHashPS

根据最后的区块信息估算当前或历史的每秒产生区块数

PrioritiseTransaction

向一笔交易增加虚拟的优先级或手续费,使交易以较低的优先级或手续费进入刚挖出的区块

SubmitBlock

接收一个区块,验证有效,并转发

Network RPCs 12 个

AddNode

从 addnode 列表中增加或删除一个节点,或者尝试连接一个节点一次。 0.14.0 更新

ClearBanned

清除禁止节点列表 0.12.0 新增

bitcoin-cli -rpcuser=user -rpcpassword=password clearbanned

curl --user myusername --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "clearbanned", "params": [] }' -H 'content-type: text/plain;' http://127.0.0.1:8332/

DisconnectNode

立即从指定节点断开 0.12.0 新增

GetAddedNodeInfo

返回添加节点或所有添加节点的信息 0.14.0 更新
只有手动使用 RPC 命令 addnode 添加的节点,才会有相关信息

GetConnectionCount

返回连接其他节点的数量

GetNetTotals

返回网络流量的相关信息,包括输入字节,输出字节和时间 0.12.0 更新

GetNetworkInfo

返回节点连接网络的相关信息 0.13.0 更新

GetPeerInfo

返回每个连接的网络节点的信息 0.13.0 更新

ListBanned

列出所有禁止的 IPs/Subnets 0.12.0 新增

Ping

发送一个 P2P ping 消息给所有节点,测试延迟,结果由 getpeerinfo RPC 命令的 pingtimepingwait 提供
单位是 10 进制的秒。
ping 命令和其他命令一样进入队列处理,所以反应的是处理延迟,不是网络 ping

SetBan

从禁止列表中添加或删除 IP/Subnet 0.12.0

SetNetworkActive

禁止,启用所有的 P2P 网络 0.14.0 新增

Raw Transaction RPCs 7 个

CreateRawTransaction

创建一个未签名的序列化交易

FundRawTransaction

增加输入到交易中直到满足输出数量

DecodeRawTransaction

解码 16 进制数据到 json 格式

DecodeScript

解码一个 16 进制的 P2SH 赎回脚本

GetRawTransaction

获取一个 16 进制的序列化交易或者 json 对象格式的交易

SendRawTransaction

验证交易并广播到网络

SignRawTransaction

使用钱包中的私钥对序列化交易做签名

Utility RPCs 6 个

CreateMultiSig

创建一个 P2SH 的多重签名地址

EstimateFee

按KiB估算交易的手续费

EstimatePriority

估算免费的高优先级交易 过期

GetMemoryInfo

获取使用的内存信息

ValidateAddress

返回指定的地址信息

VerifyMessage

验证一个签名信息

Wallet RPCs 46 个,7个过期的

AbandonTransaction

作废交易

AddWitnessAddress

为脚本添加一个证人地址

AddMultiSigAddress

添加一个多重签名地址

BackupWallet

备份 wallet.dat 到指定路径

BumpFee

使用一笔新的更高手续费的交易替换已签名 RBF 的未确认钱包交易

DumpPrivKey

返回对应地址的 wallet-import-format (WIP) 私钥

DumpWallet

使用用户可读的格式创建或重写钱包的秘钥

EncryptWallet

使用密码加密钱包

GetAccountAddress

返回账户对应的 bitcoin 地址

GetAccount

返回指定地址的账户名称

GetAddressesByAccount 过期

返回指定账户的地址列表

GetBalance

使用十进制表示的所有账户或者指定账户的余额

GetNewAddress

返回一个新的地址

GetRawChangeAddress

返回一个新的地址用来接收找零

GetReceivedByAccount 过期

返回交易中指定确认数的指定账户的地址接收的总额,不包括 coinbase 交易

GetReceivedByAddress

返回交易中指定确认数的指定地址接收的总额,不包括 coinbase 交易

GetTransaction

获取钱包内交易的详细信息 0.12.0 更新

GetUnconfirmedBalance

返回钱包的全部余额

GetWalletInfo

提供钱包相关的信息

ImportAddress

添加地址或公钥脚本到钱包,不关联私钥,可以用来查看相关交易

ImportMulti

导入多个地址或脚本

ImportPrunedFunds

对于修剪后的钱包,不需要重新扫描就可以导入资金

ImportPrivKey

添加私钥到钱包

ImportWallet

从钱包 dump 文件格式中导入私钥

KeyPoolRefill

填充未使用的预生成的秘钥的缓冲区

ListAccounts 过期

列出账户和余额

ListAddressGroupings

列出一组在相同交易中做为公开输入的有共同所有权的地址,或者从前一个作为找零用途的账户

ListLockUnspent

返回一组暂时无法消费的 outputs 列表

ListReceivedByAccount 过期

列出每个账户收到的总额

ListReceivedByAddress

列出每一个地址收到的总额

ListSinceBlock

返回从指定块,加上指定深度区块的 header hash 之后涉及到钱包的所有交易

ListTransactions 0.12.1 更新

列出涉及钱包的最近的交易

ListUnspent

列出属于钱包的 UTXO 数组 0.13.0 更新

LockUnspent

临时锁定或解锁指定的 outputs,被锁定的 outputs 在交易时不会被自动收集。

Move 过期

使用 off-block-chain 交易,在钱包内的账户间移动指定金额

RemovePrunedFunds 0.13.0 新加

从钱包删除指定的交易

SendFrom 过期

从本地账户消费到指定地址

SendMany

创建和广播一笔发送 outputs 到多个账户的交易

SendToAddress

消费到指定地址

SetAccount 过期

把指定地址放到给出的账户中

SetTxFee

设置本钱包创建的交易的手续费单位 /kb

SignMessage

使用一个地址的私钥对消息签名

SignMessageWithPrivKey 0.13.0 新增

使用输入的私钥对消息签名

WalletLock

从内存移除钱包的加密密钥,锁定钱包。
执行完该命令后,在调用任何需要解锁钱包的功能之前,需要再次调用 walletpassphrase

WalletPassphrase

按照输入的时间(秒),保存钱包的解锁密钥到内存中,重复发送该命令,可以设置新的时间

WalletPassphraseChange

设置新的钱包密码

Removed RPCs

  • GetGenerate: was removed in Bitcoin Core 0.13.0.
  • GetHashesPerSec: was removed in Bitcoin Core 0.11.0.
  • GetWork: was removed in Bitcoin Core 0.10.0.
  • SetGenerate: was removed in Bitcoin Core 0.13.0.