区块链入门

区块链(blockchain)是眼下的大热门,新闻媒体大量报道,宣称它将创造未来。

作者在阅读了部分论文,博客以及官方文档之后结合自己的理解整合了这些资料的内容,并对这些内容进行了重新组织。

区块链的本质

从本质上讲,区块链是一种特殊的分布式数据库。首先他可以存储信息,任何需要保存的信息都可以在区块链中进行读写。

但是与普通的数据库不同,任何人都可以假设服务器加入区块链的网络,成为一个节点,每个节点都是平等的,也不存在类似于数据库管理员一样的角色。如果有人想对区块链添加审核,也实现不了,因为它的设计目标就是防止出现居于中心地位的管理当局。

正是因为无法管理,区块链才能做到无法被控制。否则一旦大公司大集团控制了管理权,他们就会控制整个平台,其他使用者就都必须听命于他们了。

向任意一个节点进行读写数据,所有的节点都会同步,保证区块链的一致性,这也是区块链去中心化之后能够保证其数据可靠性的原因。

区块链中的一些概念

区块链的基本原理理解起来并不复杂。首先来看三个基本概念:

  • 交易(Transaction):一次对账本的操作,导致账本状态的一次改变,如添加一条转账记录;
  • 区块(Block):记录一段时间内发生的所有交易和状态结果等,是对当前账本状态的一次共识;
  • 链(Chain):由区块按照发生顺序串联而成,是整个账本状态变化的日志记录。

区块

区块链由一个个的区块(block)组成。可以把这些区块类比成数据库的记录,每一次对数据的修改,都会创建一个新的区块,因为区块链的设计是增量式的,所以无论是对现有区块中的数据做任何CRUD操作,都是在现有链的基础上增加新的区块。

每个区块分为两个部分:

  • 区块头:记录当前区块的特征值
  • 区块体:记录当前区块的实际数据

区块头又包含了当前区块的多项特征值:

  • 当前区块的生成时间
  • 区块体的哈希
  • 上一个区块的哈希

哈希其实就是计算机可以对任意内容计算出一个长度相同的特征值,区块链的哈希长度是256位,也就是说,不管什么内容最终计算出来的特征值都是256位,而且可以保证只要原始内容不同,计算出来的哈希值一定不同。

这样就可以保证:

  • 每个区块的哈希值一定是不同的,可以通过哈希标识区块
  • 如果区块的内容改变了,他的哈希值一定会改变

区块的哈希值都是根据区块头进行计算的,也就是说是把区块头的所有值拼接成一个字符串后对该字符串进行哈希的结果。

结合前面所说,区块头包含了很多内容,其中就有当前区块体的内容以及上个区块的哈希,也就是当前区块体的内容改变了或者上一个区块的内容改变了,就一定会引起当前区块哈希的改变。

这一点对区块链有重大意义。如果有人修改了一个区块,该区块的哈希就变了。为了让后面的区块还能连到它(因为下一个区块包含上一个区块的哈希),该人必须依次修改后面所有的区块,否则被改掉的区块就脱离区块链了。由于后面要提到的原因,哈希的计算很耗时,短时间内修改多个区块几乎不可能发生,除非有人掌握了全网51%以上的计算能力。

节点

节点指的是区块链网络中的计算机,包含手机,矿机和服务器等等。操作一个节点的可以是普通的钱包用户,矿工和多个人协作。例如比特币是属于公有链,当我们用自己已连接到互联网的电脑运行程序时,该电脑就是比特币网络中的一个节点。对于像比特币这样的公有链,理论上来讲,你下载完整的区块链,参与交易和挖矿,才算是节点。

节点,保存着自己的一份或者部分账本,通过算力或者份额投票的方式来解决拜占庭将军问题,通过无信任的方式确保全体节点遵循的账本和自己的账本是一致的。

采矿

由于必须保证节点之间的同步,所以新区块的添加速度不能太快。试想一下,你刚刚同步了一个区块,准备基于它生成下一个区块,但这时别的节点又有新区块生成,你不得不放弃做了一半的计算,再次去同步。因为每个区块的后面,只能跟着一个区块,你永远只能在最新区块的后面,生成下一个区块。所以,你别无选择,一听到信号,就必须立刻同步。

所以,区块链的发明者中本聪故意让添加新区块,变得很困难。他的设计是,平均每10分钟,全网才能生成一个新区块,一小时也就六个。

这种产出速度不是通过命令达成的,而是故意设置了海量的计算。也就是说,只有通过极其大量的计算,才能得到当前区块的有效哈希,从而把新区块添加到区块链。由于计算量太大,所以快不起来。

