比特币:Bitcoin(BTC),A Peer-to-Peer Electronic Cash System,点对点电子现金体统
1、起源
- 中本聪在2009年初挖出第一批比特币
- 总量不超过2100万枚
2、底层机制
- 去中心化,P2P分布式数字货币系统
- 共识机制-POW工作量证明
- 非对称加密算法-数字签名
- 区块链账本技术
3、特性
- 硬通货-跨境交易
- 易携带-只需一个私钥
- 隐秘性-只暴露钱包地址
- 无货币超发
4、钱包
- 钱包就是P2P里的P(节点),主要是用来管理私钥和比特币转账地址
- 钱包分类
- 轻钱包——只存储维护跟你自己交易相关的数据
- 中心化钱包——数字货币交易所
- 钱包下载地址
https://bitcoin.org/zh_CN/downlo
5、比特币产生
- 比特币由矿工挖矿产生
- 生成的比特币被记录在矿工的名下
- 比特币通过矿工的公钥哈希值锁定
- 比特币通过交易(UTXO)在节点之间转移
- UTXO-未花费的交易
6、UTXO
UTXO(unspent transaction output):未花费交易输出,比特币的交易都是基于UTXO上的,即交易的输入是之前交易未花费的输出,这笔交易的输出可以被当做下一笔新交易的输入;
比特币拥有者的公钥锁定(加密)的一个数字
UTXO就是比特币,比特币系统中只有UTXO,没有比特币,也没有余额的概念,只有分散到区块链里的UTXO,钱包中的“余额”是通过计算得来 ,UTXO是交易的基本单元,不能再分割
新的UTXO由挖矿或交易产生
挖矿奖励属于一个特殊的交易(称为coinbase交易),可以没有输入。
UTXO存在全节点的数据库里
转账交易消耗自己的UTXO,同时生产新的UTXO,并用接收者的公钥锁定
7、交易模型
-
交易输出(UTXO)
- 锁定的比特币数量
- 锁定脚本(用接受者的公钥哈希)
-
交易输入(UTXO + 解锁脚本)
- 解锁脚本(发送者的签名和公钥)
签名:对发送者和接受者的公钥哈希以及整个交易签名
8、交易全流程
1、起初,第一个挖出的区块里面包含了一个coinbase交易,在coinbase交易中,没有输入,所以也就不需要签名,coinbase交易的输出包含了一个哈希过的公钥(使用的是RIPEMD16(SHA256(PubKey))算法)
2、当一个人发送比特币时,就会创建一笔交易,这笔交易的输入会引用之前交易的输出,每个输入会存储一个公钥(没有被哈希)和整个交易的一个签名
3、比特币网络中接收到交易的其他节点会对该交易进行验证——在一个输入中,公钥哈希与所引用的输出哈希相匹配(这保证了发送发只能花费属于自己的币);签名是正确的(这保证了交易是由币的实际拥有者所创建的)
4、当一个矿工准备挖一个新块时,他会将交易放到块中,然后开始挖矿
5、当新矿被挖出来以后,网络中的所有其他节点会受到一条消息,告诉其他人这个块已经被挖出并被加入到区块链
6、当一个块被加入到区块链以后,交易就算完成,他的输出就可以在新的交易中被引用
9、区块链:分布式账本系统
- 共识机制—POW工作量证明
- 通过挖矿证明自己的善意节点,并获得生成区块和在该区块记账的权利
- 基于P2P网络,每个全节点都存储着最全的比特币交易记录
- 新区块通过包含前一个区块头部的哈希值(区块的唯一标识)建立链接关系
- 区块里装的就是所有的比特币交易记录(UTXO)
10、区块链网络
区块链网络中有三种区块链节点:
- 矿工:运行于强大或专用的硬件(比如ASIC)之上,主要目的是挖矿;
- 全节点:这些节点验证挖出来的块的有效性,并对交易进行确认;
- SPV节点:简单支付验证,如钱包节点
11、挖矿
- 在全网中和其他节点竞争计算(解一个难题)的过程
- 证明自己是非恶意节点
- 获得的权利和义务
- 记账权:把交易写入区块里
- 广播义务:把区块在全网广播
- 获得的奖励
- 挖矿奖励:12.5BTC
- 收取交易手续费
12、共识机制
- 拜占庭将军问题—共识机制之一
- POW(Proof of Work)——工作量证明
- 通过付出大量工作代价证明自己是非恶意节点(理性人都是逐利的,POW抑制了节点的恶意动机)
- 计算一个随机数(nonce),算出的正确随机数即POW
- 获取记账权利
- 打包交易并通知其他节点
13、交易确认
- 当一项交易被链上的区块收录以后,就是交易确认
- 在此区块之后每产生一个区块,此现交易的确认数相应加1
- 经过6个以上区块确认的交易才是安全的,因为篡改成本巨大
- 比特币钱包可以设置交易确认数
14、区块生成
- 矿工在挖矿前要组建区块
- 将coinbase交易打包进区块
- 将交易池中高优先级的交易打包进区块
- 创建区块头部
- 挖矿成功后,将计算出来的随机数nonce(POW)填入区块头部,并向临近节点传播
15、区块验证
相邻节点收到新区块后,立即做以下验证
- 验证POW的nonce值是否符合难度值
- 检查时间戳是否小于当前时间两小时
- 检查merkle树根是否正确
- 检查区块size要小于区块size的上限
- 第一笔交易必须是coinbase交易
- 验证每个交易
16、区块链分类
- 公有链
- 任何人都可以参与使用和维护,信息公开,比如比特币,以太坊等
- 联盟链
- 若干组织共同维护,使用有权限限制,信息受保护,如银联组织
- 私有链
- 集中管理者进行限制,内部少数人可以使用,信息不公开
16、区块链——篡改账本
- 双花问题:同一笔比特币被支付多次
17、P2P网络
- 交易广播
- 区块广播
- 钱包广播—主要是广播钱包的公钥
P2P网络是指位于同一网络中的每台计算机都彼此对等(是指在网络层面上节点是平等的,但各节点在功能上可以有不同的分工, 如钱包节点、挖矿节点等),各个节点共同提供网络服务,不存在任何“特殊”节点,每个网络节点以扁平(flat)的拓扑结构相互连通。
对比中心化网络,在P2P网络中不存在任何服务端(server)、中央化的服务。
P2P网络的节点之间交互连接、协同,每个节点在对外提供服务的同时也使用网络中其他节点所提供的服务,每个节点即是服务端又是客户端。
P2P网络模型除应用于比特币网络,使用广泛的BT下载就是基于P2P网络。
P2P网络不仅仅去除了中心化带来的风险(中心化可能作恶),还可以提高传输的效率。(中心化网络当能也有优点)
18、节点发现
为了能够加入到比特币网络,比特币客户端会做一下几件事情:
1、节点会记住它最近成功连接的网络节点,当重新启动后它可以迅速与先前的对等节点网络重新建立连接。
2、节点会在失去已有连接时尝试发现新节点。
3、当建立一个或多个连接后,节点将一条包含自身IP地址消息发送给其相邻节点。相邻节点再将此消息依次转发给它们各自的相邻节点,从而保证节点信息被多个节点所接收、保证连接更稳定。
4、新接入的节点可以向它的相邻节点发送获取地址getaddr消息,要求它们返回其已知对等节点的IP地址列表。节点可以找到需连接到的对等节点。
5、在节点启动时,可以给节点指定一个正活跃节点IP, 如果没有,客户端也维持一个列表,列出了那些长期稳定运行的节点。这样的节点也被称为种子节点(其实和BT下载的种子文件道理是一样的),就可以通过种子节点来快速发现网络中的其他节点。
19、节点通信
比特币节点通常采用TCP协议、使用8333端口与相邻节点建立连接, 建立连接时也会有认证“握手”的通信过程,用来确定协议版本,软件版本,节点IP,区块高度等。
当节点连接到相邻节点后,接着就开始跟相邻节点同步区块链数据(轻量级钱包应用其实不会同步所有区块数据),节点们会交换一个getblocks消息,它包含本地区块链最顶端的哈希值。如果某个节点识别出它接收到的哈希值并不属于顶端区块,而是属于一个非顶端区块的旧区块,就说其自身的本地区块链比其他节点的区块链更长,并告诉其他节点需要补充区块,其他节点发送getdata消息来请求区块,验证后更新到本地区块链中。
20、区块结构
每个数据区块包含区块头和区块体。
区块头封装了当前版本号、前一区块哈希值、当前区块PoW要求的随机数(Nonce)、时间戳、以及Merkle根信息。
区块体则包括当前区块经过验证的、 区块创建过程中生成的所有交易记录。这些记录通过 Merkle树的哈希过程生成唯一的Merkle根并记入区块头。
注:区块哈希值实际上并不包含在区块的数据结构里,其实区块打包时只有区块头被用于计算哈希(从网络被接收时由每个节点计算出来),常说的区块哈希值实际是区块头哈希值,它可以用来唯一、明确地标识一个区块。
21、持久化(数据库)和序列化
本质上,区块链是一个分布式数据库。
比特币使用的是 LevelDB。
https://en.bitcoin.it/wiki/Bitcoin_Core_0.11_(ch_2):_Data_Storage
Bitcoin Core 使用两个 “bucket” 来存储数据:
1、其中一个 bucket 是 blocks,它存储了描述一条链中所有块的元数据
2、另一个 bucket 是 chainstate,存储了一条链的状态,也就是当前所有的未花费的交易输出(UTXO),和一些元数据。
此外,出于性能的考虑,Bitcoin Core 将每个区块(block)存储为磁盘上的不同文件。如此一来,就不需要仅仅为了读取一个单一的块而将所有(或者部分)的块都加载到内存中。
在 blocks 中,key -> value 为:
在 chainstate,key -> value 为: