现在区块链技术十分火爆, 玩客币推出后, 迅雷股价从10月初的8美元左右一度飙升至27美元!! 资本市场对区块链概念和比特币模式非常看好.
比特币就是区块链技术的一个成功应用.
"区块链"概念介绍
区块链技术也被称之为分布式账本, 是一种互联网数据库技术, 特点是去中心化, 公开透明, 让每个人均可参与数据库记录.
上面这一句来自百度百科. 我第一次看过之后对区块链还是一头雾水. 还看了知乎上关于区块链的回答. 知乎上的回答多是将区块链和比特币混合起来讲, 看了还是很糊涂. 下面我先抛开比特币, 单独说说区块链. 最后在结合比特币说说比特币是如何应用区块链技术的.
区块链是一种数据库技术
首先区块链是一种分布式数据库!! 这种数据库将数据存储在任意多台机器上, 并且能够保证所有机器上存储的数据是一致的. 由于互联网上有无数多台机器, 所以区块链形成的数据库永远都存在备份. 那么问题来了, 如何保证无数多台机器之间的数据一致性? 数据量太大怎么办? 冗余太多怎么办?
- 数据冗余问题
区块链技术不是为了减少数据冗余, 不是为了提高查询速度. 它的特点是去中心化, 公开透明. - 数据量太大的问题
区块量系统将数据存储在无数多台机器上, 每台机器上存储的数据是一致的, 这样数据会越来越多, 但是根据信息技术的摩尔定律:每18个月左右, 同样价钱能够买到的存储能力提升一倍, 这样来看区块链系统中的数据是永远够存的. 不需要考虑数据太多没法存储的问题. - 不同机器之间数据一致性的问题
这个问题要分两部分解决, 1机器(或者叫结点)的数量是有限的情况下, 2机器(结点)数量是无限的情况下.
3.1 结点数量有限的环境下的共识算法: 拜占庭共识算法pbft(之后再详细介绍)
3.2 结点数量无限的环境下: 比特币的工作量证明机制.(在工作量证明机制下选择累计工作量最大的区块链)
简单总结下:
- 区块链是一种数据库
- 区块链的数据存储在很多很多的机器上(任意一台机器出问题不会对整个系统产生影响)
- 不同机器之间需要想办法保证数据一致
理解"区块链"一词
上面介绍的这种分布式数据库为什么要叫"区块链"??
区块链需要分成两部分"区块"和"链"
结合数据结构中的链表的概念理解区块链
#define struct ListNode{
int var;
ListNode *next;
}Node;
上面是一个链表的定义, 链表每个结点分两部分, 1数据存储部分. 2下一个结点的指针
通过不断访问next即可遍历链表. 链表就是很多个Node 通过next指针连接起来.
区块链就是很多个区块通过hash值连接起来
一个区块大致上可以理解为这样的结构
#define struct Block{
char *myHash;//本区块的hash值
int var;//表示数据, 可以理解为任意数据
char *previousHash;//上一个区块的hash值
}Block;
可以这样想象一下, 拿到一些数据, 通过这些数据计算出myHash2, 数据加上自己的hash值成为一个区块(newBlock), 查询当前区块链中最后一个区块的myHash1, 将newBlock的previousHash赋值为myHash1, 这样不同的区块(block)之间以hash值相连接成为一个链条--区块链.
从最后一个区块开始不断访问previousHash即可遍历整个区块链.
小结:
- 区块链是一种逻辑结构
- 链表是不同结点使用内存地址来连接, 区块链是不同区块之间使用hash值来连接.
从"账本"的角度理解区块链
区块链是一个分布式账本, 区块链中的数据只能添加, 不能修改和删除. 例如a获得10元
a支出10元. 这样通过遍历a的所有记账记录可以得到a的账户余额.
多个结点如何共同完成记账操作?
参与区块链的各个结点需要选出一个记账结点, 此时被选出的主结点负责记账, 并且把记账数据发送给区块链中的其他结点. 当主结点出了问题, 剩下的结点可以自动选举出新的主结点负责记账.
小结:
- 区块链中的数据只能添加, 不能修改和删除
- 多个结点参与记账, 能够自动选出主结点. 其他结点依据主节点进行数据同步.
- 主节点可以自动更换.
从技术角度理解区块链
区块链技术是以下技术的组合
- 点对点网络(p2p技术)
- 加密技术(如RSA)
- 共识算法(如pbft, 工作量证明机制)
- 数据存储技术(数据库)
点对点网络
即p2p技术, 简单地说就是一个结点既是客户端也是服务端, 结点(机器)可以访问其他结点, 也可以应答其他结点的请求.
类似p2p下载, p2p下载器可以访问到当前p2p网络中的其他结点, 从其他结点下载数据, 同时p2p下载器也将你拥有的资源提供给别人下载.
p2p技术提供了结点发现功能, 即p2p网络中的结点可以自动发现新结点.
p2p网络内可以广播消息
加密技术
RSA公钥加密, 私钥解密.
hash算法 hash256, md5等等
保证数据传输安全, 防止数据被篡改.
数据存储技术
mysql, sqlite, leveldb
一个单独区块中的数据可以是任意类型. 例如账本, 就是一条条的记账数据, 可以理解成数据库中一个表的n条记录.
共识算法
共识算法保证多个结点之间的数据一致性. (一个新区块的添加, 需要多个结点之间讨论达成共识)
结点有限的环境下的一种共识算法pbft
pbft拜占庭容错算法, 具体的算法可以单独写一篇上万字的文章了...
此处只写一些pbft算法的特点.
上图是pbft算法的执行流程,
由图可知, 当结点数量增大时, 共识算法的效率会降低. 所以pbft算法只能应用在结点数量有限的区块链系统中.
小结:
- 结点之间利用p2p网络同步信息.
- 新区块在被添加到区块链中之前需要经过共识算法讨论.
- 共识算法保证了多个结点之间数据一致.
- pbft算法的效率随着结点数量的增加而降低.
区块链系统的一次执行流程(结点数量有限的环境下)
- 选举中心结点(记账结点)
- 记账结点接受记账数据, 例如100条数据形成一个区块
- 记账结点将新区块广播到p2p网络中
- p2p网络中的所有结点开始共识算法
- 所有结点达成共识
- p2p网络中的各个结点根据共识情况将新区块加入到自己的区块链中
总结
区块链技术就是多台机器共同保存一份数据. 共识算法保证了多台机器之间的数据一致性, 分布式存储和加密技术保证了数据不会被篡改, 一些结点失效不会影响整个系统的运行. 点对点网络保证了任何机器可以随时加入和退出区块链系统.
实现了全网共同维护一份可增加不可被修改的数据.
比特币是如何应用区块链技术的
比特币有矿工的概念, 矿工就是区块链系统中的结点.
比特币设计了独特的共识算法, 主要是选举记账结点这一部分. 比特币的记账结点每10分钟更换一次, 通过hash碰撞来选举记账结点. 流程大致是这样的.
- 记账结点提出数学问题, (就是一个哈希值)
- 各个矿工开始哈希运算, 第一个通过hash运算得到上一个结点提出的hash值的结点成为新的记账结点, 成为新记账结点的同时生成新的区块, 并且此矿工得到比特币奖励.
- 记账结点将包含自己比特币奖励信息的区块广播到全网, 全网矿工记录此新区块.