0%

从零构建一个SPV钱包其一

从零构建一个SPV钱包其一

开篇

这是如何从零开始构建一个SPV钱包的开篇文章的第一篇,按照行文习惯,先列出系列文章的目的:

构建一个SPV钱包,确切的说是一个BTC的SPV钱包

在区块链世界中,去中心化一直是核心话题,实际上市面上很多钱包是有后端的,或者说有后端支援。出于种种目的,他们的钱包并非完全去中心化。但是BIP37给比特币提供了一个去中心的提案。本文的全部方案均起源于BIP37

https://github.com/bitcoin/bips/blob/master/bip-0037.mediawiki

BIP37是一切的起点,所以阅读本片文章的开端必然需要阅读BIP37。

准备

在正式开始之前,还需要预先的准备知识。因为不是知识普及型的文章,所以不准备介绍基本概念。但是需要提供的基本的知识会提到

首先会搭建BTC节点

关于如何搭建btc节点的文章很多,不列出。本文中使用过的节点版本为v0.18,其他稳定版本均可。使用环境为乌班图。一切以可以稳定运行比特币节点为主。它属于基础准备知识,并非重点。关于如何配置节点,可参考我的博文

比特币客户端设置

比特币节点远程访问

搭建节点之后,再按照以上文章的内容,达到的的目标是配置的比特币节点可以在远端访问。当然这并不是强制目的,我只是希望开发和运行比特币节点不是在一台机器上。只要搭建的比特币节点可以支持rpc访问即可。

理解比特币如何交易

交易是区块链系统的核心。在搭建一个比特币节点就是为了可以在这个节点上利用rpc发起交易,让读者理解比特币交易的具体形式(确切的说是构建裸交易的具体形式)。关于如何构建交易可以参考我的博文

比特币交易的基本问题

使用比特币节点进行交易

读了以上两篇博文之后,基本可以理解如何进行比特币裸交易的构建,在以下还是特意列出核心步骤

  1. 提取UTXO
  2. 发起交易
  3. 对交易进行签名
  4. 全网广播

理解比特币如何交易之后,就知道了如何发起一个基本的交易。基本交易的方式就是按照以上的步骤进行(特指使用本身提供的cli服务或者curl进行访问),如果还需要进一步(定义进一步为使用自己的rpc代码进行交互完成交易),我自己本身也写了一个rpc服务的代码,挂在我的githu上。很简陋,但是可以用。

准备的原因

有以上两方面的准备处于这个目的。其一,和比特币有关的东西都需要从搭建节点开始,虽然最后的代码中无需使用我们本地搭建的节点,以DNS探测为主,但这是基础中的基础。其二,使用SPV钱包最终也是要进行交易。我们在最开始的地方就确定最终的目标,防止在复杂的区块链钱包技术细节中迷失自己。为了达到这两个目的,我提到的文章建议阅读,如有其他疑惑也可以参考《精通比特币》一书。我很多对比特币最初的疑惑都在这本书中得到了解答。

理解基石

进行以后的步骤之后,是需要明白构建SPV钱包的基石我们实现交易的形式

  1. 搭建全节点,利用全节点提供的rpc服务进行交易。也就是准备章节的第二部分所提到的方法
  2. 利用SPV节点,借助SPV节点,利用比特币协议进行交互达到交易的目的。

Rome was not built in a day理解第一点,更有助于理解第二点。为此我专门绘制了如下的图

3fGrVg.md.jpg

以上的图体现了SPV体系的基本关系,对这张图提出一个简要的说明

第一部分是全节点的交易方式,全节点保存全部的交易数据,互相关联且拥有全部数据。是基本的比特币网络和基本交易形式

第二部分是我们需要关注的,SPV节点需要如何构建交易。为了清楚的说明问题,特地把wallet和spv且分开,其实我们要开发的钱包为了达到去中心化交易的目的,这两个部分是不可分割的。wallet链接一个SPV节点,SPV节点也通过p2p网络接入比特币网络。特别强调:SPV节点也需要和全节点相互链接才可以发挥正常的功能,否则spv节点数据缺失不足以完成正常功能。SPV节点发送loadfilter消息给fullNode。fullNode设置过滤器后加载过滤后的数据给SPV节点。其中用到的过滤器我布隆过滤器。他们之间的消息规范遵循比特币网络协议。此外SPV节点也需要存储完整的blockheader用于消息的验证。

比特币网络协议请参考如下

https://en.bitcoin.it/wiki/Protocol_documentation

请务必仔细研读,它对于后续的工作意义非凡。也需要反复参阅!

基础理论的准备工作先写到这里,后续的细节会成为一个系列文章。本文也会在后续有较大幅度的改动。

待续…