3-1 P2P网络
传统中心化网络由中央服务器保存全量数据。客户端之间无法直接连接,必须通过中央服务器作为桥梁。客户端必须和中央服务器建立连接后访问资源。客户端之间并无连通。
在P2P网络中通过将数据资源分散在网络各个节点中存储以及节点间交互连接,协同来降低或完全消除对中央服务器的依赖。客户端节点也提供一定的服务端能力。
定义
对等式网络(peer-to-peer,简称P2P),又称点对点技术,是一种分布式网络。依靠节点群(peers)交换信息的互联网体系。和传统中心化网络系统不同,P2P网络的每个节点既是一个应用端,也有服务器的功能,网络中的节点共享他们所拥有的一部分硬件资源(处理能力、存储能力、网络连接能力等),这些共享资源,能被其他对等节点(Peer)直接访问而无需经过中间实体。在此网络中的参与者既是资源(服务和内容)提供者(Server),又是资源(服务和内容)获取者(Client)。
核心概念
覆盖网络(overlay network)
一种使用软件创建网络抽象层的方法,该抽象层可用于在物理网络之上运行多个独立的、离散的虚拟化网络层。覆盖网络中的所有节点都通过逻辑或虚拟链路相互连接,并且这些链路中的每一个都对应于底层网络中的一条路径。
底层网络(underlay network)
是建立覆盖网络的物理基础设施。它是负责跨网络传送数据包的底层网络。
核心特点
资源共享(resource sharing)
P2P网络中每一个节点保存部分系统资源,并共享系统资源。
网络化(networked)
P2P网络中所有节点都是直接或间接互连。
去中心化(Decentralization)
可减少或完全消除对中央服务器依赖。整个网络由所有节点决定行为。例如共识,节点发现,节点路由等,是由各个节点根据同步消息主动或被动触发相关功能。
自治(Autonomy)
P2P网络中的参与节点由节点本地配置决定。不需要管理系统决定节点。例如节点加入,退出等行为。
自组织(Self-organization)
组织建立,加入等由节点本地配置决定。各个节点功能基本一致,没有特殊节点统一管理组织。
可扩展(Scalable)
随节点加入,整个网络自动扩展。扩张过程不需要管理,节点根据自有功能加入和发现网络等。
优势
P2P网络的一个重要的目标就是让所有的节点都能提供资源,包括带宽,存储空间和计算能力。因此,当有节点加入且对系统请求增多,整个系统的容量也增大。这是具有一组固定中央服务器的Client-Server结构不能实现的,因为Client/Server这种结构中,客户端的增加意味着访问中央服务器的数量会越来越大,导致中央服务器出现性能瓶颈。
P2P网络的分布特性通过在多节点上同步和复制数据,也增加了网络整体健壮性,并且在P2P网络中,节点不需要依靠一个中央服务器来发现数据。
P2P网络通常以自组织方式建立,并允许节点自由加入和离开。这种情况下,系统具有耐攻击,高容错的优点。系统在部分节点失效的情况能够自动调整网络拓扑,保持与其他有效节点的连通性。不会出现网络整体崩溃。
P2P网络内每个节点既是服务器又是客户端,资源分布在多个节点。因此能更好地实现整个网络的负载均衡。
拓补结构
一般情况下,根据拓扑结构关系可以将P2P网络分为四类
- 中心化拓扑(Centralized Topology)
- 全分布式非结构化拓扑(Decentralized Unstructured Topology)
- 全分布式结构化拓扑(Decentralized Structured Topology,也称作DTH网络)
- 半分布式拓扑(Partially Decentralized Topology)
3-1-1 中心化拓扑结构
一个高性能的索引服务器存储网络中所有活动节点共享资源的目录和索引信息
当需要查询某个文件时,节点向索引服务器发出文件查询请求
索引服务器进行相应的检索和查询后,会返回符合查询要求的节点地址信息列表
节点接收到应答后,根据地址信息和目标节点建立连接,并传输数据
新节点加入网络时,需要向索引服务器注册并发送自己的资源目录和索引信息。索引服务器更新自己的数据库
索引服务器监控所有节点处于有效状态
经典应用
MP3共享应用Napster
优势
设立索引服务器存储资源索引
实现了文件查询与文件传输的分离,资源索引在索引服务器保存
有效地节省了索引服务器的带宽消耗,减少了系统的文件传输延时,资源发现效率高
缺点
索引服务器的瘫痪容易导致整个网络的崩溃,可靠性和安全性较低
随着网络规模的扩大,索引服务器需要存储大量的资源索引信息,为了保证资源的准确性和实时性,必须不断地和节点保持信息同步。当节点数量规模极大时,索引服务器节点受制于本身的算力,内存和网络带宽,很容易出现性能瓶颈。
3-1-2 全分布式非结构化网络
纯分布式的P2P网络不存在中心节点,每个节点在网络中是真正的对等关系
所有节点之间的链接是随机产生。新节点加入只需要随机选择已经存在的一个节点连接并建立邻居关系
每个节点利用全网广播发送请求,其他节点收到查询消息后搜索资源列表,查看自己是否有相应资源,如果有则返回搜索结果。如果没有,则向自己的邻居节点发送广播消息。
节点全网广播采用泛洪算法。一种常用消息广播算法
对于给定的网络拓扑结构,可以知道任何两个节点之间都有最短路径。最短的定义可以基于节点跳数。
例如:
节点1到节点6之间最短路径是:节点1→节点3→节点6由于泛洪消息会向节点的所有邻居广播消息,因此消息传播路径中一定包含最短路径
经典应用
- Gnutella分布式音乐平台
- 比特币网络
标准泛洪(Flooding)原理
节点S发起数据请求,仅向自己的邻居(1-hop邻居:不是间接连接)传播请求
所有节点收到请求后,仅向自己的直接邻居(1-hop邻居)转发请求
直到目标节点D收到数据请求,发起响应报文,同时携带路径路由信息(multi-hop多跳路径)
节点D发起响应后,如果再次收到数据请求,则会保持静默
即使节点S和节点D之间会话结束,网络中其他节点仍然可能发送请求或接受请求。最终所有节点都收到数据请求消息
泛洪算法性能
泛洪循环
节点1,2,3,4之间组成一个环。原因,节点1发送消息经过节点2,4,3,节点3再次发送给节点1。如果节点1对于收到的消息不做循环判断而再次发送给节点2,则形成泛洪循环。因此在全网任何时候,都可能发生泛洪循环。从而产生大量无效广播消息,大量网络和计算资源被浪费,导致整个网络不可用。
TTL机制
为了控制广播消息发生循环,对每个查询设置TTL(Time to Live)值,例如,TTL=TTL-1。节点每一次转发TTL减1,直到TTL = 0,放弃该消息。假设TTL最大值为4,节点1→节点2→节点4→节点3,消息转发经过3跳,节点3再次转发给节点1,节点1收到该消息的TTL为0,则放弃该消息,不再转发,可避免产生泛洪消息循环。
优势
高度容错,即使部分节点宕机/离线,整个网络不会崩溃。
面对网络的动态变化体现了较好的容错能力,因此网络维护性很高,具有较好的可用性。
可以支持复杂查询,如带有规则表达式的多关键词查询,模糊查询等
缺陷
随着联网节点的不断增多,网络规模不断扩大,通过泛洪算法查找节点的方法将造成网络流量急剧增加,从而导致网络中部分低带宽节点因网络资源过载而失效。
由于没有确定拓补结构的支持,非结构化网络无法保证资源发现的效率。即使需要查找的目的节点存在,发现也有可能失败。
响应消息风暴问题。在某一时刻节点4申请的资源被多数节点拥有。那么很短时间内,大量节点会发送响应消息到节点4.造成节点4瘫痪。
比特币网络机制
基于分布式P2P网络启发,比特币网络采用全分布式非结构化网络拓扑。在比特币网络中没有中心化服务器,没有特殊节点充当服务器,没有层次结构,因此整个网络属于扁平的拓扑结构。
所有节点既能提供服务也能消费服务,属于完全去中心化的网络。
网络节点连接采用比特币P2P协议(bitcoin P2P Protocol)。除此而外,还有矿池协议(pool-mining Protocol)和挖矿协议(Stratum Protocol)。所有协议支撑比特币网络节点间的交互。
比特币节点类型
比特币网络中的节点主要有四大功能:钱包、挖矿、区块链数据库、网络路由。每个节点都参与验证并传播交易及区块信息,发现并维持与对等节点的连接。
全节点
就是包含了钱包、挖矿、区块链数据库、网络路由功能的一个集合节点。全节点能够独立自主地校验所有交易,而不需要借由任何外部参照。
SPV节点
保留了区块链的一部分(区块头),它们通过一种名为“简易支付验证(SPV)”的方式来完成交易验证。又叫“轻量级节点”。
挖矿节点
通过运行在特殊硬件设备上的工作量证明(proof-of-work)算法,简称POW,以相互竞争的方式创建新的区块。
SPV挖矿节点
包含了钱包,挖矿功能的一个集合节点。
全区块链节点
包含完整区块链和网络路由信息。
矿池节点
包含矿池功能和挖矿协议或矿池协议。
矿池和挖矿协议服务节点
网关路由协议,支持节点运行矿池协议或挖矿协议
节点发现
比特币设计两种节点发现机制
DNS种子节点
比特币将一部分长期稳定的节点硬编码至代码中,这些节点在初始启动时提供最初接入网络的入口节点。新节点通过这些稳定节点作为中介连接其他节点,并且可以持续获取区块链网络节点地址列表。
带有IP地址的比特币节点
与该种子节点建立连接后,通过广播方式连接其他节点
新节点连接比特币节点时,首先要通过握手协议。
Version消息包含协议版本,当前时间,双方IP地址和区块高度等信息。
节点收到version消息后,会检查远端节点版本兼容性,如果兼容则发送verack消息作为回应并建立连接
新节点通过DNS种子节点或指定种子节点获取地址信息后,广播addr消息给邻居节点,邻居节点转发广播消息到其他邻居节点。
由于节点连接和退出时刻发生变化,新节点必须不断连接不同的邻居节点保证建立多个连接路径,保持多样化。
节点退出时,保存最新连接的邻居节点记录。下次重启后可以尽快重建连接。
3-1-3 全分布式结构化网络
全分布式非结构化网络由对等节点构成,没有统一路径规划,节点加入和退出完全随机,节点和节点间存在大量路由查询消息建立临时路由信息。在大规模网络中会引发广播风暴消息。并且节点发现效率不高。
区别于非结构化网络,全分布式结构化网络则将所有节点按照某种结构进行有序组织,比如形成一个环状网络或树状网络。
类似全分布式非结构化拓扑,不存在中心节点。
应用
以太坊区块链
优势
通过结构化网络,使用较少的路由信息就可以有效地实现资源定位。
能够自适应节点的动态加入/退出
良好的可扩展性、鲁棒性、节点ID分配的均匀性和自组织能力
扩展性较好,容易管理
由于网络采用了确定性拓扑结构,DHT可以提供精确的发现。只要目的节点存在于网络中,DHT总能发现它,发现的精确性得到了保证
缺陷
DHT的维护机制较为复杂,尤其是节点频繁加入退出造成的网络波动(Churn)会极大增加DHT的维护代价。
DHT仅支持精确关键词匹配查询,无法支持内容/语义等复杂查询
分布式哈希表算法
DHT,Distributed Hash Table,即分布式哈希表,典型的应用场景就是点对点网络(P2P网络)。
全分布式结构化网络中经常采用分布式散列表(DTH)对所有加入节点进行结构规划,把全网维护的路由表和数据,分割成不同的小范围路由和数据块,保存在各个节点中。从而实现整个网络的节点寻址和数据存储。
哈希表是一种能高效进行数据读取/写入的数据结构,通过哈希函数可以将任意的数据映像到固定长度的随机字符串,由于函数具有单向性与唯一性,因此这个随机字符串可以作为辨识数据的指纹,即Key。读取哈希表的数据(Value),只需提供Key,哈希表即可取得映像到该键值的完整数据。
在结构化P2P网络中,每个节点只存储部分的信息或部分信息的索引。当用户需要在P2P系统中获取信息时,必须知道这些信息(或索引)可以存在于哪些节点中。由于用户预先知道应该搜索哪些节点,避免了非结构化P2P系统中使用的泛洪式查找,因此提高了信息搜索的效率。
DHT经典算法
- Kademlia算法(二叉树结构)
- Chord算法(环形结构)
Kademlia算法
所有节点都被当做一颗二叉树的叶子,并且每一个节点的位置都由其ID值的最短前缀唯一的确定
对于任意一个节点,都可以把这颗二叉树分解为一系列连续的,不包含自己的子树。最高层的子树,由整棵树不包含自己的树的另一半组成;下一层子树由剩下部分不包含自己的一半组成;以此类推,直到分割完整个树。
节点的基本属性:
- 节点ID,Node ID 160bit
- 节点IP地址与端口号
异或距离
在Kademlia算法采用简单的异或计算来衡量两节点间的距离,它和地理上的距离没有任何关系,但却具备几何公式的绝大部分特征:
- 节点和它本身之间的异或距离是0
- 异或距离是对称的:即从A到B的异或距离与从B到A的异或距离是等同的
- 异或距离符合三角形不等式:给定三个顶点A B C,假如AC之间的异或距离最大,那么AC之间的异或距离必须小于或等于AB异或距离和BC异或距离之和
- 对于给定的一个距离,距离A只存在有唯一的一个节点B,也即单向性,在查找路径上也是单向的,这个和地理距离不同。
例如:两个节点间进行异或,计算节点间距离
00110与00011的异或XOR距离为00101,也就是十进制5。即两个节点之间的逻辑距离是5。
路由表和k-Bucket
k-Bucket桶中的k指每个桶中所能容纳的最大节点数。K是一个系统设定参数。桶的节点划分是根据子树划分。k桶的个数跟节点ID的位数有关,假设节点ID的位数为n,则最多有n个k桶。第1个k桶中的节点与本地节点前n-1位ID是相同,第2个k桶中的节点与本地节点前n-2位id是相同,以此类推。
所有k桶合起来假设一个节点的路由表。
以node ID为0011的节点为例,共有4个k桶。第i个k桶中异或距离的范围为
一个具有2的N次方个节点的网络在最坏情况下只需要n步就可以找到被搜索节点或值。在一个包含n个节点的网络中,kademlia的搜索时间复杂度为O(log(n))。
以node ID 0011为例,查询节点1110的流程
前提:假设0011节点路由表中仅知道1101节点。
- 首先计算Dis = 0011 XOR 1110节点距离为13
- 查询本节点路由表中最接近的K桶[3],获取节点1101。然后发送findNode消息。
- 节点1101收到消息后,计算dis = 1101 XOR 1110距离为3
此时,根据节点1101路由表查询K桶[1]中即可得到目标节点1110。
消息
算法中需要以下消息保证节点的通信和数据更新
- PING——验证远程节点是否在线
- STORE——在某个节点上存储key-value键值对。在节点上存储资源。
- FIND_NODE——查找节点,给定一个nodeID,被请求的节点返回与nodeID相近的k个节点
- FIND_VALUE——查找资源,给定一个Key,被请求的节点的node id与key相近,并且具有该key,返回与key对应的value。
Kademlia算法通过关键字(节点ID或数据Key)进行精确查询。
备注:使用Kademlia算法既可以查询节点,也可以查询数据。可以把数据进行Hash签名后作为Key值,如果该数据Key值和某节点ID距离较近,则存储在这个节点中。这样发起节点可以通过查询Key值,找到存储节点,从而获取原始数据。
以太坊网络机制
以太坊网络采用全分布式结构化拓扑。采用DHT算法实现网络结构化。
以太坊全节点:包含区块链的所有核心组件(块、事务、日志和收据)的完整历史数据集。主要有七大功能:挖矿、区块链数据库、网络路由、钱包、交易和智能合约。每个节点都参与验证并传播交易及区块信息,发现并维持与对等节点的连接。(Geth)
轻节点:轻量级的节点,具体定义是不储存或维护完整的区块链副本,只储存区块链header。参与部分数据验证。通常应用于移动设备
归档节点(Archive Node)即在全节点基础之上多储存了每个区块高度的状态(State)快照,供检索相关用途。
节点发现
一个新的以太坊节点,希望加入到以太坊网络,首先要获取种子节点地址。通过链接种子节点接入以太坊网络。种子节点地址通常都是硬编码方式。(直接写入代码中)
运行以太坊Kademlia的协议栈,与以太坊网络中的其他节点通信。
Kad算法利用ID或Key作为关键字查询,通过路由表发现目标节点。理论查询时间复杂度为O(logN)
每个节点包含256个桶,算法中K=16,即每个桶中最多放16个节点
节点每次同时选择3个邻居节点发送Findnode报文。
3-1-4 半分布式网络
半分布式集合全分布非结构化拓扑和集中式拓扑的优点,将两种方式结合并做了平衡。
半分布式P2P网络由少量超级节点和大量普通节点组成。半分布式网络可以看做是由多个以超级节点为中心节点的集中式网络链接而成。
在各个超级节点上存储了系统中其他部分节点的信息,节点发现算法仅在超级节点之间转发,超级节点再将查询请求转发给适当的叶子节点。
半分布式结构也是一个层次式结构,超级节点之间构成一个高速转发层,超级节点和所负责的普通节点构成若干层次。
应用
- KaZaa 一种P2P文件共享平台
- 超级账本
优势
吸取了中心化结构和全分布式非结构化拓扑的优点,选择性能高(处理、存储、带宽等方面性能)的节点作为超级节点(SuperNodes,Hubs),在各个超级节点上存储了系统中其他部分节点的信息。
有效地节省了中央服务器的带宽消耗,减少了系统的文件传输延时,资源发现效率高
泛洪只在超级节点间发生,减少了广播风暴。多个超级节点备份数据,提高网络整体健壮性。
扩展性较好,容易管理
缺陷
对超级节点依赖性大,容易受到攻击。
超级账本网络机制
节点类型
超级账本采用半分布式结构化网络拓扑。将节点分为普通用户节点和超级节点(排序、背书节点等)。超级节点可以由普通节点选举,也可以自行配置,单独一个超级节点停机不影响系统运行。
超级账本所有交易必须通过超级节点认证,区块也是由超级节点生成,普通节点间可以互相同步区块。
客户端节点
客户端或应用程序代表由最终用户操作的实体,它必须连接到某一个Peer节点或者排序服务节点上与区块链网络进行通信。
CA节点
fabric的证书颁发节点(Certificate Authority),由服务器(fabric-ca-server)和客户端(fabric-ca-client)组成。
背书节点(Endorser Peer)
执行交易并对结果进行签名背书
主节点(Leader Peer)
主节点负责和排序服务节点(Orderer)通信,从排序服务节点处获取最新的区块并在组织内部同步。可以强制设置,也可以选举产生。
排序服务节点(Orderer)
接收包含背书签名的交易,对未打包的交易进行排序生成区块,广播给Peer节点。
锚节点(Anchor Peer)
组织之间的互通节点,一个组织内的锚节点作为代表负责同其他组织进行信息交换
记账节点(Committer Peer)
负责验证从排序服务节点接收的区块里的交易,然后将块提交(写入/追加)到其通道账本的副本。
节点发现
一个新的超级账本节点,希望加入到超级账本网络,首先要找到组织,通过节点配置文件设置希望加入的组织。组织内CA提供新节点身份标识
通过配置文件设置主节点。连接主节点保证接收Orderer节点区块数据
设置配置文件的锚节点。保证可以和其他组织内的节点连接
创建通道或加入已有通道。通过Gossip广播消息获取通道内节点连接。
新节点会采取广播方式获取其他节点的地址。利用Gossip协议中的push/pull机制发送广播消息
Gossip协议中push/pull推拉机制的广播方式效率很高,一条广播消息传播到所有节点的时间是:
3-1-5 区块链网络选型
区块链分布式网络
P2P网络发展经历了四个阶段:集中式,纯分布式,分布式结构化以及半结构化过程。每一阶段的发展都有其特点,随着硬件和软件技术的发展,P2P网络的技术越来越成熟。
每种P2P网络结构拥有各自的优缺点,针对不同的区块链应用场景、不同的业务需求,P2P网络的使用也不同。
目前市场主流的区块链网络包括:比特币,以太坊和超级账本。区块链网络技术继承自P2P网络技术。
备注:
SHA2包含SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。
SHA3算法也称为Keccak加密算法,包含SHA3-224、SHA3-256、SHA3-348、SHA3-512
区块链接入效率
区块链网络节点接入方式
比特币
依赖DNS种子节点列表
依赖固定IP种子节点
接入配置方式简单
以太坊
依赖种子节点
接入或配置方式简单
超级账本
加入组织
设置引导节点
接入或配置方式简单
区块链网络节点发现效率
比特币
全分布式网络,节点可以任意加入或退出
采用Gossip协议实现节点发现
16小时内,可以连接成功10459个有效节点
备注:节点连接依赖节点计算能力,内存和存储能力以及网络带宽。
以太坊
全分布式网络,节点可任意加入或退出
采用DHT的Kademlia协议实现节点发现
每小时,Geth客户端可建立1K-1.5K连接,连接300-400个有效节点
备注:节点连接依赖节点计算能力,内存和存储能力以及网络带宽。
参考
超级账本
半分布式结构
节点发现采用Gossip协议实现
虽然没有实际实验数据,但根据节点接入方式,新节点会加入某一通道,通过广播协议获取通道内节点地址。其广播方式仅仅在通道内发送。不同于比特币和以太坊网络在全网发送。由此可推断节点发现效率必然很高。
区块链区块传播效率
比特币
采用Gossip协议实现区块传播
根据下图概率密度分布函数图形。不区分区块大小,一个新的block平均传播时延时间为12.6秒。即使过了40秒以后,仍然有5%的节点未收到区块
备注:区块传播依赖节点计算能力,内存和存储能力以及网络带宽。
参考:
以太坊
采用以太坊wire协议实现区块传播
下图根据每一个block的传播时延构造的时间累计分布图。一个区块的平均峰值传播时延约为200毫秒。
备注:区块传播依赖节点计算能力,内存和存储能力以及网络带宽。
参考:
超级账本
半分布式结构
节点发现采用Gossip协议实现
虽然没有实际实验数据,但根据超级账本规则,主节点会主动从Orderer节点拉取新区块,然后通过广播方式发送到通道内其他节点。其广播方式仅仅在通道内发送。不同于比特币和以太坊网络在全网发送。由此可推断区块传播效率必然很高。从超级账本交易TPS来看,也是可以印证其区块传播方式非常高效。
区块链接入安全
由于比特币和以太坊网络采用全分布式网络,因此节点接入和退出随时发生。同时公有区块链网络通常允许任何人加入并让参与者保持匿名,并且无法控制节点接入的权限和规则,由此造成网络被攻击,节点间连接失败,数据不能完全同步等问题。
日蚀攻击
举例:以太坊网络,节点发现和节点路由使用Kademlia算法实现。
- 当我们知道目标节点的NodeID之后,就可以通过一定的方式去伪造生成满足不同Bucket的NodeID,当这个目标节点重启之后,马上以这些NodeID启动节点去连接目标节点,由于Kademlia的特性,这些特意伪造的NodeID肯定会被填入目标节点的路由表中,从而把路由表占满,以达到日蚀攻击的目的(切断节点之间正常的路由信息)。
- 如何让目标节点重启?可以等待目标节点自动重启或者采用DOS攻击迫使目标节点重启。当重启之后马上进行上面的操作就可以完成日蚀攻击。
- 当成功发起日蚀攻击之后,随后就能隔离节点,篡改目标节点的收发数据包了。
女巫攻击
举例:比特币网络,节点身份匿名没有身份确认等功能。
女巫攻击指攻击者将一个节点伪装成多个节点进入比特币网络中,在比特币网络中具有多重身份。通过伪造身份进入网络,干扰路由,干扰信息传递,伪造投票等。
DDoS攻击(Distributed Denial of Service)
指处于不同位置的多个攻击者同时向一个或数个目标发动攻击,或者一个攻击者控制了位于不同位置的多台机器并利用这些机器对受害者同时实施攻击,使攻击目标无法正常使用。通常的方式有SYN flood,UDP flood,ICMP flood,connect flood等。
区块链网络中的经典攻击方式对比
区块链隐私保护
比特币
隐私保护
比特币的隐私策略就是隔离比特币地址和持有者的肉身身份。但是真正做到肉身身份和比特币地址分离是非常困难的。公众可以看到所有的转账记录,其中包括发送和接收方的比特币地址、转账金额等信息。
比特币交易是可追踪的
比特币是最透明的一个支付系统,所有交易历史都会被保留,这种特质给比特币的隐私安全带来了极大的挑战。另外监听者也会观察交易过程中的路由信息,从而推算出交易节点位置。
综上,比特币的隐私性不好。
以太坊
隐私保护
以太坊隐私保护很弱。用户钱包信息,交易地址等,如果不注意防范或者使用加密方式,很容易通过以太坊公网获取到。通过搜索以太坊域名和钱包地址就很容易识别个人身份。
交易零知识证明
以太坊2.0出现后,采用零知识证明保护交易的私密性。
综上,以太坊网络层隐私保护类似比特币,同样非常弱。用户钱包,域名和交易IP,访问时间,历史信息等个人信息得不到很好的保护。在账本层,以太坊采用零知识证明,保证不泄露交易的情况下完成交易。但是该方案仍然有诸多问题,例如计算量大,部分协议需要第三方可信机构等。
超级账本
隐私保护
用户可通过CA服务提供匿名身份,即每个交易的短期证书,满足一次一密,不可伪造、无关联性和可跟踪性。使得用户不仅以匿名方式参与到系统中,而且阻止了交易之间的关联性。
交易保护
超级账本具有多通道(Multiple-channel)的支持。使用该特性,账本网络中若干成员可以协商构建一个专属通道与外部隔离,通道外的节点无法看到其中的账本和交易数据。各个通道之间的账本和账本之间批次隔离,形成了一个个隐私的共识通道,极大地提高了隐私性。
综上,超级账本的个人隐私保护可以通过CA节点提供匿名身份保证,同时支持通道(Channel)保证只有通道内的成员交易和账本可见。对于非通道成员不可见。超级账本的隐私保护很明显要好于比特币和以太坊网络。
3-2 Gossip协议
Gossip协议介绍
人类社会中八卦和谣言是经常出现的社会现象。小道消息可以通过谣言以极快的速度迅速传播到全体。通过生物学角度,病毒传播也类似谣言方式,可以通过1对1,1对多或者多对多迅速传播。
Gossip Protocol在1987年8月由施乐公司帕洛阿尔托研究中心研究员艾伦.德默斯(Alan Demers)发表在ACM的论文《Epidemic Algorithm for Replicated Database Maintenance》中被提出。
Gossip协议模拟谣言或者病毒的传播方式,通过一定的算法,在大型的分布式网络系统中更新数据,保证所有节点的数据一致性。
Gossip算法作为分布式系统重要算法得以广泛运用,有以下几点原因:
- 算法复杂度简单,容易实现。目前已有上百种Gossip协议变种
- 相对于其他算法,Gossip算法通过模拟病毒或者谣言方式,传播速度快
- 算法稳定,可靠
- 可部署在分布式系统,减少或无需集中式管理
- 一旦产生新的数据,通过种子节点发起传播,经过一段时间,最终所有节点都会收到更新消息。因此Gossip协议是一个最终一致性协议
前提和定义
假定一组节点互相连接,每个节点和其他节点都可以互通消息。逻辑上为一个完整和独立的分布式系统。
该系统所有节点使用统一时间
每个节点保持三种状态之一
- 易感状态 susceptible(S):节点处于易感状态,接收新数据更新
- 感染状态 infected(I):节点由新数据,将要分享数据给其他节点
- 免疫状态 removed(R):节点已经更新,处于免疫状态或者死亡状态,不再参与传播数据过程
反熵算法 anti-entropy
每一个节点周期性地随机选择其他节点进行互相交换所有数据,经过一段时间后,最终所有节点间的数据保持一致性。通过实验分析反熵算法非常可靠,但是每次节点两两交换自己的所有数据会带来非常大的通信负担,所以不是特别高效。通常只用于新加入节点的数据初始化。
传谣算法 rumor-mongering
谣言传播过程是消息只包含最新数据,谣言消息在某个时间点之后会被标记为removed,并且不再被传播。缺点是系统有一定的概率会不一致,通常用于节点间数据增量同步。初始状态所有节点都是“susceptible”易感状态。当一个节点收到新的数据更新,状态转为“谣传者(Hot rumor)”。当节点为“谣传者”时,定期随机选择其他节点进行数据同步。谣传者节点定义同步共享节点个数,仅在定义的节点个数之内发送数据同步。如果同步数据多次后,发现其他节点数据始终一致。则停止同步(散布谣言),并将该节点从“谣传者(Hot rumor)”改为“removed”免疫状态。传谣算法比反熵算法更高效。但会有一定概率节点会数据丢失。
Gossip协议消息
Push消息
发起信息交换的节点A随机选择联系节点B,并向其发送自己的信息,节点B在收到信息后更新比自己新的数据,一般拥有新信息的节点【感染状态infected(I)节点】才会作为发起节点。
Pull消息
发起信息交换的节点A随机选择联系节点B,并从对方获取信息。一般无新信息的节点【易感状态susceptible(S)节点】才会作为发起节点
Push&Pull消息
发起信息交换的节点A随机选择联系节点B,同时从对方获取数据,用于更新自己的本地数据。
如果把两个节点数据同步一次定义为一个周期,则在一个周期内,Push需通信1次,Pull需2次,Push&Pull需3次。虽然消息数增加了,但从效果来讲,Push&Pull最好,理论上一个周期内可以使两个节点完全一致。
3-2-1 Gossip协议算法
Gossip算法1 SI模式(反熵算法)
SI模式中S表示(易感状态susceptible节点)状态,I表示(感染状态infected节点)状态。在SI模式中,节点的最初状态在易感状态(S状态),状态可迁移到感染状态(I状态)。一旦进入感染状态,节点不再改变状态。
第二行表示循环会定时启动,然后随机选择节点
算法使用两个布尔值,push和pull表示发送或接收消息
当push为真时,节点状态是I(infected感染)状态时,发送更新数据到其他节点,可感染其他节点。如果节点状态为S(susceptible易感)状态,则忽略更新发送
如果pull为真时,节点会通过update request拉取新的数据
在OnUpdate过程中,节点会存储更新数据,并且将自己的状态迁移到I(infected感染)状态
在OnUpdateRequest过程中,如果节点为I(infected感染)状态,节点会发送push消息到对方。如果是S(susceptible易感)状态,则什么都不做
算法复杂度(Push消息)
- 考虑一个节点N的分布式系统,只用Push消息更新所有节点数据
- Pi表示一个节点在第i次传播周期后为易感节点的概率
- (N-1)/N表示一个节点为感染节点的概率
- N(1-Pi)感染节点数量
通过以下方程,我们可以推测第i+1次还剩余多少易感节点的概率。
随着易感节点的减少,最终所有节点都会成为感染状态,即所有节点的数据都会被更新。
算法复杂度(Pull消息)
- 考虑一个节点N的分布式系统,使用Pull消息更新所有节点数据
- Pi表示一个节点在第i次传播周期后为易感节点的概率
通过以下方程,我们可以推测第i+1次还剩余多少易感节点的概率。
随着易感节点的减少,通过Pull消息同步数据一致性更为有效。
比较两个公式
当Pi很大时,即开始传播阶段,使用Push消息可以更快地进行传播,
当Pi很小时,使用Pull消息可以更快地收敛,所有节点数据更快同步。
Gossip算法2 SIR模式(传谣算法)
SIR模式中S表示(易感状态susceptible节点)状态,I表示(感染状态infected节点)状态,R表示(免疫状态removed节点)状态。在SIR模式中,节点的最初状态在易感状态(S状态),状态可迁移到感染状态(I状态)。当感染状态的生命值结束后,将转为免疫状态,一旦进入免疫状态,节点将不再改变状态。
SIR算法实现目的
定义免疫状态(removed)是为了减少冗余的消息,push和pull消息在整个数据更新后期,会产生越来越多的冗余消息。因为在后期大部分节点已经转变为感染(I infected)节点。已经同步了更新消息,大量更新消息成为冗余,占用了网络流量。所以给节点定义一个生命值,当超过生命值以后,节点迁移到免疫状态(removed),停止发送push或pull消息。
简化协议模型,更好的分析和优化没有感染的节点原因
SIR算法和SI算法的区别在于节点可迁移到免疫状态(removed)。在OnFeedBack过程中,当概率达到1/K时,状态迁移到R(removed)。减少整个系统重发update消息带来的冗余
OnUpdate过程中,当节点收到update消息时,如果节点状态处于I或者R时,发送feedback消息。
OnUpdateRequest过程和算法1 SI算法一样,只有节点处于感染状态(infected)时才发送update消息。
SIR算法中,易感节点(susceptible)和R(removed)状态节点理论上为0,最终所有节点成为感染节点I。
第13行中的概率1/K定义节点迁移到免疫(removed)状态的概率。通过实验分析
当K=1,20%的节点会丢掉update消息,停止传播
当K=5,0.24%的节点会丢掉update消息,停止传播
当K=10,0.00017%的节点会丢掉update消息,停止传播
例如,可假设K=5,节点每次在OnUpdate过程中对K值加1,当K值等于5的时候,节点状态迁移到R(removed)免疫状态。此时节点会丢掉Update消息,不再进行传播。整个系统中会有0.24%的节点停止传播Update消息。
R节点不再参与传播消息
3-2-2 以太坊传播协议(以太坊Gossip协议)
以太坊P2P网络
以太坊P2P传播协议并没有采用经典的Gossip协议算法实现。而是在P2P网络中分为两类协议实现消息传播和数据同步机制。在Ethereum(以太层),采用Ethereum Wire Protocol实现交易数据和区块数据的传播。节点之间通过Node Discovery Protocol实现节点发现和节点同步机制。
以太坊节点发现协议并未遵照经典Gossip协议算法实现,但是以太坊P2P传播协议原理类似经典Gossip协议算法。
以太坊P2P网络分层
Application Layer 应用层
包含以太坊上层,Dapp,智能合约,虚拟机,区块链管理,共识机制,矿工,账户管理,交易管理等。应用层通信需要使用以太层支持
Ethereum Layer 以太层
主要包含Transactions Exchange和BlockPropagation区块传播模块。
节点间通信使用Ethereum Wire(以太线)协议,以太线协议负责交易Transaction和区块的数据同步和传播。
RLPx协议负责封装以太层协议消息。以太层使用TCP连接
P2P层
以太坊节点之间通过发现协议(Node Discovery Protocol),使用Kademlia算法(DTH分布式哈希表的算法实现)发现新增节点,保持节点间连接等功能。NDP协议使用UDP报文连接
RLPx协议介绍
RLPx协议是基于TCP的传输协议,用于以太坊节点之间的安全加密通信。
RLPx使用了ECIES(Elliptic Curve Integrated Encryption Scheme)椭圆曲线加密技术,通信双方生成随机公私钥对,交换各自的公钥,使用自己的随机私钥和对方的公钥生成共享密钥(shared-scret)。后续使用这个共享密钥对称加密传输的数据,即使一方的私钥被泄露,过去的通信还是安全的。
在RLPx中,每个节点(Node)维护一个私有密钥(基于secp256k1椭圆曲线算法),用来加密或恢复数据。
节点间建立连接之前首先要经过握手流程,经过握手流程生成共享密钥(shared-scret)
握手后所有的消息都按帧(frame)传输。一帧数据携带属于某一功能的一条加密消息。分帧传输的主要目的是在单一连接上实现可靠的支持多路复用协议。即单一连接通道中建立多个会话(session)逻辑连接,类似TCP通道。通过握手生成的密钥对数据帧进行加密和验证。
Hello消息携带节点的能力(Capabilities),即节点能够支持的功能
Disconnect消息,通知节点断开连接。收到该消息后,节点应当立即断开连接。
节点发现协议(Node Discovery Protocol)
节点发现协议采用Kademlia算法。Kademlia算法在2002年由美国纽约大学的Petar P. Maymounkov 和 David Mazières提出,是一种去中心化的P2P通信算法。 Kademlia算法在节点之间使用UDP进行通信,节点利用分布式散列表(DTH,Distributed Hash Table)存储数据。
Kademlia算法通过独特的以异或算法(XOR)为距离度量基础,建立了一种全新的DHT拓扑结构,相比其他算法,提高了路由查询速度。
本课程介绍的是协议版本是v4。
Kademlia算法原理详细介绍在《P2P网络-全分布式结构化网络》
核心概念
NodeIdentities
Node Records
Kademlia Table
节点发现协议使用4个消息发现和连通节点 NDPV4
- Ping报文
测试一个节点是否在线
- Pong报文
Ping报文应答消息
- FindNode报文
根据节点Node ID查找最近节点
- Neighbors报文
FindNode应答报文
两个节点记录通信报文
- ENRRequest报文
收到此报文后,节点必须发送ENRResponse作为应答,并携带node record
- ENRResponse报文
节点发现协议流程
- 每个节点之间利用ping/pong报文监测邻居节点是否正常
- 查找路由表,最近的邻居节点
- 发送Findnode报文
- 邻居节点收到报文后,在路由表中没有找到N,则把自己的距离最近的16个节点发送给节点A
- 节点A收到邻居节点bucket,更新自己的路由表
- 不断重复查找过程
- 找到节点N,并取出IP地址和端口号
- 节点A利用ping/pong报文和节点N建立连接
区块传播算法
以太协议(Ethereum Wire Protocol)
发起节点首先发送Status消息和目标节点建立会话,在会话期,以太协议主要完成三个功能:
- 键同步
以太坊中的节点获取完整区块链,从创世区块到当前最新区块。
- 区块传播
挖矿产生的新区块传播给所有节点
- 交易传播
所有节点需要交换正在处理的交易数据,然后广播给矿工,矿工最后将交易写入区块中
新区块传播流程
- 区块广播分为两类广播
完整区块广播,选择部分节点广播,减少网络流量。
区块Hash广播,选择所有未包含新区块节点
- 广播消息
- NewBlock消息广播完整新区块
- NowBlockHash消息广播区块Hash
- 每个节点并行处理区块广播消息。原理上和Gossip协议中Push/Pull机制类似。
3-2-3 超级账本Gossip协议
Gossip协议核心功能
Gossip数据传播协议在Fabric网络中起到重要作用。节点利用Gossip广播账本,通道数据等。通道中的一个或多个节点可以持续接收账本数据。这些账本数据来自于通道内其他节点。
每一个Gossip消息都是经过签名的消息,防止参与者发送伪造消息。
在超级账本网络中,Gossip数据传播协议的三个主要功能是:
- 发现节点和通道成员。标识可用的节点和通道成员,监测下线或不可用的节点和通道成员。
- 在通道中,把账本数据传播到所有节点。某些节点中如果有丢失的区块或者未同步的区块,Gossip利用反熵算法进行数据同步和更新,最终使通道中所有节点的账本数据保持一致。
- 通过点对点传输协议,使得新连接的节点更快地进行账本数据更新。
备注:关于安全,点对点之间传输安全性由节点TLS层保证。节点之间认证在Gossip协议层。账本区块由Orderer节点签名。
Gossip协议在Fabric网络中的几个核心场景应用
Leader election
主节点选举机制。每个组织需要选举出主节点,和Orderer节点通信,传播新生产的区块到其他节点。
Anchor peer
锚节点是不同组织之间互通的桥梁。同一个通道内的节点可能属于不同组织,任意两个节点之间的对话首先要经过锚节点对接后,才能互相共享信息。
节点和锚节点对话采取Gossip协议
服务发现,私有数据和区块广播
超级账本中的Gossip协议支撑服务发现,私有数据传输和区块广播
Fabric中Gossip协议消息
pull消息
Gossip协议中Pull消息可以让节点主动拉取更新数据
Fabric中的Gossip Pull消息使用4个消息完成节点间pull消息机制
Fabric中的Gossip Pull机制单独定义Mediator调解人接口,封装pull机制和hello,SendDigest,SendReq和SendRes消息。方便Channel通道,chaincode链码等服务定时发送消息
push消息
在Fabric中push消息封装在batchingEmitter接口中。所有push消息首先Add到一个队列中,再由协程定时发送
batchingEmitter通过底层communication层调用writeToStream和readFromStream,将发送/接收的消息封装成gRPC stream格式,并发送到相应节点。Stream适合大数据量传送,同时满足节点间长时间的数据交互
Fabric中Gossip协议中的一些参数定义
Fabric中缺省定义Gossip协议中需要的配置参数
MaxBlockCountToStore定义为push/pull消息缓存数量
PropagateIterations定义为当节点收到消息,几次后即放弃不再接受。Fabric中缺省为1次。在Gossip协议课程中提到过可以使用K值控制消息重发/重收次数,在Fabric中K值为PropagateIterations。设置为1目的是减少占用网络带宽。
PropagatePeerNum/PullPeerNum是随机选择节点个数。在Gossip协议中节点push/pull时,会随机选择一定数量节点。Fabric中缺省定义了这个随机值
Fabric中与Gossip协议相关核心概念
前提
本课程中的核心概念仅引入与Gossip协议相关的概念。包括
- Peer 节点
- Ledger 账本
- Channel 通道
- Organization 组织
- Ordering Service 排序节点
Peer 节点
Fabric网络中最重要的组成部分是由peers节点组成
节点中包含最重要的信息(账本和智能合约)
每一个节点可包含多份账本拷贝和多份智能合约拷贝
Peer节点可以被创建,激活,停止,重新配置或者删除
Leader Peer 主节点
每一个组织中的主节点,负责和Orderer节点进行通信,获取区块文件。Orderer节点生成新的区块文件后,为减少网络流量,不会发给所有peer节点,而是发送给组织内的主节点,再由主节点发给组织内的其他节点。
Anchor Peer 锚节点
组织之间的互通节点,一个组织内锚节点作为代表负责同其他组织进行信息交换。为了Gossip协议能够正常工作,在通道配置中至少有一个Anchor peer锚节点
通道中的节点接收其他节点消息,随机选择一定数量(可在配置文件中配置)的目标节点转发这些消息。
节点除了被动接收Push消息之外,也可利用Gossip协议中的Pull消息机制主动拉取消息
对于新的block区块数据,通道中的Leader peer主节点会利用Pull从Orderer节点拉取,再利用Gossip的传谣算法更新到通道中其他节点。
Ledger 账本
账本信息包含交易记录和当前的状态,不可篡改。
账本结构包含两个独立部分:
world state - 存储当前账本状态值的数据库
blockchain区块链 - 事务日志,记录了所有交易记录变化的账本
所有事务交易和变化都会被追加到区块链日志中,最终根据历史交易变化可以推导出当前账本状态值。所以可以说Blockchain区块链决定了world state。
单独在数据库中存放world state非常有用,因为系统会经常访问账本的当前状态值。如果从区块链遍历并计算历史交易,并推导出当前状态,显然是效率很低的操作。
账本区块生成后,会发送给Orderer节点进行排序,通道中的Leader peer利用pull机制拉取新的区块,然后广播给通道中的其他节点
Channel 通道
通道类似网络中“subnet”子网概念,在Fabric网络中建立彼此隔离的数据共享渠道。
一个通道绑定组织,成员节点,账本和智能合约以及Order Service等,一起构成了完整,可信的区块链事务交易。
节点只有加入指定的通道中才能和通道中其他节点互相共享账本。和消息队列(Message Queue)中主体(Topic)概念类似。只有加入到Topic中的成员才能访问该主题中的消息
通道创建,释放和通道中成员变化等信息,Fabric利用Gossip协议中的push消息进行传播,通知通道中的所有成员。
Fabric Samples中Gossip节点配置
在超级账本自带的演示网络First Network中,包含Gossip节点配置内容
3-3 联盟链网络
3-3-1 联盟链网络身份认证
什么是联盟链?
联盟链是由多个组织管理的多个私有链的集群组成的区块链。每个组织管理一个或多个节点,其数据只允许系统内不同组织进行读写和发送。
联盟链的每个节点通常都有一个与之对应的实体机构组织,只有通过授权才能加入和退出网络。每个机构组织形成利益相关者联盟,以维护区块链的健康运行。
联盟链的特点
- 部分去中心化
- 更可控
- 数据默认不公开
- 交易速度快
联盟链的另一种定义?
指多个主体达成一定的协议,或建立了一个业务联盟后,多方共同组建的链,加入链的成员需要经过验证,一般是身份可知的。正因为有准入机制,所以也通常被称为“许可链”。
因为许可链从组建、加入、运营、交易等环节有准入和身份管理,在链上的操作可以用权限进行管控,共识方面一般采用PBFT等基于多方多轮验证投票的共识机制,网络规模相对可控,在交易时延性、事务一致性和确定性、并发和容量方面都可以进行大幅的优化。
许可链的问题
- 安全性问题
- 治理与监管复杂
什么是身份认证?
一个检查个人是否是他们所说的人的过程。例如围绕基于知识的身份认证会提出一些动态问题,这对于另一个人来说很难回答。因为身份认证机构需要保存用于认证的问题,所以中心化的认证机构在所难免。
传统的身份认证有下列几种方法:
基于密码的身份验证
密码是一种非常常见且广为人知的身份验证做法。然而,现在使用密码验证变得越来越困难,因为用户必须想出大量不同的密码
生物特征验证
此身份验证过程依赖于个人的原始生物学特征来验证其身份。收集用户的生物特征数据,然后保存在数据库中。生物特征数据的主要优势之一是用户不会丢失或忘记它
多因素身份验证
多因素身份验证需要两种或多种不相关的方式来识别用户。例如,验证码测试、语音生物识别、从用户智能手机创建的代码、指纹或面部识别
数字身份是个人身份在数字世界的投影,因此首先需要一段数字信息标识一个数字身份,最常见的方式是使用用户名。但是用户名与以上身份验证的信息相似,都需要保存在中心化的认证机构,所以并不适合用于部分去中心化的联盟链应用。
区块链数字身份标识
区块链中,可采用公钥、地址(公钥哈希)、数字证书等方式来标识链上参与者的数字身份,具体对比如下表所示:
标识方法 | 标识长度 | 外部依赖 | 附加信息 |
---|---|---|---|
数字证书 | 大 | 依赖CA颁发数字证书 | 可在证书字段中附加组织、角色等额外信息 |
公钥 | 中 | 无 | 不能附加额外信息 |
地址 | 小 | 无 | 不能附加额外信息 |
分布式数字身份(DID) | 小 | 依赖DID支撑平台 | 不能附加额外信息 |
附加信息在这里尤为重要,是因为认证的目的是为了获得对应的许可权限,对于可以存储附加信息的标识则可以不通过额外的存储保存许可信息,从而降低系统的复杂度。
数组地址认证概述
公有链使用账户来标识和区分每一个独立的用户。在采用公私钥体系的区块链体系里,每一个账户对应着一对公钥和私钥。其中,由公钥经哈希等安全的单向性算法计算后得到地址字符串被用作该账户的账户名,即账户地址,为了与智能合约的地址相区别,账户地址也常被称作外部账户地址。而仅有用户知晓的私钥对应着传统认证模式中的密码。用户需要通过安全的密码学协议证明其知道对应账户的私钥,来声明其对于该账户的所有权,以及进行敏感的账户操作。
因为账户地址不包含额外的信息,所以账户的许可权限信息需要保存在链下存储系统中。
账户的创建和存储
以太坊的账户可使用OpenSSL生成ECDSA椭圆曲线公私钥
区块链平台会提供账户创建脚本
也可使用Java SDK创建账户
用户可以根据需求选择将账户私钥存储为PEM或者PKCS12格式的文件。其中,PEM格式使用明文存储私钥,而PKCS12使用用户提供的口令加密存储私钥
Java SDK支持通过私钥字符串或者文件加载,所以账户的私钥可以存储在数据库或者本地文件
账户的读取
区块链平台会提供脚本以在启动时加载私钥存储文件
也可使用Java SDK加载私钥文件
账户的使用
当一个账户发起交易(也叫发出消息)时,需要使用自己的私钥对交易进行数字签名,图中是账户A使用数字签名向共识节点传输交易数据的过程
首先,交易内容经过单向散列函数的处理得到一份交易内容的摘要。其中,交易内容和交易的摘要具有很强的对应关系,只要交易内容发生改动,经过单向散列函数处理后得到的摘要都会不一样。
账户A使用自己的私钥对摘要进行加密,得到加密的摘要。
账户A把交易、加密的摘要和公钥一起发给共识节点。
共识节点收到A传过来的信息后,首先将其中的内容也采用第一步一样的单向散列函数处理得出一份摘要,然后使用A的公钥对收到的加密的摘要进行解密得到另一份摘要。
把上一步得到的两份摘要进行比较,如果两份摘要相等,说明交易经过账户A签名之后,在传输过程中没有被更改,同时也验证了此交易就是由账户A发起的,完成了对A的身份验证。
数组公钥认证概述
因为联盟链是私有链的集群,而对于私有链来说最简单的办法就是将身份相关信息经过密码学处理后上链保存。因此这里的数字公钥认证与上一节数字地址认证的区别并不仅指身份标识为公钥:
- 使用地址是因为身份信息无法上链,也就无法可信地将简短的身份唯一标识与账户公钥绑定。因此使用公钥计算得出的唯一地址作为身份标识,既方便记忆,又减少了区块链上存储此身份相关交易的数据大小,还可通过数字签名进行认证;
- 如果可将身份信息上链保存,只要在区块链上记录数字身份与某一ID系统的对应关系,则可在链上使用较短的身份ID记录此身份相关交易数据,比如角色、权限等。
本节讨论使用公钥作为数字身份上链的认证方法,主要以长安链(ChainMaker)作为研究对象。下图为长安链弱权限控制场景,因为此场景对普通用户没有准入限制,所以普通用户的认证同上一节数字地址认证完全相同,即也属于匿名公钥认证。
ChainMaker弱权限控制场景
一条链上有多个链管理员,在创世块中定义链管理员。共识节点是由共识算法和创世块中共识算法配置决定的。其他用户可以自由参与发交易,同步数据等链上活动。
数组公钥认证方法
下图为长安链强权限控制场景。
由于公钥无法承载用户或节点的组织信息以及角色信息,因此需要把这些信息存到链上,并跟节点或者用户的公钥绑定。实现此公钥绑定管理的系统合约需要组织的管理员签名,从而将该组织下的用户或节点的公钥的绑定信息存储至链上。而组织管理员是启动区块链时,默认注册到链上的。另外,共识节点的组织和角色信息,也是通过在链配置中默认注册的。
当一个用户发起交易时,需要使用自己的私钥对交易进行数字签名。此处与上一节数字地址认证中对交易进行签名的方法相似。唯一不同的是签名后交易数据中可以不含用户公钥而以用户的身份ID代替,因为共识节点可通过区块链上的用户公钥绑定信息查找到此身份ID对应的公钥,从而完成验签即用户的认证过程,继而通过链上绑定信息进行鉴权。
而节点之间也可通过相同的数字签名过程进行身份认证,以确保联盟链上的节点身份的合法性。
ChainMaker强权限控制场景
一条链由多个组织构成,每个组织下拥有一个或多个区块链节点和用户。每个组织在创世块中定义组织的管理员公钥和组织的共识节点列表。其他用户需要通过合法的交易注册身份才能成为链上的合法用户。
数字证书认证概述
数字证书与数字公钥的最大区别,就是其包含与证书持有者相关的属性。最常见的证书类型是符合X.509标准的证书,它允许在其结构中编码一些用于身份识别的信息。此外,公钥私钥对可以自己生成,证书却需要别人的签名来背书,一般把给别人签发证书的权威机构称为证书颁发机构。对于每个加入区块链网络中的节点和用户,需在加入前获得经此区块链认可的证书颁发机构颁发的数字证书。
而数字证书认证与数字公钥认证最大的不同是不需要将每个参与者的证书都上链保存,而是通过数字证书的信任链,使用保存在区块链上的上级证书进行认证。而使用证书代替数字签名中的公钥认证通过后,可以直接读取封装在数字证书中的身份信息。
封装在数字证书中的身份
区块链网络中的不同参与者包括节点、客户端应用程序、管理员等。每一个参与者(网络内部或外部能够使用服务的活动元素)在基于数字证书认证的联盟链中,都具有封装在X.509数字证书中的数字身份。这些身份确定了对资源的确切权限以及对参与者在区块链网络中拥有的信息的访问权限。
此外,证书中的数字身份还具有用于确定权限的一些其他属性,并且它为身份和关联属性的并集提供了特殊名称——主体(Principle)。主体就像userID或groupID,但更灵活一点,因为它们可以包含参与者的身份的各种属性,例如参与者的组织,组织单位,角色甚至是参与者的特定身份。当我们谈论主体时,它们是决定其链上资源权限的属性。
如概述中所述,要使身份可以被验证,它必须来自可信任的颁发机构。颁发机构是否能被信任,是由对应的联盟链定义的权威机构决定的。
对于HyperLedger Fabric,成员服务提供者(Membership Service Provider, MSP)是可以信任的权威机构,具体地说,一个MSP是Fabric中定义管理组织有效身份规则的组件。Fabric中默认的MSP实现使用X.509证书作为身份,采用传统的公钥基础结构(Public Key Infrastructure, PKI)分层模型。后面将在证书体系中对PKI相关知识进行详细的介绍。
下面举一个简单的场景来解释Fabric中身份的使用:
想像你去超市购买一些杂货。在结账时,你会看到一个标志,表明只接受支付宝和银联卡。如果你尝试使用其他付款方式(比如“VISA卡”)无论该种付款方式是否真实可行、或你的账户中是否有足够的资金,都无关紧要,它不会被接受。
拥有有效的银行卡或数字支付账户是不够的,它必须被商店接受!PKI和MSP以相同的方式协同工作,PKI提供身份列表,MSP决定哪些是参与网络的给定组织的成员。
PKI就像一个银行卡或手机支付提供商,它分配了许多不同类型的可验证身份。另一方面,MSP类似于商店接受的支持的支付方式列表,确定哪些身份是商店支付网络的可信成员(参与者)。MSP将可验证的身份转变为区块链网络的成员。
区块链用户身份标识总结
标识方法 | 标识长度 | 外部依赖 | 附加信息 | 应用实例 | 认证方式 |
---|---|---|---|---|---|
数字证书 | 大 | 依赖CA颁发数字证书 | 可在证书字段中附加组织、角色等额外信息 | 联盟链(HyperLedger Fabric,R3 Corda) | 证书中已含足够信息,使用链上存储的根证书对用户证书认证 |
公钥 | 中 | 无 | 不能附加额外信息 | 联盟链(chainMaker) | 弱权限模式下同地址标识认证; 强权限模式下组织管理员公钥存入创世块;公钥标识对应的组织、角色、权限等信息上链存储 |
地址 | 小 | 无 | 不能附加额外信息 | 联盟链(Enterprise Ethereum Alliance,FISCO BCOS) 公有链(Ethereum) | 对账户发起的交易进行数字签名,从而认证其身份;账户对应的组织、角色、权限等信息可链下存储 |
分布式数字身份(DID) | 小 | 依赖DID支撑平台 | 不能附加额外信息 |
3-3-2 联盟链网络证书体系
上一章我们介绍了联盟链身份认证方式按照身份标识分类可分为地址认证、公钥认证和证书认证,上表总结了这些认证方式的异同点。因为联盟链主要针对某一领域的合作组织,因此对外部系统的依赖反而标识主要缺陷,而认证方法的安全性和可控性成为主流联盟链的主要考虑因素。况且安全的数据传输需要依赖安全传输层协议(TLS),此协议也依赖于数字证书体系,因此大多数联盟链都支持或必须使用数字证书作为认证方式。
数字证书定义
数字证书是一种文件或电子密码,它通过使用密码学和公钥基础设施(PKI)来证明设备、服务器或用户的真实性。
数字证书身份验证可帮助组织确保只有受信任的设备和用户才能连接到他们的网络。数字证书的另一个常见用途是向Web浏览器确认网站的真实性,这也称为安全套接字协议(SSL)证书。
数字证书包含可识别信息,例如用户名、公司或部门以及设备的Internet协议(IP)地址或序列号。数字证书包含来自证书持有者的公钥副本,需要与相应的私钥匹配以验证其真实性。公钥证书由证书颁发机构(CA)颁发,证书颁发机构签署证书以验证请求设备或用户的身份。
以下是三种不同类型的公钥证书:
传输层安全(TLS/SSL)证书
TLS/SSL证书位于服务器(例如应用程序、邮件或Web服务器)上,以确保与其客户端的通信是私密和加密的。该证书为服务器向客户端发送和接收加密消息提供身份验证。TLS/SSL证书的存在由统一资源定位符(URL)或Web地址开头的超文本传输协议安全(HTTPS)名称表示
代码签名证书
代码签名证书用于确认通过Internet下载的软件或文件的真实性。开发者或发布者签署该软件以确认它对下载它的用户来说是正版的。这对于在第三方站点上提供其程序下载并需要证明文件未被篡改的软件提供商很有用
客户端证书
客户端证书是一种数字ID,用于一个用户或机器识别另一个用户,或从一台机器识别另一台机器。一个常见的例子是电子邮件,其中发件人对通信进行数字签名,其签名由收件人验证。客户端证书也可用于帮助用户访问受保护的数据库。
数字证书和数字签名
数字证书
数字证书是由认证中心颁发的包含证书持有者的身份信息、公开密钥信息等信息的一段数据凭证。
数字证书是公钥基础设施(PKI)中的一个关键元素,PKI定义了使用数字证书进行身份认证的方法。
数字证书中包含发行者对这份身份文件的数字签名,但不含发行者的公钥,而是包含持有者的公钥。
数字签名
数字签名是基于非对称密钥加密技术与数字摘要技术的应用,是一个包含电子文件信息以及签发者身份,并能够鉴别发送信息是否被篡改的一段数据。
数字签名是公钥基础设施(PKI)中的一个关键元素,数字签名方法并没有规定如何鉴别签发者的公钥,因此可以通过伪造公钥进而通过伪造签名发送虚假的信息。
可见,数字签名只能保证当前的消息是由对应的公钥相关的私钥签发的,因此如果用公钥或地址(公钥哈希值)标识数字身份,那么是没问题的。但一旦我们需要将数字身份与更多的身份信息绑定,那么通过将数字身份公钥和此身份信息通过数字证书一起发送,则可以避免伪造数字身份公钥的问题。
当联盟链由多个组织管理,每个链上成员的身份必然要求具有所属组织信息,因此使用数字证书可以安全高效地标识联盟链网络中的参与者(用户、节点等)。
此外数字证书提供了信任链模型,借助不同类型的信任模型,联盟链的授权中心可以很灵活地实现细粒度的权限管理。
什么是PKI?
公钥基础设施(PKI)是一组互联网技术,可在网络中提供安全通信。比如我们常用的HTTPS协议,其中S代表安全,这里的安全就是由PKI提供的,如果你在网页浏览器上学习这个视频,你可能正使用PKI来确保它来自一个认证过的网址。
公钥基础设施(PKI)的构成元素:PKI由向各方(例如,服务的用户,服务提供者)发布数字证书的证书授权中心组成,然后使用这些数字证书在与其交换消息的环境中对消息发布方进行身份验证。CA的证书撤销列表(CRL)构成不再有效的证书的参考。证书的撤销可能由于多种原因而发生。例如,因为与证书相关联的加密私有材料已被公开,所以证书可能被撤销。
PKI关键要素
虽然联盟链网络不仅仅是一个通信网络,但它依赖于PKI标准来确保各个网络参与者之间的安全通信,并确保在区块链上发布的消息得到适当的认证。
PKI有四个关键要素:
- 数字证书
- 公钥和私钥
- 证书授权中心
- 证书撤销列表
对应的,一个典型、完整、有效的PKI应用系统至少应该具有以下部分:
- 注册机构(RA)——负责接受用户的申请,审核用户的真实身份
- 认证中心(CA)——数字证书的签发机关,CA必须具备权威性
- 证书资料库——存储已经签发的数字证书和公钥,以及相关证书目录,便于用户获取
- 证书撤销系统——在有效期内吊销的证书列表,在线证书状态协议OCSP是获得证书状态的国际协议
- 密钥备份及恢复——为避免因用户丢失解密密钥而无法解密合法数据的情况,PKI提供备份与恢复密钥的机制。
下面对PKI的关键要素逐一详细描述。
数字证书
在概述部分我们已经对数字证书做了一个概括,对于联盟链来言,数字证书是包含与证书持有者相关的属性的文档。最常见的证书类型符合X.509标准的证书,它允许在其结构中编码一些用于身份识别的信息。
例如,浙江杭州的蚂蚁集团的蚂蚁链部门的马毅可能有一个带有SUBJECT属性为C=CN,ST=Zhejiang,L=Hangzhou,OU=Yi Ma + OU = Ant Group,CN = yi.ma@antchain.com的数字证书,如下图黄色高亮部分。马毅的证书类似于他的身份证(提供了马毅的信息),可以用来证明关于他的重要事实。最重要的是,马毅的公钥是他的证书中分发的,而他的私人签名密钥则不是。此签名密钥必须保密。
马毅的所有属性都可以使用称为密码学的数学技术进行记录,这样篡改将使证书无效。只要对方信任证书颁发者,即证书授权中心(CA),密码学就允许马毅将证书提交给其他人以证明其身份。只要CA安全地保存某些加密信息(CA的私钥),任何阅读证书的人都可以确定有关马毅的信息没有被篡改,它将始终具有马毅的特定属性。将马毅的X.509证书视为无法改变的数字身份证。
公钥、私钥和数字签名
身份验证和消息完整性是安全通信中的重要概念。身份验证要求确保交换消息的各方创建特定消息的身份。对于具有“完整性”的消息意味着在其传输期间不能被修改。例如,你可能希望确保与真正的马毅而不是模仿者进行沟通。或者,如果马毅向你发送了一条消息,你可能希望确保其在传输过程中没有被其他任何人篡改过。
传统的身份验证机制依赖于数字签名,顾名思义,它允许一方对其消息进行数字签名。数字签名还可以保证签名消息的完整性。
从技术上讲,数字签名机制要求签名方保存两个加密连接的密钥:广泛可用的以充当授权锚的公钥,以及用于在消息上产生数字签名的私钥。数字签名消息的接收者可以通过检查附加签名在预期发送者的公钥下是否有效来验证接收消息的来源和完整性。
私钥和公钥的唯一关系是保证安全通信的保证。密钥之间唯一的数学关系使得私钥在消息上的签名,只有对应公钥在相同的消息上才可以与之匹配。
在下面示例中,马毅使用他的私钥对邮件进行签名。任何使用他的公钥查看签名消息的人都可以验证签名。
证书授权中心
联盟链上的人员或节点能够通过由系统信任的机构为其发布的数字身份参与联盟链网络。在最常见的情况下,数字身份(或简称身份)的形式为,符合X.509标准并由证书授权中心(CA)颁发的经过加密验证的数字证书。
CA是互联网安全协议的常见部分,你可能已经听说过一些比较流行的CA:Symantec(最初是Verisign),GeoTrust,DigCert,GoDaddy和Comodo等。
证书授权中心向不同的参与者颁发证书。这些证书由CA进行签名,并将参与者的公钥绑定在一起(并且可选是否具有全部属性列表)。因此,如果一个成员信任CA(并且知道其公钥),则可以信任与参与者绑定的证书中包含的公钥,并且通过验证参与者证书上的CA签名来获取所包含的属性。
证书可以广泛传播,因为它们既不包括参与者也不包括CA的私钥。因此,它们可以用作信任的锚,用于验证来自不同参与者的消息。
CA也有一个证书,它们可以广泛使用。这就可以让给定CA获取身份证书的消费者验证自己的身份,因为只有对应的私钥才可以生成该证书。
在区块链设置中,希望与网络交互的每个参与者都需要一个身份。在此设置中,你可能会说使用一个或多个CA从数字角度定义了组织的成员。CA是为组织的参与者提供可验证的数字身份的基础。
根CA,中间CA和信任链
CA有两种形式:根CA和中间CA。因为根CA(Symantec,GeoTrust等)必须安全地向互联网用户颁发数亿个证书,所以将这个过程分散到所谓的中间CA中是很有用的。这些中间CA具有由根CA或其他中间CA颁发的证书,允许为链中的任何CA颁发的任何证书建立“信任链”。追溯到根CA的能力不仅让CA的功能在仍然提供安全性的同时进行扩展(允许使用证书的组织充满信心地使用中间CA),还限制了根CA的暴露,如果根CA受到损害,将会危及整个信任链。另一方面,如果中间CA受到损害,则曝光量会小得多。
只要每个中间CA的证书的颁发CA是根CA本身或具有对根CA的信任链,就在根CA和一组中间CA之间建立信任链。
中间CA在跨多个组织颁发证书时提供了巨大的灵活性,这在联盟链系统(如Fabric)中非常有用。例如,你将看到不同的组织可能使用不同的根CA,或者使用具有不同中间CA的相同根CA,这取决于网络的需求。
信任链中的证书的结构
上图中的信任链中的每个证书的结构是怎样的呢,信任是如何传递下去的?
如果要验证绿色成员的终端实体证书,那么发现其签发者名称为ICA3,通过某种方式找到此中间CA证书,如果当前验证者信任ICA3的证书,则提取ICA3公钥就可验证绿色成员的终端证书;
如果不信任ICA3的证书,则可发现其签发者名称为ICA2,通过某种方式找到此中间CA证书,如果当前验证者信任ICA2的证书,则提取ICA2公钥就可验证ICA3的证书,从而信任ICA3证书,然后通过上一步步骤验证绿色成员的终端证书;
如果不信任ICA2的证书……
所以验证者至少要信任此信任链中的某一级CA证书,则可以完成绿色成员终端证书的验证。
证书撤销列表
证书撤销列表(Certificate Revocation List, CRL)很容易理解,它是CA知道由于某些原因而被撤销的证书的引用列表。
当第三方想要验证另一方的身份时,它首先检查颁发CA的CRL以确保证书尚未被撤销。验证者不是必须要检查CRL,但如果不检查,则他们冒着接受无效身份的风险。
使用CRL检查证书是否仍然有效。如果模仿者试图将无效的数字证书传递给验证者,则可以首先检查颁发证书的CA的CRL,以确保其未被列为无效。
注意,被撤销的证书与证书过期非常不同。撤销的证书尚未过期,如果不做CRL检查,它们是完全有效的证书。
Fabric证书签发认证机制概述
HyperLedger Fabric是最著名的开源通用模块化联盟链平台。下面我们用Fabric的证书签发认证机制作为例子,描述一个PKI系统是如何工作的。
Fabric提供了一个内置的CA组件,允许在你的区块链网络中创建CA。此组件称为Fabric CA,是一个私有CA提供者实现,能够管理具有X.509证书形式的Fabric参与者的数字身份。由于Fabric CA是针对Fabric的CA需求的自定义CA实现,因此它无法为浏览器提供SSL证书。但是,由于Fabric必须使用某种CA实现用于管理身份(即使在测试环境中),因此可以使用Fabric CA来提供和管理证书。
因为Fabric不是由公有链发展而来,因此其中有很多专有的名称或单一,下面的描述会尽力使用之前通用的名称对其标注。如下图中的Peer是Fabric对同步节点或称见证节点的称呼。他们存储了账本和智能合约,并负责验证交易和同步账本。而下文中的Fabric排序节点也相当于之前提到的共识节点。
Fabric成员服务提供者(MSP)
在数字证书身份认证章节中,我们提到因为联盟链是一个认证性的网络,使用区块链参与者需要一种向网络中的其他参与者证实自己身份的机制从而在网络中进行交易。上一节展示了公钥基础结构如何通过信任链提供可认证的身份信息。那么区块链网络是怎么应用信任链的?
证书机构通过生成可以用来证实身份的由公钥和私钥形成的键值对来发放认证信息。因为一个私钥永远不会被公开,所以引入了一种可以证实身份的机制即MSP。例如,一个peer节点用它的私钥进行数字签名或背书交易。接着排序节点(共识节点)包含的该peer节点的公钥会被用来验证交易携带的签名是否合法。私钥被用作生成交易信息上的,只与私钥相对应的且作为MSP一部分的公钥可以匹配的签名。因此,MSP是一个可让身份被信任和被网络中其他参与者公认的,而不需要暴露成员的私钥的机制。
回想一下上一章提到的身份认证相关的手机或信用卡支付场景,证书颁发机构就像一个手机或信用卡支付提供商,它分发许多不同类型的可验证的身份。另一方面,MSP确定商店接受哪些提供商。通过这种方式,MSP将一个身份(支付账户)转换为一个角色(在商店购买东西的能力)。
这种将可验证身份转换为角色的能力是Fabric网络功能的基础,因为他给予组织、节点和通道(不同区块链账本)建立MSP的能力,使其确定谁可以在组织、节点和通道层次上运作。
证书签发认证流程
Fabric联盟链的证书签发认证流程包含以下步骤
- 拥有一个由网络信任的CA颁发的身份
- 将成员的证书添加到组织的MSP中
- 将MSP添加到网络上的一个联盟或者通道
- 确保MSP包括在网络中的策略定义
拥有一个由网络信任的CA颁发的身份
因为联盟链网络并不是公共网络,所以联盟链网络信任的CA并不需要为互联网的根CA(Symantec,Geotrust等)。联盟中的组织可以单独建立自己信任的根CA,也可以为一个联盟建立一个可信的根CA。
如本节概述中所述,我们可以用组织已有的CA/RA去为Fabric联盟链上的成员颁发电子证书,也可以使用Fabric CA去完成此部分的工作。Fabric还提供了一个脚本工具,“cryptogen”帮助创建自签名的根证书和为主要成员(节点、组织管理员等)签发电子证书,但此工具只用于测试网络,所以这里不做赘述。下面主要介绍使用Fabric CA签发身份。
Fabric CA在区块链网络上执行以下功能:
- 身份注册,或连接到轻量级目录访问协议(LDAP)作为用户注册表。
- 颁发注册证书。注册是Fabric CA颁发证书密钥对的过程,由签名证书和形成身份的私钥组成。Fabric CA客户端首先在本地生成私钥和公钥,然后将公钥发送到CA,CA返回一个编码证书,即签名证书。
- 证书更新和撤销
可以看出Fabric CA不仅仅实现了PKI中认证中心(CA)的功能,还实现了注册机构(RA)、证书资料库、证书撤销系统和私钥存储的功能。其中RA功能自动完成主要是通过用户注册表实现的,其可以配置为使用数据库作为用户注册表,也可以配置为从轻量级目录访问协议(LDAP)服务器读取。此外,Fabric CA也可配置为通过PKCS11 API将私钥存储在HSM(硬件安全模块)中,从而实现密钥备份及恢复功能。因此Fabric CA就是一个Fabric中的PKI系统完整实现。
将成员的证书添加到组织的MSP中
实际上成员服务提供者并不提供任何东西。相反,MSP的实现是一组添加到网络配置中的文件夹,用以定义一个组织。证书颁发机构生成了代表身份的证书,但此证书需要添加到对应组织的MSP中,因为MSP包含一个被允许的身份的列表。
- MSP通过列出其成员的身份,或通过确定哪些是为其成员授权颁发有效身份的CA,来识别和确定接受来自这些根CA和中间CA所定义的信任域的成员。
- MSP的能力不仅仅是简单地列出谁是一个网络参与者或一个通道的成员。MSP通过标识参与者在节点或通道上拥有的特定特权,将身份转换为角色。Fabric中的角色包括管理员(admin)、peer节点(peer)、客户端(client)、排序节点(orderer)4种。
- MSP还可以识别被撤销的身份列表。通过附加的Revoked Certificates文件夹,里面存储着撤销证书的Subject Key Identifier(SKI)和Authority Access Identifier(AKI)。
在区块链网络中,MSP出现在两个位置:
- 在参与者节点本地(本地MSP)
- 在通道(账本)配置中(通道MSP)
本地MSP和通道MSP之间的关键区别不在于它们如何运作——它们都将身份转化为角色——而是它们的范围。每个MSP列出特定管理级别上的角色和权限。
- 本地MSP是为客户端和节点(peer节点和排序节点)定义的,每个节点都必须定义一个本地MSP。
- 通道MSP在通道层面上定义了管理权和参与权。通道MSP识别谁在通道层次拥有权限。每个参与通道的组织都必须为其定义一个MSP。系统通道MSP包括参与排序服务的所有组织的MSP。
综上所述,一个MSP是一个组织按照Fabric规定好的目录层级放置不同目的(成员认证或TLS传输)的根证书和中间证书的结构。
将MSP添加到网络上的一个联盟或者通道
由于通道MSP对通道内的所有节点都可用,它们在通道配置中逻辑上仅定义一次。然而,通道MSP也在通道中的每个节点的文件系统上实例化,并通过共识保持同步。因此,尽管每个节点的本地文件系统上都有每个通道MSP的副本,但从逻辑上讲,通道MSP存在并被维护于通道或网络上。下图是一个通道上保存MSP列表。
同理,对于Fabric上的联盟(所有参与Peer和排序节点的组织),他们的MSP需要添加到系统通道的联盟MSP列表和排序组织MSP列表中。
对于本地MSP的部署可见下图。peer节点和排序节点的MSP是本地化的,而一个通道(包括网络配置通道,又称为系统通道)的MSP是全局化的,被该通道的所有参与者共用。在该图中,网络系统通过由ORG1管理,而另一个应用程序通道可以由ORG1和ORG2管理。peer节点是ORG2的成员并由ORG2管理,而ORG1则管理图中的排序节点。ORG1信任来自RCA1颁发的身份,而ORG2信任来自RCA2颁布的身份。需要注意的是,这些管理身份标识,反映了谁可以管理这些组件。所以当ORG1管理网络时(因为ORG1管理了网络配置通道,包括共识配置等),网络定义中确实存在ORG2的MSP,所以经ORG2 peer背书的交易可被ORG1的排序节点验证。
确保MSP包括在网络中的策略定义
策略是使Fabric不同于其他区块链系统(比如以太坊或者比特币)的内容之一。在其他系统中,交易可以在网络中的任意节点生成和验证。治理网络的策略可以在任何时间及时修复,并且只可以使用和治理代码相同的方式进行变更。因为Fabric是授权区块链,用户由底层基础设施识别,所以用户可以在启动前决定网络的治理方式,以及改变正在运行的网络的治理方式。
策略决定了哪些组织可以访问或者更新Fabric网络,并且提供了强制执行这些决策的机制。策略包含了有权访问给定资源的组织列表,比如一个用户或者系统链码。他们同样指定了需要多少组织同意更新资源的提案,比如通道或者智能合约。一旦策略被写入,他们就会评估交易和提案中的签名,并验证签名是否满足网络治理规则。
在Fabric中,策略中明确的签名使用Signature语法,隐含的签名使用ImplicitMeta语法。其中签名(Signature)策略定义了要满足策略就必须签名的特定用户类型,比如Org1.Peer OR Org2.Peer。这里的用户类型就是之前提到的Fabric中的4种角色Admin,Peer,Client和Orderer。
下图中为组织Org1定义的签名策略。
3-3-3 联盟链网络加密通道
联盟链网络安全介绍
联盟链是多个组织共同管理的区块链,对数据的安全性有更高的要求。
除了子网隔离、隐私数据、访问控制、账本加密等方式,网络成员间通讯需满足机密性、身份认证和数据完整性并需防止通信被窃听和篡改。
传输层安全协议(Transport Layer Security,TLS)是目前主流联盟链一致使用的通讯加密协议。
TLS是一种旨在提供计算机网络上的安全通信的加密协议。TLS建立在网景(Netscape)开发的安全套接字层(Secure Socket Layer,SSL)规范基础之上;SSL从网景移交到国际互联网工程任务组(Internet Engineering Task Force,IETF)后,IETF将其更名为TLS。
TLS作为安全通信的协议,以安全与性能为设计核心,能够有效解决下列主要完全通信威胁:
- 消息窃听
- 消息篡改
- 中间人攻击
- 密钥窃听
加密通道面临的威胁及解决方案
消息窃听解决方案
对消息加密用以保存消息的机密性
使用加密速度较快的对称加密算法来实施加密
消息篡改解决方案
背景概念
消息常常具有一些固定的格式,一些场景下可以无需破解原文,直接对密文中的某些字段进行修改来施加攻击
方案
通信双方对消息的内容完整性进行验证,以防消息被篡改。
在消息末尾添加消息认证码(Message Authentication Code,MAC)。
将机密性和消息完整性解决方案组合在一起,构成认证加密(Authenticated Encryption,AE)技术。
中间人攻击
背景概念
指主动攻击者混入发送者和接收者的中间,对发送者伪造成接收者,对接收者伪造成发送者的攻击方式。
方案
在消息报文上签名。该做法在数字领域即为数字签名:即发送方通过私钥对消息进行加密,而接收方通过对应公钥进行解密。现实中常用的签名算法有:RSA,DSA,ECDSA等。
信任锚点(Trust Anchor):颁发根证书的机构,称作信任锚点。
- 使用数字签名需确保签名的公钥属于真正的发送者,因此需要一个权威机构在签名上盖章以作证明,即背书。该做法在数字领域被称为公钥证书。
- 服务器的证书由中间证书来背书,中间权威机构由根证书来背书,此类认证链接关系称为信任链。颁发根证书的机构即为信任锚点。
如何在不存在权威机构的情况下防止密钥交换窃听
Diffe_Hellman(迪菲-赫尔曼)算法,也叫DH算法,是一种密钥交换技术的算法协议。
DH密钥交换技术的目的在于使双方在不泄露密钥的情况下协商出一个密钥来方便之后的数据加解密。
DH密钥交换技术是一种建立密钥的方法,而非加密方法,实际使用中必须和其他加密算法结合使用。
DH密钥交换算法的有效性依赖于计算离散对数( mod q)的难度。其使用过程如下例:
前提:小王和小李都知道密钥交换过程中需要用到的素数q和q的一个原根p,这两个值可以由发起通信的那一方选择并发送给通信的另一方。
小王选择自己私钥Sa,计算出自己的公钥, mod q,然后把传给小李;
小李选择自己私钥Sb,计算出自己的公钥, mod q,然后把传给小王;
小王根据小李的公钥,自己的私钥、p和q计算出对称加密的加密密钥, mod q = mod q;
小李根据小王的公钥,自己的私钥、p和q计算出对称加密的加密密钥, mod q = mod q;
最终,小王和小李得到了用于对称加密的加密密钥K。而窃听者虽然得到了p,q,和但无法计算出K。
TLS与安全通信解决方案
TLS中最常用的密码套件(Cipher Suite)如下图:
TLS协议是算法套件及模式的应用,用于解决前述威胁并提供解决方案
TLS协议层级架构概述
TLS协议位于传输层协议和应用层协议之间
TLS交互信息有时序要求,依靠下层协议提供时序服务,因此TLS不能使用UDP来传输。
TLS协议内部基于分层架构,分为两层:
- 下层记录层协议,主要负责验证、分片/重组、加密/解密的任务;
- 上层在TLS1.2包含4种子协议:握手协议(Handshake Protocol)、警报协议
TLS1.2握手协议
TLS连接以握手开始。如果客户端此前并未与服务器建立会话,双方执行一次完整的握手流程来协商TLS会话。
握手过程中,客户端和服务器将进行以下四个主要步骤:
- 交换各自支持的功能,对需要的连接参数达成一致
- 验证出示的证书,或使用其他方式进行身份验证
- 对将用于保护会话的共享主密钥达成一致
- 验证握手消息并未被第三方团体修改
如下图,TLS1.2的建立过程总共有13个包,第一次建立至少需要9个包。
第一阶段:建立安全功能
客户端首先发送ClientHello消息到服务端,其中包含
- 可用TLS版本
- 客户端随机数
- 会话ID,如果是新的会话则为空
- 可用密码套件
- 支持的压缩方法
- 扩展块由任意数量的扩展组成,其会携带额外数据
服务端接受ClientHello消息后,发送ServerHello消息回应,其中包括
- 可用TLS版本
- 服务器随机数
- 服务器生成的会话ID,如果客户端发送之前的会话ID,可重用缓存而无需完全握手
- 可用密码套件
- 支持的压缩方法
- 扩展块
第二阶段:服务器认证和密钥交换
服务器向客户端发送消息,该阶段分为四步:
- 证书(可选):服务器将数字证书和到根CA的整个证书链发给客户端,使客户端能认证服务器。一般情况下,除了会话恢复时不需要发送该消息,在TLS握手的全流程中,都需要包含该消息。除匿名Diffe-Hellman(DH)方法外,其他密钥交换方法均需要证书消息。
- 服务器密钥交换(可选):根据之前在ClientHello消息中包含的密码套件信息,决定了密钥交换方式(例如RSA或者DH)。如果服务器发送了带有固定DH参数的证书或使用RSA密钥交换则不需要此消息。
- 证书请求(可选):服务端可能会要求客户自身进行验证,即可以是单向的身份认证,也可以双向认证。该消息中包含服务器端支持的证书类型(RSA、DSA、ECDSA等)和服务器端所信任的所有证书发行机构的CA列表,客户端会用这些信息来筛选证书。
- 服务器握手完成:第二阶段的结束,第三阶段开始的信号,接下来等待客户端的消息。
第三阶段:客户端认证和密钥交换
客户端向服务器发送消息,该阶段分为3步:
- 证书(可选):如果在第二阶段服务器要求发送客户端证书,客户端便会在该阶段发送证书。服务器端在之前发送的CertificateRequest消息中包含了服务器端所支持的证书类型和CA列表,因此客户端会在本地证书中选择满足这两个条件的第一个证书发送过去。若客户端没有证书,则发送一个no_certificate警告。
- 客户端密钥交换:此消息的内容依赖于密钥交换的类型:
- RSA客户端生成48字节的次密钥,并使用服务器证书中的公钥或服务器密钥交换消息中的临时RSA密钥加密。它被用于后续的主密钥计算。
- 匿名Diffe-Hellman,发送客户端Diffe-Hellman公钥参数。
- 固定Diffe-Hellman此消息内容为空
- 证书验证(可选):提供对客户端证书的精确认证。此消息只有客户端具有签名能力时发送。其目的都是为了使用私钥验证客户证书的客户所有权。
第四阶段:完成握手协议建立TLS连接
该阶段主要由4个步骤组成:
- 客户端编码改变通知:客户端发送一条消息,通知服务器更改为加密模式。
- 客户端握手结束通知:客户端通知服务器已准备好开始安全数据通信。
- 服务器编码改变通知:服务器发送一条消息通知客户端更改为加密模式。
- 服务器握手结束通知:服务器通知客户端它已准备好开始安全数据通信。SSL握手到此结束。
握手协议中客户端先发ClientHello给服务器,而后服务器发送ServerHello等消息给客户端,第三步客户端发送,第四步服务器发送结束消息握手。因此称为四步握手。
加密通道建立完成后,开始进行加密数据传输。客户端和服务器使用对称加密算法和ClientHello和ServerHello期间协商的密码散列函数进行通信,并使用客户端在Client Key Exchange发送给服务器的密钥。此时可以重新协商握手。
关闭消息:连接结束时,每一方都会发送一个close_notify警报,通知对端连接已关闭。
TLS记录协议
记录层位于TLS内部下层
记录协议接收一个要传送的应用消息,将段分为块,压缩(可选)、加上MAC、加密、添加TLS头,将得到的最终数据单元放入一个TCP段中
记录协议接收的数据被解密、验证、解压、重组后,再传递给高层。
- 加密/解密:将压缩消息和MAC用对称加密方法加密。加密内容增加长度不能超过1024字节,以便整个长度不能超过2^14+2048;
- 分片/重组:这里的分片不是由下层协议的帧长度限制的,而是因为解密方需要收完整个record,才能解密。长度过长会导致解密方需要等待更多的RTT,增大延迟,破坏用户体验,因此TLS协议规定length必须小于2^14字节;
- 认证/验证:包括报文时序是否满足协议规定、MAC消息认证码是否正确、填充是否正确等内容。
TLS1.3概述
TLS1.2于2008年发布,大多数联盟链都基于TLS1.2建立加密通道
TLS1.3于2018年发布,目前主流联盟链都可以支持。例如HyperLedger Fabric从v2.2版本以后支持TLS1.3协议。
TLS1.3的核心原则是简化:
- 除一种带有内置参数的DH密钥交换算法之外的所有密钥交换算法都被删除。
- 除了提高安全性之外,减少的参数集合简化的握手也有助于提高整体性能。
- 放弃了向后兼容性,性能、隐私和安全性有了显著提高。
- 升级到TLS1.3时需要考虑兼容性风险主要包括:
- TLS1.3支持的密码套件与TLS1.2及更早版本不同。如果应用程序对不再支持的密码套件进行硬编码,则它可能无法在不修改其地面的情况下使用TLS1.3,例如TLS_AES_128_GCM_SHA256(1.3及更高版本)与TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA(1.2及更早版本)。
- TLS1.3会话恢复和密钥更新行为与TLS1.2和更早版本不同。如果应用程序依赖于TLS协议的握手细节,则可能存在风险。
TLS1.3握手协议身份验证
TLS1.3由三个阶段组成:密钥交换、服务器参数和身份验证。
密钥交换
- 客户端向服务器发送ClientHello消息。
- 服务器处理ClientHello消息并确定连接的加密参数。然后它以自己的ServerHello消息确定密钥和密码选项。
服务器参数:服务器发送两条消息建立服务器参数
- EncryptedExtensions:此消息包含加密扩展信息,这些信息包括不涉及特定于单个证书的那些加密参数。
- CertificateRequest(可选):如果需要基于证书的客户端身份验证,则服务器发送此消息,其中包含该证书所需的参数。如果不需要客户端身份验证,则省略此消息。
身份验证
- 服务器发送这些身份验证消息:
- 证书(可选):此消息包含认证证书和证书链中的任何其他支持证书。如果服务器未使用证书进行身份验证,则省略此消息。
- CertificateVerify(可选):此消息包含在整个握手过程中使用与证书消息中的公钥对应的私钥的签名。如果服务器未使用证书进行身份验证。则省略此消息。
- 完成:整个握手过程中的MAC(消息验证码)。
客户端使用自己的Certificate、CertificateVerify和Finished消息进行响应。如果服务器没有发送CertificateRequest消息,则省略Certificate消息。如果客户端未使用证书进行身份验证,则省略CertificateVerify消息。
TLS1.3使用预共享密钥恢复会话
预共享密钥(PSK)是在需要使用之前使用某个安全通道在两方之间共享的共享密钥。
在一次TLS握手期间建立PSK,然后在另一次握手中使用它建立新连接;称为使用PSK恢复会话。
PSK对应于初始握手派生的唯一密钥。如果服务器在建立新连接时接受PSK,则此连接的安全上下文以加密方式绑定到原始连接,并且从初始握手派生的密钥用于引导加密状态,而不是完整的TLS握手。下图显示了第一次握手建立PSK:
- 客户端向服务器发送带有key_share扩展的ClientHello消息。此扩展列出了客户端支持的密钥交换加密方法。
- 服务器以带有key_share扩展名的ServerHello消息进行响应。此扩展包含要用于密钥交换的加密方法。
- 服务器将其服务器参数发送给客户端。
- 服务器和客户端都交换身份验证消息。
- 服务器向客户端发送一条NewSessionTicket消息,其中包含一个PSK,然后客户端可以通过将其包含在其ClientHello消息中的pre_share_key扩展中来将其用于未来的握手。
- 客户端和服务器交换加密的应用程序数据。
第二次握手如何使用PSK如下图所示:
- 在后续握手中,客户端向服务器发送带有key_share和pre_shared_key扩展的ClientHello消息。pre_shared_key扩展包含在NewTicketSession消息中发送的PSK。
- 服务器响应带有pre_shared_key和key_share扩展的ServerHello消息。pre_shared_key扩展包含服务器同意使用的PSK。
- 服务器将其参数发送给客户端。
- 服务器和客户端相互发送完成消息。他们不执行身份验证,因为此连接的安全上下文以加密方式与原始连接相关联。
- 客户端和服务器现在可以交换加密的应用程序数据。
使用PSK可极大地减少握手的消息发送量,提高性能。
OpenSSL概述
OpenSSL项目开发和维护OpenSSL软件。项目的技术决策由OpenSSL技术委员会(OTC)管理,项目治理由OpenSSL管理委员会(OMC)管理。OpenSSL是在Apache风格的许可下获得许可的,这基本上意味着您可以根据一些简单的许可条件自由获取和使用它用于商业和非商业目的。
OpenSSL是一个功能丰富且自包含的开源安全工具箱。它提供的主要功能有:SSL协议实现(包括SSLv2、SSLv3和TLSv1)、大量软算法(对称/非对称/摘要)、大数运算、非对称算法密钥生成、ASN.1编解码库、证书请求(PKCS10)编解码、数字证书编解码、CRL编解码、OCSP协议、数字证书验证、PKCS7标准实现和PKCS12个人数字证书格式实现等功能。
OpenSSL采用C语言作为开发语言,这使得它具有优秀的跨平台性能。OpenSSL支持Linux、Unix、Windows、Mac等平台。
目前OpenSSL最新的稳定版本是支持到2026年9月7日的3.0系列。这也是长期支持(LTS)版本。之前的LTS版本(1.1.1系列)也可用,并且支持到2023年9月11日。所有旧版本(包括1.1.0、1.0.2、1.0.0和0.9.8)现在都不再支持,应该不被使用。
连接到TLS服务器
OpenSSL附带一个客户端工具s_client,可用于连接到安全服务器。类似于Telnet或netcat,s_client负责处理加密方面的工作,其他的工作则由用户完全控制。
- 首先连接到服务器,需要提供主机名和端口。例如:
- 输入命令后,将看到大量诊断输出:
- 前几行显示有关服务器证书的信息
- 下一部分按交付顺序列出了服务器提供的所有证书,对于每个证书,第一行显示主题,第二行显示颁发者信息:
- 输出中的下一项是服务器证书内容;简洁起见,这里删除其中大部分内容:
- 再往下是关于TLS连接的大量信息:
证书验证
能够连接到TLS服务器,并不意味着该服务配置正确,即使该服务器支持所有正确的协议和密码套件。配置的证书与正确的DNS名称匹配同样重要。
上一节示例中,验证状态码(显示在倒数第二行)为20(无法获取本地颁发者证书),这意味着未正确配置受信任的根证书。
可以使用-CApath开关指向正确的保留所有根证书的目录位置;
如果此根证书(当前为digicert签发)不在OpenSSL的根证书目录下,可以使用-CAfile开关指定此根证书在本地的位置,如:
即使获得了成功的状态码,也并不意味着证书配置正确。这是因为s_client工具不会检查给定主机名的证书是否正确,必须手动执行此操作并告诉它使用哪个主机名:
如果不匹配,您可能会看到状态码62:
其他TLS验证相关的OpenSSL工具
OpenSSL还包含其他30多个命令工具,下面简单介绍一下与验证TSL相关的一些工具:
- sess_id:SSL/TSL协议的会话处理工具
对于使用s_client配合-sess_out导出的连接状态记录文件,可以使用此命令读取。
- x509:一个多用途的证书工具。它可以显示证书信息、转换证书格式、签名证书请求以及改变证书的信任设置等。
因为TLS协议中会使用证书进行身份认证,因此很多验证工作都要使用此工具。
- ocsp:在线证书状态工具
如需提交在线证书状态协议(OCSP)请求以检查OCSP程序响应状态,可以使用此工具。
- crl:用于处理PME或DER格式的证书撤销列表(CRL)文件。
此工具可用来将CRL转换为可读的格式。
如果没有TLS服务器,想通过OpenSSL简单建立一个测试环境,则还会用到下面的工具:
- req:用于生成和处理PKCS10证书请求。
- ca:此工具是一个小型CA系统。它能签发证书请求和生成CRL。它维护一个已签发证书状态的文本数据库。
- s_server:此工具是OpenSSL提供的一个SSL服务程序。使用此程序前,需要生成各种证书。
3-4 蚂蚁链分布式网络
3-4-1 蚂蚁链P2P优化网络
蚂蚁链P2P网络系统
在蚂蚁链中,节点主要分成共识节点和非共识节点。为了提高网络通信效率,共识节点之间主要采用了全互联(Full Mesh)模式;而非共识节点不参与共识过程,对通信的实时性要求不高,网络结构上采用了部分连接(Partial Mesh)模式
- CA认证
- 基于CA签发证书完成节点身份识别和认证
- 读写区分
- 支持非共识节点和共识节点,兼容读写分离模式
- 流量控制
- 能够控制网络流量负载和消息报文大小,支持数据压缩
- 黑白名单
- 能够配置黑白名单,有效控制节点连接数量
- 多接入点
- 支持单节点多接入点能力,兼容内网和公网地址
蚂蚁链P2P网络系统新增节点
蚂蚁链P2P网络系统节点接入网络
基于区块链平台的SDK可以实现高效的网络链路接入和会话管理能力,基于证书的TLS链路保证链路数据的传输安全性
- 证书体系
- 支持CA证书体系,完成身份识别、有效期校验和吊销列表能力,支持多种校验方式
- 多接入方式
- 支持TCP、TLS、 HTTP、HTTPS的网络链路接入方式
- 浏览器支持
- 支持浏览器JavaScript的访问,兼容浏览器会话管理机制
- 流量控制
- 可以有效控制网络流量负载,支持数据压缩降低资源负载
- 黑白名单
- 支持节点个性化配置允许接入的黑白名单列表,安全控制网络链路
- 多协议支持
- 支持JSON文本协议和RLP的紧凑二进制编码协议
蚂蚁链P2P网络系统节点管理特性
节点管理
利用链上管理合约来管理加入联盟的节点
链上管理员发起节点管理操作,经过联盟链所有节点的共识达成一致,来完成对节点联盟资格的管理
节点发现
联盟链的所有节点信息记录到链上合约状态中,一个新节点接入联盟链后,所有节点都可以通过关注合约事件感知到节点变化,从而可以获取到新的节点信息,主动发起到新节点的P2P连接。
节点高可用
- 支持多地址
- myChain节点可以有多个网络地址,可以同时添加内网地址和外网地址,这样方便同一个局域网的区块链节点走内网连接。
- 支持域名
- myChain节点的网络信息可以包含一个域名,这样节点部署后,支持任意迁移并使用新的IP地址,只要更新域名对应的IP地址即可。在云上机器部署时,这是一个非常有用的特性,因为云上迁移更加常见。
蚂蚁链P2P网络系统网络特性
网络分层
联盟链节点支持共识节点和非共识节点多种角色划分,共识节点负责进行交易共识、交易打包;非共识节点同步交易结果但不参与共识过程,这样可以减少共识节点规模降低共识过程复杂度。共识节点之间进行高性能、低时延通信,保障交易和共识的实时性;非共识节点利用自身的服务能力,可以让整个链服务更多DApp,实现了交易数据读写分离,整个P2P网络也实现了实时通信和流量通信的网络分层。
弹性组网
myChain的P2P网络支持不同规模的节点灵活组网,是一种自适应的网络拓扑管理能力。在几个节点时,可能会构建成全连接(full-mesh)网络拓扑结构;在几千个节点时,可以构建成去中心化的网络结构,采用去中心化全局树状路由表,实现高效的数据传输。myChain P2P网络在节点规模变化时,不需要任何外部干预,可以自适应地维护网络结构,实现了一个弹性的组网能力。
蚂蚁链P2P网络系统安全特性
身份认证
- 节点身份认证
- 加入联盟链的所有节点都是经过授权的,为了更好地管理网络接入,myChain的通信节点都会被颁发一个SSL证书
- 在联盟链的应用场景中,一般采用自建CA的方式,联盟链管理方会持有这个联盟链的CA权限
- 节点的接入证书由联盟管理方负责签发
- 应用层握手验签
- 每个区块链节点都有自己的一对公私钥,它标识了这个节点的身份
- 两个节点完成P2P连接之后,第一个应用消息就是握手验签,即节点对一个特定信息利用自身的私钥进行签名,通过握手消息发送给P2P的对端节点;对端节点在收到这个握手消息后,取来源节点的公钥进行验签,这样即可以判断消息来源节点是否持有这个公钥身份。P2P的两个节点都做这样的操作过程,即可以互相验证对方链上的身份。
- 加密通信
- TLS加密通信
- P2P通信的节点之间进行连接时,采用了TLS连接
- TLS连接保障了通信两端节点之间的数据不会被链路上的第三方获取到。
- 黑名单机制
- myChain支持利用SSL证书吊销机制实现网络层黑名单管理,这样可以防止离开联盟的节点,可以任意连接链上节点,减少节点利用历史证书进行网络攻击的机会,降低网络安全风险
- TLS加密通信
网络治理
参数治理
动态组网
需求背景
某些联盟参与方希望以较小的成本参与多个业务
某些联盟参与方希望只加入关心的业务,无需同步所有业务的数据
参与方在不同业务中担任不同身份,如非共识节点,只对数据同步
使用Fabric Channel的部分业务希望MyChain有对应的能力,方便业务迁移
功能特性
灵活组网:根据业务需求的不同可以灵活组建小范围的拓扑子网,允许云上、私有化混合组网的部署形态
独立的治理能力:子网具有独立的共识机制、账户体系
物理隔离:独立的数据存储,子网DB的访问也是隔离的
多维度动态组网
大规模节点P2P
3-4-2 BTN网络
区块链规模化发展的需求
区块链与应用融合发展的需求
链上链下数据协同,区块链与应用融合,是区块链技术发展的重要方向。
- 物联网领域
结合区块链、安全计算等技术,将物联网设备可信上链,解决终端身份确认与数据确权问题,打造分布式智能物联网;
- 边缘计算能力
边缘内容分发网络、分布式算力网络等,结合区块链实现贡献(内容、资源)量认定,可信计费等
- 人工智能领域
结合区块链在数据层提供可信数据,人工智能负责自动化的业务处理和智能化的决策,实现区块链的自动化、自治化和智能化
区块链互联互通的需求
随着区块链应用的扩展,链与链之间数据通信的需求越来越多,需要建立通用的网络基础设施和通信协议,去支持灵活、安全的链间通信
- 通信通道
网络通信的底层基础就是通信链路,当前主要是通过互联网完成连接。而链间通信,除了互联网链路还需要一个安全可信的逻辑通道。这个逻辑通道包含两个层面,一个是链间消息中继通道,另一个是链间通信协议
- 链及节点网络路由
灵活的链间通信,需要对分布式身份进行统一标识,以支持对链和节点的动态寻址
区块链网络面临的挑战
随着区块链应用的推广,越来越多的商业流程在区块链上发生,参与方越来越多链上节点的规模越来越大业务流程长,涉及环节多,链上参与节点数量大、分布广存在性能、稳定性等诸多技术挑战
网络通信性能挑战
在区块链网络通信中,通常每一个节点都需要把自己的消息发送给全链的其他所有节点,即应用层消息广播。随着节点规模变大,一个节点无法和其他所有节点建立直连,只能连接网络中的一部分节点;所以,一个节点的消息必须通过其他节点进行中继转发,随着中继次数增加,通信延迟也会逐渐增加,节点规模越大通信性能越低。P2P模式下,区块链的扩展性和性能无法兼得,而通信的性能是制约区块链整体吞吐量的关键因素
网络稳定性挑战
区块链中的节点一般都是分布式部署在多地,节点与节点之间通常通过公网通信。相对于公链,联盟链上节点数量有限,对网络状态更加敏感。一旦链上部分节点因为网络状态差而无法稳定参与共识或转发交易,可能导致整个链的工作状态受到影响。联盟链多用于支持高性能生产应用,要求比较高的交易吞吐量和服务稳定性,而直接基于公网的P2P通信有太多不可控因素,网络波动时常发生,达不到业务对网络质量的要求。在全球部署场景下,网络稳定性问题更加突出
典型网络拓扑结构
在互联网应用网络中,有多种网络拓扑结构,应用最广泛的就是层级结构和对等结构
层级结构网络及特点
互联网中广泛使用的CDN网络(Content Delivery Network)就是典型的层级结构网络。CDN是构建在Internet网络上的应用网络,有中心节点(源服务器)、区域节点、边缘节点(边缘服务器)等组成。中心节点作为拓扑结构的最高层,边缘节点作为拓扑结构的最低层,数据从中心节点流向边缘节点,边缘节点之间一般不需要直接通信。这种模式下,系统能够提供极大的弹性,吞吐量可以随着边缘节点的增加不断提升。CDN边缘cache、就近服务的设计,可以节省骨干网带宽,提升访问速度,实现网络加速能力。CDN网络特别适合下行数据通信,即从中心节点分发数据到边缘节点和用户
对等网络结构及特点
对等网络是一种在对等者(peer)之间基于对等计算模型构建的应用层网络,也称为P2P(peer to peer)网络。典型的P2P网络应用出现在2000年左右,相继涌现Napster、GnutElla、eDonkey等系统。P2P网络最突出的特点是去中心化,这个特点也带来了网络可扩展性和健壮性方面的优势。在文件分发场景下,P2P网络能够充分利用分散的资源(如磁盘、带宽等),发挥出了较好的性能优势。但在全局通信场景下,由于P2P网络的节点连通性,单节点负载能力,消息转发效率等原因,造成通信实时性差,全局数据一致慢,在区块链网络通信中这一点的影响比较突出
区块链网络优化
为了提升区块链网络的扩展性和性能,区块链技术领域出现了多个网络优化方案
Falcon
Falcon网络是一个科研项目,由康奈尔大学几位教授创建。它是用于bitcoin区块的新型中继网络,基于应用层路由算法,加速区块传输减少孤儿区块;同时可以有效改善比特币网络的扩展性
FIBRE
FIBRE是一个开源项目,由比特币项目的核心开发人员发起和维护。同样致力于提升比特币网络扩展性和吞吐量,加速区块传输,降低交易延迟
BloXroute
BloXroute是一个商业化项目,属于每个BloXroute Labs公司。BloXroute Labs致力于搭建高效且中立的区块链分发网络BDN(Blockchain Delivery Network)为所有区块链解决扩容瓶颈。BDN网络帮助区块链节点更快完成大区块广播和交易池同步,从而减少不必要的资源浪费,使区块链能够更高效地运行,进一步分散并最终消除区块链扩容瓶颈。为了实现这种扩容,BDN使用了多种优化技术,如交易压缩与缓存、流式数据转发(直通路由)、网络拓扑优化等。区块链可以在不更改协议、不牺牲安全性或去中心化的前提下接入BDN。BDN在区块链底部的网络层运行,因此它不仅兼容作用于第一层和第二层的扩容解决方案而且支持所有类型的共识机制。目前,BloXroute已经支持以太坊(Ethereum)、比特现金(Bitcoin Cash)、本体(Ontology)等区块链节点使用
互联网实时通信(RTC)
互联网实时通信(RTC)领域的网络优化技术是当前互联网领域比较热门的低延迟、高并发通信方案。其特有的传输优化能力,能部分应用到区块链网络中来。但目前RTC技术在区块链中的实际应用还比较少,仅个别区块链项目采用了QUIC协议(Quick UDP Internet Connection)
Falcon、FIBRE、BloXroute项目借鉴了CDN网络的技术思想,以加快区块分发为主要技术手段实现区块链网络性能提升,也一定程度上改善了区块链的扩展性
蚂蚁链BTN网络定位
蚂蚁区块链传输网络(BTN:Blockchain Transmission Network)是面向全球的区块链传输骨干网络,通过搭建多链共享的通信网络,提升区块链节点的稳定性、连通性和实时性,实现全球区块链网络高速、安全互联。
为了解决传统P2P网络中Peer到Peer网络不稳定的问题,通常采用的方案是部署网络专线,但是专线部署周期长、成本高,尤其在全网状(full-mesh)网络中更是无法做到所有节点的通信都通过专线连接。BTN结合了蚂蚁集团优化全球网络用户体验的多年技术积累,通过部署在全球的高吞吐骨干网络专线和大量的POP(Point-of-presence)点,将区块链节点的流量就近就优引入到骨干传输网络中,将节点到节点不可靠的网络转换成了节点到POP点以及专线内的传输,极大的优化了网络传输的稳定性和效率,提升了用户体验。传统的网路加速产品,如DCDN,也可以提供就近接入、动态加速能力,但是使用在区块链产品中存在一些问题,如需要区块链节点必须具有公网IP、无法结合区块链的语义做协议层优化等。区块链传输网络需要对通信加速,还需要针对区块链网络特征进行优化
BTN具备能力
- 覆盖全球的大规模POP点,区块链节点能够就近就优接入POP点;
- 优化的POP点之间网络传输能力,可以提供高吞吐、低延时的网络数据传输;
- 具备边缘计算能力的服务点,可以理解区块链语义并基于应用特征优化网络传输性能,如应用层组播等;
- 具备高可用、可运维、强大的容灾能力和安全防护能力,不会因为接入BTN导致区块链节点的服务SLA降低
蚂蚁链BTN服务概念及架构
BTN服务主要是由数据面和控制面两部分组成,数据面负责根据节点路由信息对区块链消息进行分发,控制面负责区块链节点的就近接入、节点路由的管理和跨区域流量调度等。
边缘代理 EdgeProxy
分发节点的消息,全球部署,边缘代理之间具备网络通信能力,可以是一台物理机或者云服务器;
节点 Session
节点Session标识一个节点的可路由状态以及收发消息状态
路由表
节点Session同EdgeProxy的关系表,可以根据此路由表将消息转发给具体的节点Session进而将消息分发到节点
Region
节点的调度单位,调度器根据节点特性调度节点到某个Region获取BTN的服务
可用区
为了具备高可用和容灾能力,一个Region内部具备至少2个可用区。在一个可用区出现故障时,节点可以从其他可用区继续获取服务
区块链消息
承载具体区块链语义的消息(如共识消息)
蚂蚁链BTN服务架构的数据面
BTN模型下数据面主要功能承载在EdgeProxy中,EdgeProxy可以通过购买公有云厂商的服务器来实现(如阿里云的ECS或者ESK边缘节点),EdgeProxy的处理区块链消息的三个步骤为:接收消息、解析消息、依据路由转发消息到目标EdgeProxy或转发给区块链节点
EdgeProxy的互通
一个EdgeProxy构成了接收区块链节点数据前沿服务站。可以快速稳定地接收区块链节点的消息。同样的,EdgeProxy之间的高效数据分发能力也至关重要,在BTN模型中,对具体的EdgeProxy之间仅要求能够网络互通,可以使用公有云上VPC、MPLS专线、或者更低成本的SD-WAN技术,甚至可以直接通过公网进行通信,不同的互通方案可能会导致不同的控制面设计,控制面的复杂度也需要作为一个考察维度
数据容灾
数据面容灾本质上是消息可靠投递的保障,可以通过消息重试,多网络通道等技术保障整体的SLA等级
蚂蚁链BTN服务架构的控制面
控制面提供区块链节点的路由能力,通过调度器调度区块链节点的就近接入,并且控制EdgeProxy之间的网络流量调度
区块链节点的就近接入
就近接入能够提高区块链节点消息首发的成功率,典型的就近接入系统就是CDN,通过就近服务用户,能够提高更好的网络体验,BTN可以根据用户的来源地、运营商等属性将其调度到距离节点最近的EdgeProxy
路由表和消息的路由
每个区块链节点都有唯一的nid,消息路由是EdgeProxy根据路由表查找到消息的下一跳并投递的过程。控制面根据区块链节点的Session信息来更新路由表,如通过全局部署的一个分布式的KV存储提供的更新和查找功能,实现路由维护与路由选择
EdgeProxy之间的流量调度
由于BTN的全球部署特性,EdgeProxy之间的网络通信带宽、延迟等特性不同,控制面需要调度EdgeProxy之间的流量以保障整体的可用性。BTN借鉴了传统的流量工程思路和Segment Routing流量工程方法
蚂蚁链BTN服务架构的整体流程
区块链节点的消息主要包括应用层单播和广播两种类型。下图以点对点的单播消息为例说明区块链节点在接入BTN之后具体的消息流程
- 区块链节点B向调度节点请求可用的EdgeProxy
- 区块链节点B根据获取到的EdgeProxy IP地址和其建立通信,此过程中EdgeProxy会进行安全验证,确保节点的合法性
- EdgeProxy调用控制面接口更新节点的路由信息
- 路由管理模块更新路由表项
- 节点A发消息给节点B时,先把消息发给EdgeProxy
- EdgeProxy解析消息之后发现该消息是发送给节点B的,调用控制面接口查询节点B的路由
- 节点A连接的EdgeProxy将该消息发送给节点B所连接的EdgeProxy
- 节点B连接的EdgeProxy将消息发送给节点B
蚂蚁链BTN中区块链节点接入
BTN网络与区块链节点之间的连接采用基于SSL协议的安全通信信道。
每个区块链节点都有一对非对称公私钥对,利用其生成一个证书签署请求(Certificate Signing Request)文件,提交给蚂蚁CA进行签名;蚂蚁CA签名后生成区块链节点的接入证书(client.crt)。区块链节点在本地配置上接入证书就可以和BTN建立SSL安全连接了。接入证书除了实现通信信道安全,也实现了对节点身份的验证。
BTN可路由区块链消息传输协议
BTN建立以对象标识(ID)为中心的路由表。通过该路由表查询,区块链上的业务利用BTN进行通信时,就不必再关心节点位置,而仅使用目标对象的ID即可。BTN网络基于该协议,可以支持全类型、异构化的区块链通信
联盟链网络接入
联盟链的广播语义其实是应用层的组播,是对每个节点发应用层消息,即一个相同的消息发给多个节点。如果借用BTN网络,这种应用层组播消息可以在发送端聚合成一个消息,即只需要发出一份组播消息,而提高BTN网络在边缘复制,这样能显著降低节点的发送带宽,同时也可以接入区块链传输网络(BTN)实现消息聚合、网络拓扑简化等,实现低带宽、高吞吐,进而提升链的性能和扩展性
公链网络接入
公链的共识算法种类很多,但通信内容是交易消息、区块同步消息和共识消息这三种主要消息类型;比如对BTC来说,区块同步消息和交易消息是主要内容,区块同步消息关系共识结果的有效性,区块同步消息分发越快越容易确定共识结果。因为公链通常有激励机制,对矿工而言,公链的消息传播影响其收益,所以公链在接入区块链传输网络时对网络中立性有更突出的要求
网络基础设施优化
在区块链P2P网络通信中,达成共识的速度取决于参与共识节点的网络状况,网络吞吐对区块链业务TPS具有决定性作用,在区块链节点接入BTN之后,BTN提供的网络吞吐能力至关重要。BTN通过如下三个方面进行网络优化来提高区块链接入BTN网络的吞吐能力。
就近接入
在BTN网络中区块链节点直接通信被分割成了3段:区块链节点到EdgeProxy、EdgeProxy到目的地EdgeProxy,目的地EdgeProxy到目标节点。
这中间的某一段出现丢包时,仅在该段重传,不需要从发送节点开始重传数据包,进而提升了节点之间的网络传输吞吐
网络专线
为了优化跨国、跨境等长距离网络通信,在EdgeProxy之间使用专线是一种常见的手段,不过专线成本高、部署慢的问题导致无法成为通用解决方案。在BTN中,一方面通过使用云厂商提供的虚拟专网中的专线快速构建高质量的网络通信能力,另一方面,通过分析通信包的不同优先级,对于较低优先级的数据包使用较为便宜的SD-WAN或者公网来达到成本优化
传输协议优化
通过BTN将区块链节点之间P2P的通信转换到区块链节点同BTN通信,以及BTN中的EdgeProxy和EdgeProxy之间的通信,可以通过优化跨链节点同EdgeProxy以及EdgeProxy之间的传输协议达到优化区块链通信体验的目的。BTN支持使用QUIC协议来设计一种针对区块链的传输协议,降低区块链节点接入BTN的延迟,使用改进的拥塞控制算法和流量调度算法,提升区块链通信实时性和稳定性
业务应用层优化
BTN另外一个典型的能力是针对区块链业务的具体特性做优化
PBFT达成共识的消息复杂度为O(n2),在P2P的full mesh网络拓扑情况下,每个区块链节点的网络通信负担都非常大,使得链的扩展能力随着节点数的增加急剧下降。在BTN网络下,节点仅需要和EdgeProxy进行通信,那么当节点发起一次共识时,其仅需要将广播消息发送给BTN,由BTN来进行广播,那么该节点的上行消息量将由O(n2)变为O(1),大大降低了节点的通信负担。
在BTN网络传输中,定义了基于Qos的分层加速技术。由于不同的消息类型对实时性的要求不同,比如共识消息、交易消息等,要求极致的低延迟;而区块同步消息特别是历史区块同步,对实时性要求弱于共识消息的实时性。为了保障系统整体工作的低延迟特性,采用了多优先级队列进行消息排队,保障高优先级消息最先得到处理,进而保障了共识、交易类消息的实时性。
安全通信特性
联盟链各个节点进行数据传输的过程中必须要确保数据不被外部窃听、修改、重放等,针对这个目标,蚂蚁区块链设计了端到端的安全通信方案,其中主要包括三个方面:节点身份安全、链路传输安全、数据传输安全,具体如下图所示:
节点身份安全
主要是指节点在接入BTN网络时的身份认证,节点通过BTN网络进行数据传输时,首先需要向BTN Server申请证书,连接时证书认证通过后,节点才可以通过BTN与其他节点之间建立逻辑连接,然后节点需要向其他节点发送自己的公钥和链节点证书,该证书通过认证后,节点与节点之间才能正式建立连接。节点在建立安全连接后,需要按照自己所属的区块链节点组发送注册组消息,这是为了验证该节点在某个区块链节点组的身份是正确的,是经过大部分节点认同的。这两项身份认证通过后,节点才能真正开始发送业务数据消息
链路传输安全
节点在传输过程中,通过SSL协议对网络传输链路进行安全保障,从而能够解决数据在传输过程中可能出现的丢失、窃听等问题,保证数据能够安全可靠地在每条链路中进行传输
数据传输安全
数据传输安全是为了解决节点与节点之间的传输安全,在节点通过BTN网络进行传输时,首先需要将数据传输到BTN网络中,通过BTN网络来进行消息路由转发,在此过程中,很容易发生消息泄露,所以使用BTN网络传输时,首先需要对数据进行加密,数据到达目的节点处后,目的节点对数据进行解密处理
BKE(Blockchain Key Exchange)协议
BTN通过定义了一种BKE(Blockchain Key Exchange)协议来完成区块链节点之间端到端加密传输,主要包括密钥生成和交换BKE
节点在建立连接后,节点之间进行密钥信息协商,包括对称密钥、非对称密钥算法选择等,协商成功后,节点分别生成BTN网络传输需要的非对称公私钥和对称密钥对,节点向其他节点发送请求获得其他节点的公钥,其他节点收到后将公钥发送给本节点,节点使用其他节点的公钥对自己的BTN对称密钥进行加密,将加密后的数据发送给其他节点,其他节点收到后,使用自己的私钥进行解密,并将节点的对称密钥存储在自己本地,另外,节点每隔一段时间更新BTN对称密钥,以防止BTN密钥对发生泄漏导致消息泄露
网络中立特性
BTN网络中立性是指建立的网络基础设施必须平等对待区块链中的所有节点,不能歧视性对待任何节点的任何消息。BTN提出了基于密码学和统计学的可验证中立性模型,主要通过数据完整性验证、数据正确性验证、时延合理性验证、消息隐私性验证四个维度的指标来保证其中立性。
节点对要发送的消息进行加密,然后做哈希签名,发送给区块链中任意接收节点;通过技术手段来保证数据的完整性,隐私性,正确性,和统计的随机性,另外,统计发送方和接收方节点的数据量和时延,用来验证数据的时延合理性
节点在建立通信链路之后,首先进行密钥协商,协商完成后进行密钥交换,密钥交换成功后,节点开始发送数据。为了保证消息的隐私性和安全性,节点需要对消息数据进行加密,为了保证消息的正确性,节点需要使用链上节点私钥对该消息的哈希值做签名,然后将所有的数据发送给接收节点。
接收节点收到消息后,首先验证签名是否正确,如果正确,则代表消息发送方无误,然后对加密消息做哈希,并验证该哈希值是否与签名中的哈希值一致,如果一致则代表消息没有被篡改,验证通过后,接收方使用密钥对消息进行解密,并进行处理
消息时延主要依靠统计消息的时延和数据量来实现
A节点发送数据给B节点,A节点记录自己发送给B节点的数据量,B节点记录自己收到的A节点的数据量,然后将这两部分数据进行整理,返回给用户作为判断,验证消息总量的大小,同时,A节点定时向B节点发送请求,获得B节点本地的统计数据,B节点收到请求后,将自己收到的A节点的统计数据消息发送给A节点,并附带自己的签名信息。A节点收到后验证签名,并更新自己与B节点的RTT,然后将B节点返回的统计数据与自己本地存储的发送给B节点的消息统计数据一起整理发送给用户进行判断,从而验证时延和其他数据的正确性
全球部署的国际信用证联盟平台
信用证业务是银行常见的国际业务之一,是国际贸易中的重要金融工具,信用资质良好的企业通过开立银行信用证来保证其在国际贸易中的支付承诺。该平台利用区块链所有节点数据一致性,结合隐私计算技术,可以获得更好的时效性和成本收益
挑战
- 网络不稳定
节点之间网络连接非常不稳定,经常有节点掉线,共识延迟高
- 节点扩展困难
新节点加入需要协调新机构和已加入机构点对点开通网络策略,人力成本和时间成本高
- 网络复杂,难维护
节点运行环境的差异进一步带来机构内部网络映射的复杂性,不同机构需要不同的网络配置方案
国际信用证联盟链特点
- 节点数量多且分散在亚欧各地,节点之间物理距离遥远,公网通信时延非常大
- 节点私有化部署在众多机构,机构网络隔离策略多样,网络策略变更时间久,协调成本高
- 节点部署环境多样,物理机,虚拟机,容器等方式均有涉及
该联盟链的节点在全球就近接入BTN网络后,充分利用了BTN优化的网络,稳定性大幅提升,共识时延显著下降。节点只需要单向开通到最近接入点的网络即可。联盟链扩展新节点时只需协调新机构开通单向访问接入点网络即可。沟通成本和时间成本大幅下降。基于纯BTN连接所建立的联盟链,机构内部的网络映射可以大大简化,部署方式趋于统一且节点可以自由迁移物理位置,根据实际观测结果,接入BTN之后,该黎明链整体提升明显,通过BTN网络,区块链实现了将物理P2P网络转化成了逻辑P2P网络。网络连接结果大大简化但同时又保证了区块链节点的对等性
混合部署的数字安全区块链平台
数字安全应用链采用了混合部署方式,有私有化机房,有云上节点,也有私有云环境,多种环境混合,加上私有化网络特性多,造成多种网络挑战