一、区块链的基本原理
区块链包括三个基本概念:
1、交易(transaction):一次对账本的操作,导致账本状态的一次改变,如添加一次转账记录;
2、区块(block):记录一段时间内发生的所有交易和状态的结果,是对当前账本状态的一次共识;
3、链(chain):由区块按照发生顺序串联而成,是整个账本状态变化的日志记录。二、Ledger-账本
账本是fabric中所有状态转换的记录,具有有序和防篡改的特点。
账本是由一条区块链构成的,并将不可变的、有序的记录存放在区块中;同时包含一个状态数据库来记录当前的fabric状态。每个通道中都各有一个账本。各个节点对于它所属的每个通道,都会保存一份该通道的账本副本。三、Chain-链
链是一个交易日志,它由哈希值链接的区块构造而成,每个区块中包含N个有序的交易。块头中包含了本区块所记录交易的哈希值,以及上一个区块头的哈希值。通过这种方式,账本中的所有交易都被有序的、加密的形式串联在一起。换言之,如果不破坏哈希链的话,是无法篡改账本数据的。链被存放于节点的文件系统中(本地或者挂载),有效地支持着区块链工作量只能追加的特性。
四、State Database-状态数据库
账本的当前状态信息呈现,是链交易日志中记录过的所有键的最新值。由于当前状态表示的是通道已知的所有键的最新值,由此也常被称作世界状态。链码调用基于当前的状态数据执行交易。为了使链码调用高效运行,所有键的最新值被存储在状态数据库中。状态数据库是链的交易日志的索引视图,因此它可以随时从链中重新导出。节点启动的时候,在接受交易之前,状态数据库将被自动恢复(或者根据需要产生)。
五、Transaction Flow - 交易流程
{
概括而言,交易流程由应用客户端发送给背书节点交易提案组成。背书节点验证客户端的签名,然后执行链码来模拟交易。产生的输出就是链码结果,一组链码读取的键值版本(读集合),和一组被写入的链码的键值集合(写集合)。交易提案的响应被发送回客户端,同时包含了背书签名。客户端汇总所有的背书到一个交易有效载荷中,并将它广播到排序服务。排序服务将排好序的交易放入区块并发送到通道内的所有节点。
在提交之前,节点们会验证交易。首先它们会检查背书策略来保证足够的指定节点正确地对结果进行了签名,并且会认证交易有效载荷中的签名。
其次,节点们会对交易的读集合进行版本检查,从而保证数据的一致性并防范一些攻击,比如双花(双重支付,一笔钱花了两次)。
}六、State Database options-状态数据库选项
状态数据库选项包括LevelDB和CouchDB(beta)。LevelDB是节点流程中集成的缺省键值状态数据库。CouchDB是可选的外部状态数据库。类似于LevelDB的键值库,CouchDB能存储任何链码中建模的二进制数据(CouchDB附件功能被内部用于非JSON格式的二进制数据)。但作为一个JSON格式文档库,当链码的数据(比如资产)以JSON格式建模时,CouchDB额外提供了许多针对链码数据的查询方式。CouchDB作为独立的数据库进程跟节点一起运行,所以安装、管理和操作的时候需要一些额外的考虑。你可以尝试开始的时候用缺省集成的LevelDB,然后当你需要额外的复杂查询时再切换到CouchDB。将链码的资产数据以JSON格式建模是一个非常好的实践,这样有利于你将来进行复杂多样的查询
区块链要点介绍:
分布式账本
分布式账本是区块链网络的核心,在这个账本中记录了网络中所有发生交易的信息(信息只能以附加的形式记录在区块链中,同时使用加密技术保障了交易一旦添加进账本中,就无法篡改)。在区块链网络中每一个参与者都保有一份账本的副本。
智能合约
用来实现对账本的访问和控制。例如:双方可以定义一个智能合约,以保证卖方发货的商品运送到达时,买方支付的货款会自动转账给卖方。
共识
保持网络中所有交易的流程同步。共识保证了账本只会在交易双方都确认后才进行更新。
同时在账本更新时,交易双方能够在账本中的相同位置,更新一个相同的交易信息。
简易概括:区块链是一个共享的,通过智能合约更新的多副本交易系统,同时这个系统通过共识协作机制保证了网络中所有账本副本的同步(不同于目前的系统参与者使用私有的程序对私有的账本进行更新,而区块链系统使用共享的程序对共享的账本进行更新)。
用途:账本共享。
意义:通过使用共享账本协调整个商业网络,区块链网络能够减少时间、成本以及隐私信息泄露的风险,并且能够使流程更加可信和透明。
Hyperledger Fabric
Hyperledger Fabric与其他区块链网络最大的不同体现在私有和许可。(需要通过工作量证明协议来保证交易有效并维护网络的安全),haperledger fabric通过MSP来登记所有的成员(MSP:成员服务提供者,是一个提供抽象化成员操作框架的组件)。
共享账本
fabric包含一个子系统,这个系统包含两个组件:世界状态(world state)和交易记录。
世界状态描述了账本在特定时间点的状态,它是账本的数据库。交易记录组件记录了产生世界状态当前值的所有交易。所以账本就是世界状态数据库和交易历史记录的集合。
智能合约
fabric的智能合约称为chaincode,当一个区块链外部的应用程序需要访问账本时,就会调用chaincode。chaincode目前支持的语言是go。
共识
制定在网络中让不同的参与者写入的交易必须按照产生顺序依次写入账本。fabric的共识机制包含SOLO,Kafka以及PBFT (可以为文件副本提供一种机制来相互通信,即使是在发生腐败的情况下,也可以保证每个副本保持一致)。
系统架构
区块链是一个分布式系统,由许多相互通信的节点组成。区块链运行的程序成为链码,保存状态和账本数据、执行交易。链码是账本的核心要素,交易操作就是调用链码。交易必须被“背书”,只有经过背书的交易才可以交易,并对状态产生影响。有可能存在一个或多个特定的链码用于管理功能和参数,统称为系统链码。
交易
交易可以有两种类型:
调用交易:是在之前已经部署的链码上执行一个操作。调用交易引用链码的一个函数。
部署交易:创建新的链码并设置一个程序作为参数。当一个部署交易执行成功,表明链码已经被安装到区块链上。
综上所述,部署交易是调用交易的特例,部署交易创建新的链码,对应于系统链码的一个调用交易。
区块链数据结构
数据存储模型:K/V
state由peer节点保持,而不是ordering peer和client。
账本(Ledger)
账本保存在所有peer节点,可选地保存在排序者的一个子集。账本是由排序服务构建的一个全部有序的交易哈希链块。哈希链块强制将全部排序块置入账本,并覆盖所有交易。
节点(Nodes)
Node节点是区块链的通信实体。有三种类型的node节点:
- 客户端或者提交客户端:客户端提交实际交易调用到背书者,广播交易请求到排序服务节点。(客户端代表最终的用户实体。它必须连接到一个peer节点与区块链交互。客户端可以选择连接任何peer节点创建并调用交易)
- Peer节点:提交交易、维持状态和账本的拷贝。(以块的形式从排序服务接收有序状态更新,维护状态和账本。并能附加一个特殊的背书节点或背书者。背书节点的特殊功能是链码在提交之前背书一个交易。)。
- 排序服务节点或排序者(Orderer):运行通信服务实现交付保证,像原子或全序广播。(排序者产生排序服务,即,一个提供交付保证的通信架构。排序服务为客户端和peer节点提供共享的通信通道,为包含交易的消息提供广播服务。客户端连接到通道可以在通道上广播消息,通道随后传递消息给所有peer节点。通道支持所有的消息原子传递,意思是全部的排序交付通信具有可靠保证性。这个原子通信保证也成为分布式系统中的共识)
排序服务API
peer节点通过排序服务提供的接口连接到排序服务提供的通道。排序服务包含两个基本操作:
待办(TODO):新增的客户端/peer节点序列号。
账本和块构成:账本包含所有数据,通过一致性hash计算形成的一个哈希链。
排序服务的特性
- 安全性(一致性保证):只要peer节点连接到通道足够长的时间,就会看到交付消息的同等序列号。
- 活跃度(交付保证):原则上如果提交客户端没有失败,排序服务应该保证每个连接到排序服务的正确peer节点终究交付每个提交交易。
交易背书的基本工作流程
- 客户端创建交易并发送给选择的背书peer节点(调用交易);
- 背书peer节点模拟交易和产生背书签名
- 提交客户端收集背书交易并通过排序服务广播
- 排序服务向peer节点提交交易
背书策略
是背书一个交易的条件。区块链peer节点有一组预先确定的背书策略,它被安装在特定链码的部署中被交易引用。
交易只有经过背书策略的背书才会宣布有效。对于链码的调用交易首先需要得到一个满足链码策略的背书。
证实账本和节点账本检查
验证账本
维护一个账本的抽象,只包含有效的提交交易,这是一个哈希链,来自过滤掉无效交易的账本(交易的背书无效或版本依赖无效)。