这篇文章介绍了Hyperledger区块链技能的原理、构架和协议。

1.1 Fabric介绍
Fabric是数字事情(买卖)的账簿,这个账簿由多个参与者同享,每个参与者都在体系中具有权益。账簿只要在所有参与者达到一致的情况下才能够更新,而且信息一旦记载就永久不能修正。每个记载的事情都能够依据参与者的一致证明运用密码学进行验证。
买卖是安全、私有和保密的。每个参与者运用身份证明向网络成员服务(membership service)注册以获取体系的访问权限。参与者运用不可追踪的导出证书生成买卖,能够在网络中完全匿名。买卖的内容运用由密钥导出的复杂函数进行加密,保证只要指定的参与者才能够看到内容,以维护商业买卖的机密性。
账簿的悉数或许部分能够审计以满意监管要求。在参与者协作的情况下,审计人员能够获取有限时刻的证书来查看账簿和买卖详情,从而对运营情况进行准确的评价。
Fabric是区块链技能的完成,比特币能够作为一种简略的运用在Fabric基础上构建。Fabric采用了模块化的构架,答应不同的组件在完成协议的基础上即插即用。能够运用强壮的容器技能来运行干流编程言语以进行智能合约的开发。运用熟悉的和已验证的技能是fabric构架的主旨。
1.2 运用Fabic的原因
前期的区块链技能能够完成一些功用,可是缺少对特定行业需求的完整支撑。为了满意现代商场的要求,fabric面向行业需求进行规划以习惯多种行业特定的运用场景,而且在比如伸缩性规划等方面比这个领域的前驱更进一步。Fabric运用了新的办法完成了授权网络、在多个区块链网络上的私有性和保密性。
2.1 Fabric构架
Fabric的构架由成员服务(Membership)、区块链服务(Blockchain)和链码服务(Chaincode)三个首要类别构成。这些类别仅仅是Fabric的逻辑结构,并不是在物理上将组件划分红不同的进程、地址空间或许虚拟机。
2.1.1 成员服务
成员服务负责办理用户标识、隐私、以及网络的保密性和可审计性。在无权限的区块链中,参与者不需求授权,而且所有节点能够平等地提交买卖或许将买卖累积成区块,也就是说没有角色的区别。成员服务将公钥基础设施(PKI)和去中心化一致机制的根本元素进行整合,从而将无权限区块链转化为有权限区块链。在有权限区块链中,参与者需求注册以获取长时间身份凭证(挂号证书),而且能够依据身份类型进行区别。在用户的情况下,买卖证书办理者(TCA)能够发行化名凭证。这种凭证(即买卖证书)被用来进行授权提交的买卖。买卖证书在区块链上保存,而且答应授权的审计者对买卖进行归类,不然这些买卖将无法关联。
2.1.2 区块链服务
区块链服务经过运用依据HTTP2的P2P协议办理分布式账簿。区块链上的数据结构经过了高度优化以提供最有用的Hash算法来保存国际状况(world state)的副本。在布置中能够运用和配置不同的一致算法,包括PBFT, Raft, PoW, PoS等。
2.1.3 链码服务
链码服务为链码(chaincode)在验证节点上履行提供了一个安全和轻量级的沙盒。沙盒环境是一个确定和安全容器,带有一组经过签名的基础磁盘映像,包括了安全操作体系和支撑Go、Java和Node.js的链码言语、运行时和SDK,其他言语能够依据需求被启用。
2.1.4 事情
验证节点和链码能够在区块链网络上发送事情,运用程序能够监听这些事情并作出呼应。现已存在一组预先界说好的事情,而且链码也能够生成自界说的事情。事情能够被一个或许多个事情适配器处理,适配器能够运用Web Hook或许Kafka进一步将事情进行传递。
2.1.5 运用程序接口(API)
Fabric的首要编程接口是REST API,以及依据Swagger2.0的变体。这些API能够让运用程序注册用户、查询区块链、以及发送买卖。有一组API专门规划给链码用来与底层渠道交互以履行买卖和查询买卖结果。
2.1.6 命令行接口(CLI)
CLI包括REST API的一组子集来帮助开发者快速测试链码和查询买卖状况。CLI由Go言语完成,而且支撑多种操作体系。
2.2 拓扑结构
Fabric的布置能够包括成员服务、多个验证节点(peer)和非验证节点、以及一个或许多个运用。所有这些组件构成了一个区块链。能够存在多个区块链,每个区块链都能够有自己的运行参数和安全需求。
2.2.1 单个验证节点
从功用上将,非验证节点是验证节点的子集,也就是说每个非验证节点上的功用也能够在验证节点上完成,因而最简略的区块链网络能够仅有一个验证节点构成。这种配置最适协作为开发环境,单个验证节点能够在“修改-编译-调试”周期中快速发动。
单个验证节点不需求一致机制,因而默认的一致机制插件为noops,在这种情况下买卖是当即履行的,这样开发者能够在开发过程中的到当即反应。
2.2.2 多个验证节点
用于出产环境或许测试环境的区块链网络一般由多个验证节点和非验证节点构成。非验证节点能够承担一部分从验证节点剥离的工作量,比如处理API请求和处理事情。
所有验证节点构成了一个全衔接的网络,即每个验证节点都与其他的验证节点衔接。非验证节点衔接到附近的答应衔接的验证节点。非验证节点是可选的,因为运用程序能够直接与验证节点进行通讯。
2.2.3 多链
每个由验证节点和非验证节点组成的网络构成了一个区块链。多个区块链能够被创立用来满意不同的需求,好比多个Web网站能够满意不同的意图。
Fabric的点对点通讯是依据gRPC构建的,完成了依据流的双向音讯通讯。gRPC运用了谷歌公司的Protocol Buffers对数据结构进行串行化来完成节点之间的数据传输。Protocol buffers是一种言语中立、渠道中立、而且可扩展的数据结构串行化技能。数据结构、音讯和服务都是用proto3言语描绘。
3.1 音讯
节点之间传输的音讯是由Message这个proto结构封装的,有四种不同的类型:发现(Discovery)、买卖(Transaction)、同步(Synchronization)和一致(Consensus)。每种类型都能够在其内嵌的payload字段中界说更多的子类型。
message Message https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpg
enum Type https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpg
UNDEFINED = 0;
DISC_HELLO = 1;
DISC_DISCONNECT = 2;
DISC_GET_PEERS = 3;
DISC_PEERS = 4;
DISC_NEWMSG = 5;
CHAIN_STATUS = 6;
CHAIN_TRANSACTION = 7;
CHAIN_GET_TRANSACTIONS = 8;
CHAIN_QUERY = 9;
SYNC_GET_BLOCKS = 11;
SYNC_BLOCKS = 12;
SYNC_BLOCK_ADDED = 13;
SYNC_STATE_GET_SNAPSHOT = 14;
SYNC_STATE_SNAPSHOT = 15;
SYNC_STATE_GET_DELTAS = 16;
SYNC_STATE_DELTAS = 17;
RESPONSE = 20;
CONSENSUS = 21;
}
Type type = 1;
bytes payload = 2;
google.protobuf.Timestamp timestamp = 3;
}
payload字段是一个包括其他目标(Transaction或许Response)的不透明字节数组,例如,当type是CHAIN_TRANSACTION时,payload是Transaction目标。
3.1.1 发现音讯
在节点发动之后,如果CORE_PEER_DISCOVERY_ROOTNODE字段存在则运行发现协议。CORE_PEER_DISCOVERY_ROOTNODE是别的一个网路上节点(恣意节点)的IP地址,这个节点能够作为发现网络上其他所有节点的起点。协议序列从DISC_HELLO开端,其payload为HelloMessage目标:
message HelloMessage https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpg
PeerEndpoint peerEndpoint = 1;
uint64 blockNumber = 2;
}
message PeerEndpoint https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpg
PeerID ID = 1;
string address = 2;
enum Type https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpg
UNDEFINED = 0;
VALIDATOR = 1;
NON_VALIDATOR = 2;
}
Type type = 3;
bytes pkiID = 4;
}
message PeerID https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpg
string name = 1;
}
  • PeerId是节点发动的时候被赋予的名字,也能够在配置文件中界说。
  • PeerEndpoint用来描绘验证节点或许非验证节点
  • pkiID是节点的密码学ID
  • address是节点的IP地址和端口(ip:port)
  • blockNumber是节点上区块链的当时高度
