探索比特币源码3-熟悉RPC接口

1LSGO软件技术团队

贡献人:马燕鹏

如果喜欢这里的内容,你能够给我最大的帮助就是转发,告诉你的朋友,鼓励他们一起来学习。

If you like the content here, the greatest helpyou can give meis forwarding, so tell your friends and encourage them to learn together.

比特币核心客户端实现了 JSON-RPC 接口,这个接口可以通过命令行帮助程序 访问,也可以通过编程的形式在程序中访问。

本文主要探索3点:

什么是 JSON-RPC 接口

使用 进行 JSON-RPC 接口调用实验

区块链相关 RPC 接口快速一览

在下一文中我们重点研究如何通过编程的形式调用 Bitcoin Core 的 JSON-RPC

什么是 JSON-RPC 接口

作为一个我没接触过的概念,JSON-RPC 是什么?以下是我的一些简单理解,如有错误请指正

首先 RPC 翻译过来应该是远程过程调用(Remote Procedure Call),它是一种通信协议,规定了运行于一台计算机上的程序如何调用另一台计算机程序提供的接口或者说方法。

因此我觉得 RPC 可以作为一种 API 来理解,而 JSON-RPC 显然是 RPC 协议的其中一种,通信传输的数据格式为 JSON,即 JavaScript 对象符号。

当你想调用服务器端的 JSON-RPC 接口,你需要发送一个 JSON 格式的请求。

同样,当你成功发起一个 RPC 调用后(除非是通知类型的请求),服务端也会进行响应,响应返回一个 JSON 对象。

一个请求对象包含下列成员:

jsonrpc

method

params

id

一个响应对象包含下列成员:

jsonrpc

result

error

id

其中,jsonrpc 是协议版本

method 是请求调用的方法名称,params 是其对应的参数

result 是响应的调用结果

error 用来描述调用中出现的错误及类型

id 的作用应该是便于调用者将请求与响应一一对应

这是一组 JSON-RPC 的调用及响应示例

该示例模拟了调用 RPC 接口,执行服务器上的 "subtract" 方法,该方法实现了一个减法的功能,使用 "params" 指定方法的参数。随后,服务器返回响应结果:

更详细的解释及调用示例可以参见wiki JSON-RPC (https://zh.wikipedia.org/wiki/JSON-RPC)

使用 `bitcoin-cli` 进行 JSON-RPC 接口调用实验

就像之前几篇文章用到的 一样,命令行帮助程序 提供了对 Bitcoin Core 客户端 JSON-RPC 接口的访问。

我们来进行一些调用的交互实验,首先使用 help 命令查看所有可用的 RPC 接口:

可以看到,所有 RPC 接口被分为区块链、控制、生成、挖矿、网络、交易、应用、钱包等模块

我们以 类别下的命令为例进行探索

查找到 RPC 接口的名称后,可以进一步使用 help 获得相应命令的更多帮助,包括详细说明和参数信息

上面展示了使用help进一步获取 命令的帮助信息

区块链相关 RPC 接口快速一览

我是一边使用 命令,一边对照 区块链浏览器 (https://www.blockchain.com/zh-cn) 来对比特币 RPC 接口进行学习的

这个过程,会很枯燥并且会遇到很多理解上的障碍,但可以对比特币客户端具有的功能和区块链中的一些术语概念加深理解,不妨试试。

下面是我总结的区块链相关功能所有 RPC 命令的简单解释,可以用于快速的查找和熟悉接口。

其余模块的相关 RPC 接口我打算用到时再学习,这样能提升下学习比特币源码的进度。

获取指定hash值对应区块的区块信息

获取区块链运行的各种状态信息,例如当前区块高度,是否处于初始化区块同步阶段,区块链数据占用磁盘大小的估计值等等。

获取最长链中的区块数量

获取最长链中指定高度区块的hash值

获取指定hash值对应区块的区块头

获取区块树所有已知的提示信息,包括主链和孤立分支

获取有关区块链中交易总数和比率的统计数据

获取工作量证明的难度(作为最小难度的倍数返回)

获取mempool中指定交易的所有父交易

获取mempool中指定交易的所有子交易

获取指定交易的内存池数据

获取交易内存池状态的详细信息

获取内存池中所有的交易信息

获取一个未花费交易输出(utxo)的详细信息

获取某一个交易"txid"被包含于某一个区块中的证明

获取utxo集合的统计信息

将一个区块视为在同样工作量下比其他区块更早地被接收

将区块链裁剪到指定的高度或时间戳

将内存池中数据存储到磁盘

验证区块链数据库,可以设置验证的数量,彻底程度等

验证一个交易的凭证,返回凭证对应的交易

从当前来看,我觉得对编程爱好者最友好的就是区块链领域了,因为这个领域中所有的代码都是开源的,代码决定一切!哪怕项目方牛皮吹得天花乱坠,也不可能忽悠到我们,只有代码最可靠!为了更好的了解区块链这个领域,目前 LSGO软件技术团队 的一个小组,正在看BTC的源码,这是他们提交的学习成果!如果你对区块链领域感兴趣,可以加入进来,大家一起学习!

经过8年多的发展,LSGO软件技术团队在地理信息系统、数据统计分析、计算机视觉领域积累了丰富的研发经验,也建立了人才培养的完备体系。

欢迎对算法设计与实现感兴趣的同学加入,与我们共同成长进步。

本微信公众平台长期系统化提供有关机器学习、软件研发、教育及学习方法、数学建模的知识,并将以上知识转化为实践。拒绝知识碎片化、耐心打磨技能、解决实际问题是我们的宗旨和追求。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180809B00M1F00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券