一、比特币协议与实现
从技术角度看,比特币是一种数字加密货币协议,它仅仅约定了在比特币网络中 节点旳行为规范,因此任何人都可以遵照此规范实现自己的比特币节点软件并接入 比特币网络。如果你希望深入了解比特币协议,可以查看 这里。
容易理解,在现有的诸多实现中,最著名的就是最早由中本聪本人发起的 BitcoinCore项目:
BitcoinCore被称为比特币协议的参考实现,这意味着它给出了比特币协议的每 一部分应当如何实现的权威参考或者说范本,因此在本课程中将基于该软件学习比特币的使用 和应用开发。课程环境中预置了BitcoinCore软件,如果你需要在自己的机器上 练习,可以从官方网站下载。
在BitcoinCore项目中,包含了两个完整的比特币协议实现:图形版的bitcoin-qt和 命令行版的bitcoind,我们称之为节点软件。这两个软件的作用是一致的, 在本课程在线环境中将使用bitcoind来部署比特币节点:
部署在不同计算机上的节点软件可以彼此联通成一个复杂的P2P网络,进而实现 比特币交易的中继、广播与确认,因此是整个比特币网络的核心。
节点软件通常也提供基于JSON RPC的API接口,以便其他应用集成对比特币区块链 的访问能力。在BitcoinCore项目中的bitcoin-cli软件就是一个基于节点RPC API的 命令行工具,我们将使用这个工具来学习比特币的一些常用操作。
二、节点软件与客户端
节点软件是比特币网络的核心,因此在继续下面的课程之前,我们先在1# 终端启动节点软件bitcoind:~$ bitcoind
在1#终端按Ctrl+C就可以结束bitcoind的运行,或者在2#终端,使用 pkill命令结束:~$ pkill bitcoind
如果希望将区块链清零,可以在停止bitoind的运行后,删除整个数据目录, 然后重新启动
~$ pkill bitcoind
~$ rm -rf ~/.bitcoin/regtest
~$ bitcoind
配置节点软件
bitcoind的运行依赖于其配置文件,在ubuntu中,该文件的路径为~/.bitcoin/bitcoin.conf。
对于一个新部署的bitcoind节点,首先需要修改的是RPC API的访问控制, 下面的设定将允许客户端以用户user和密码123456来访问RPC API接口:
rpcuser=user
rpcpassword=123456
bitcoind有三种运行模式,可以分别连接到主链、测试链或构建一个单节点 的私有链用于开发。在本课程中,我们将其运行模式设置为私有链模式:
regtest=1
使用客户端工具
节点软件bitcoind实现了完整的比特币规范,但是它没有提供人机操作接口, 因此我们需要借助于bitcoin-cli这个命令行工具来访问节点软件提供的功能。
例如,可以使用getbalance子命令来获取节点钱包余额:
注意:如果没有执行过其他的操作,你看到的余额应该是0.00000000。
bitcoin-cli的子命令对应于节点旳JSON RPC开发接口,可以完成地址创建、 交易发送、余额查询、区块浏览等诸多任务。
三、身份:密钥与地址
比特币的身份识别体系是建立在非对称加密技术之上的去中心化系统, 每一个身份对应着一对密钥。
非对称加密采用一对密钥(私钥、公钥)进行数据的加密或解密: 用私钥加密,则需要用公钥解密;用公钥加密,则需要用私钥解密。 这一非对称特性使得其非常适合用于身份表示与验证 —— 公钥用于 身份的表示,而私钥则用于身份的验证:
在上图中,当tommy需要向jerry发送原始数据时,他首先使用自己的私钥对 原始数据进行签名,得到的签名数据附加在原始数据后面,一同发送给jerry。 jerry收到数据后,使用tommy的公钥就可以验证签名是否是由tommy的私钥签发的, 从而确认该数据确实来自于tommy。