如果经过DISC_HELLO获取的区块高度超过了当时节点的区块链高度,则节点当即发动同步协议将节点状况更新到网络当时最新状况。
DISC_HELLO之后,节点周期性地发送DISC_GET_PEERS以发现新加入到网络的其他节点。作为对DISC_GET_PEERS音讯的呼应,收到音讯的节点发送'DISC_PEERS'音讯,该音讯中的payload字段包括了一组PeerEndpoint。其他发现音讯目前未运用。
3.1.2 买卖音讯
存在3种买卖类型:布置(Deploy)、调用(Invoke)和查询(Query)。布置买卖将指定的链码装置到区块链网络,而调用和查询买卖则是调用现已布置到区块链上的链码函数。还有一种创立型(Create)买卖用于将现已布置到区块链上的链码实例化并载入内存,但目前该买卖类型未完成。
3.1.2.1 买卖数据结构
message Transaction https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpg
enum Type https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpg
UNDEFINED = 0;
CHAINCODE_DEPLOY = 1;
CHAINCODE_INVOKE = 2;
CHAINCODE_QUERY = 3;
CHAINCODE_TERMINATE = 4;
}
Type type = 1;
string uuid = 5;
bytes chaincodeID = 2;
bytes payloadHash = 3;
ConfidentialityLevel confidentialityLevel = 7;
bytes nonce = 8;
bytes cert = 9;
bytes signature = 10;
bytes metadata = 4;
google.protobuf.Timestamp timestamp = 6;
}
message TransactionPayload https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpg
bytes payload = 1;
}
enum ConfidentialityLevel https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpg
PUBLIC = 0;
CONFIDENTIAL = 1;
}
3.1.3 同步音讯
当节点经过发现协议发现自己比区块链网络落后或许不一致,则立刻敞开同步协议。节点播送SYNC_GET_BLOCKS、SYNC_STATE_GET_SNAPSHOT或许SYNC_STATE_GET_DELTAS,相应地接纳SYNC_BLOCKS、SYNC_STATE_SNAPSHOT或许SYNC_STATE_DELTAS。
已装置的一致机制插件决定同步协议怎么履行,每种音讯针对不同的情况:
SYNC_GET_BLOCKS在音讯的payload字段中请求一组接连规模的区块,这种规模运用SyncBlockRange表明:
message SyncBlockRange https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpg
uint64 start = 1;
uint64 end = 2;
}
接纳到SYNC_GET_BLOCKS的节点呼应SYNC_BLOCKS音讯,在其payload字段中包括了SyncBlocks:
message SyncBlocks https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpg
SyncBlockRange range = 1;
repeated Block blocks = 2;
}
3.1.4 一致音讯
一致机制用于处理买卖,因而CONSENSUS音讯由内部的一致框架在接纳到CHAIN_TRANSACTION音讯后发送。一致框架将CHAIN_TRANSACTION转化为CONSENSUS,然后向所有验证节点进行播送。一致插件接纳到音讯后,依据自身算法对音讯进行处理。
3.2 账簿
账簿(ledger)由区块链(blockchain)和国际状况(world state)这两个部分组成。区块链是一组链接起来的区块,用来在账簿中记载买卖。国际状况是键值数据库,在链码履行过程中用来存储状况。
3.2.1 区块链
3.2.1.1 区块
区块链被界说为一组衔接在一起的区块,因为每个区块都包括链中前一个区块的Hash。区块中别的2个重要信息是买卖列表,以及区块中所有买卖履行完成后的国际状况的Hash值。
message Block https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpg
version = 1;
google.protobuf.Timestamp timestamp = 2;
bytes transactionsHash = 3;
bytes stateHash = 4;
bytes previousBlockHash = 5;
bytes consensusMetadata = 6;
NonHashData nonHashData = 7;
}
message BlockTransactions https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpg
repeated Transaction transactions = 1;
}
  • transactionsHash是区块内买卖列表merkle根的hash值
  • stateHash是国际状况merkle根的hash值
  • previousBlockHash是前一个区块的hash值
  • BlockTransactions.transactions是买卖音讯的数组,买卖列表因为巨细的联系并不直接包括在区块内部。
3.2.2 国际状况
节点中的国际状况是所有已布置的链码的状况集合,实际上是键值对https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpgchaincodeID, ckey}的集合。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注