区块链的原理

如果把区块链系统作为一个状态机,则每次交易意味着一次状态改变;生成的区块,就是参与者对其中交易导致状态改变结果的共识。

区块链的目标是实现一个分布的数据记录账本,这个账本只允许添加、不允许删除。账本底层的基本结构是一个线性的链表。链表由一个个“区块”串联组成(如下图所示),后继区块中记录前导区块的哈希(Hash)值。某个区块(以及块里的交易)是否合法,可通过计算哈希值的方式进行快速检验。网络中节点可以提议添加一个新的区块,但必须经过共识机制来对区块达成确认。

通过比特币来了解区块链的工作过程

具体以比特币网络为例,来看其中如何使用了区块链技术。

首先,用户通过比特币客户端发起一项交易,消息广播到比特币网络中等待确认。网络中的节点会将收到的等待确认的交易请求打包在一起,添加上前一个区块头部的哈希值等信息,组成一个区块结构。然后,试图找到一个 nonce 串(随机串)放到区块里,使得区块结构的哈希结果满足一定条件(比如小于某个值)。这个计算 nonce 串的过程,即俗称的“挖矿”。nonce 串的查找需要花费一定的计算力。

一旦节点找到了满足条件的 nonce 串,这个区块在格式上就“合法”了,成为候选区块。节点将其在网络中广播出去。其它节点收到候选区块后进行验证,发现确实合法,就承认这个区块是一个新的合法区块,并添加到自己维护的本地区块链结构上。当大部分节点都接受了该区块后,意味着区块被网络接受,区块中所包括的交易也就得到确认。

这里比较关键的步骤有两个,一个是完成对一批交易的共识(创建合法区块结构);一个是新的区块添加到链结构上,被网络认可,确保未来无法被篡改。当然,在实现上还会有很多额外的细节。

比特币的这种基于算力(寻找 nonce 串)的共识机制被称为工作量证明(Proof of Work,PoW)。这是因为要让哈希结果满足一定条件,并无已知的快速启发式算法,只能对 nonce 值进行逐个尝试的蛮力计算。尝试的次数越多(工作量越大),算出来的概率越大。

通过调节对哈希结果的限制条件,比特币网络控制平均约 10 分钟产生一个合法区块。算出区块的节点将得到区块中所有交易的管理费和协议固定发放的奖励费(目前是 12.5 比特币,每四年减半)。

理解

根据作者现在的理解,所谓的挖矿并不是去抢夺比特币,而是去抢夺比特币这个账本的记账权,如果把比特币整个网络比作一个账本,区块链上的每个区块都是账本中的一页,但是并不是所有的账页都会被这个账本所接受,只有符合其规则的账页才能正确插入到账本中,所谓矿机就是寻找这种符合规则的账页。

只不过目前比特币的激励机制就是每当你成功创建一个新的账页,你可以直接在其中写入向自己的账户转入一定数额的比特币,并结合你目前记录的所有未被记入区块链并且被承认有效的交易记录一起记入到这个区块体中,只要这个账页被成功插入并被大多数节点所接受并作为主分支,那么这些交易记录就是有效的。

但是比特币数量又是有限的,当某一天比特币发完之后,矿机的收入来源就是那些记录在自己这一页上的交易记录的抽成。

区块链的三种场景

引入智能合约后的区块链,已经超越了单纯的数据记录功能,实际上带有点“智能计算”的意味了;更进一步地,还可以为区块链加入权限管理、高级编程语言支持等,实现更强大的、支持更多商用场景的分布式账本系统。

场景功能智能合约一致性权限类型性能编程语言代表
数字货币记账功能不带有或较弱PoW公有链较低简单脚本比特币网络
分布式应用引擎智能合约图灵完备PoW、PoS公有链受限特定语言以太坊网络
带权限的分布式账本商业处理多种语言,图灵完备包括 CFT、BFT 在内的多种机制,可插拔支持联盟链可扩展高级编程语言超级账本

根据参与者的不同,可以分为公有(Public 或 Permissionless)链、联盟(Consortium 或 Permissioned)链和私有(Private)链。

公有链,顾名思义,任何人都可以参与使用和维护,参与者多为匿名。典型的如比特币和以太坊区块链,信息是完全公开的。

如果进一步引入许可机制,可以实现私有链和联盟链两种类型。

私有链,由集中管理者进行管理限制,只有内部少数人可以使用,信息不公开。一般认为跟传统中心化记账系统的差异不明显。

联盟链则介于两者之间,由若干组织一起合作(如供应链机构或银行联盟等)维护一条区块链,该区块链的使用必须是带有权限的限制访问,相关信息会得到保护,典型如超级账本项目。在架构上,现有大部分区块链在实现都至少包括了网络层、共识层、智能合约和应用层等分层结构,联盟链实现往还会引入额外的权限管理机制。

Hyperledger Fabric

Hyperledger Fabric 是由 IBM 公司主导开发的一个面向企业级客户的开源项目。与比特币和以太坊这类公有链不同,Hyperledger Fabric 网络中的节点必须经过授权认证后才能加入,从而避免了 POW 资源开销,大幅提高了交易处理效率,满足企业级应用对处理性能的诉求。同时,为了满足灵活多变的应用场景,Hyperledger Fabric 采用了高度模块化的系统设计理念,将权限认证模块(MSP)、共识服务模块(Ordering Service)、背书模块(Endorsing peers)、区块提交模块(committing peers)等进行分离部署,使开发者可以根据具体的业务场景替换模块,实现了模块的插件式管理(plug-in/plug-out)。所以,Hyperledger Fabric 是一个私有链/联盟链的开发框架,而且系统的运行不需要 token 支持。

基础概念

Channel:

是一种数据隔离机制,保证交易信息只有交易参与方可见,每个 channel 是一个独立的区块链,这使得多个用户可以共用同一个区块链系统而不用担心信息泄露问题。Channels 能够让上层不同的用户业务共享同一个区块链系统资源,主要包括网络、计算、存储资源。从本质上来说,channels 是通过不同的区块链账本来为上层业务服务,而且,这些区块链统一部署在 peers 节点上,统一通过 ordering service 进行交易排序和打包区块。Channels 之间通过权限隔离控制,不同 channel 内的成员,无法访问对方的交易信息,只能访问所属 channel 的交易信息。

Chaincode:

也叫智能合约,将资产定义和资产处理逻辑封装成接口,当其被用户调用的时候,改变账本的状态。

Ledger:

区块链账本,保存交易信息和智能合约代码。

Network:

交易处理节点之间的 P2P 网络,用于维持区块链账本的一致性。

Ordering service:

利用 kafka、SBTF 等共识算法对所有交易信息进行排序并打包成区块,发给 committing peers 节点,写入区块链中。

World state:

显示当前资产数据的状态,底层通过 LevelDB 和 CouchDB 数据库将区块链中的资产信息组织起来,提供高效的数据访问接口。

Membership service provider (MSP):

管理认证信息,为 client 和 peers 提供授权服务。

角色

在 Hyperledger 中,由三种类型的角色:

Client:

应用客户端,用于将终端用户的交易请求发送到区块链网络;

Peers:

负责维护区块链账本,分为 endoring peers 和 committing peers,其中,endorser 为交易做背书(验证交易并对交易签名),committer 接收打包好的区块,然后写入区块链中。Peers 节点是一个逻辑的概念,endorser 和 committer 可以同时部署在一台物理机上。

Ordering Service:

接收交易信息,并将其排序后打包成区块,放入区块链,最后将结果返回给 committer peers。

交易流程

区块链的账本由 peer 节点维护,并不是由 ordering service 集群维护,所以,只有 peer 节点上可以找到完整的区块链信息,而 order service 集群只负责对交易进行排序,只保留处理过程中的一部分区块链信息。Hyperledger Fabric 系统中的节点是一个逻辑的概念,并不一定是一个台物理设备,但是对于生产环境的设计者来说,peer 节点不能和 order 节点部署在一台机器上,而 enduring peers 和 committing peers 可以部署在同一台机器上,这种设计主要是为了系统架构的解耦,提高扩展性,以及通过主机隔离提高安全性。 Endorsing peer 校验客户端的签名,然后执行智能合约代码模拟交易。交易处理完成后,对交易信息签名,返回给客户端。客户端收到签名后的交易信息后,发给 order 节点排序。Order 节点将交易信息排序打包成区块后,广播发给 committing peers,写入区块链中。(具体交易流程可以参考:https://www.chainnews.com/articles/074736012702.htm)

参考文章:

https://mp.weixin.qq.com/s/8W_oegxPCMr9zTtpN1h6dA

http://www.ruanyifeng.com/blog/2017/12/blockchain-tutorial.html

https://yeasy.gitbooks.io/blockchain_guide/content/02_overview/definition.html

https://www.chainnews.com/articles/074736012702.htm