为什么做网站要用谷歌浏览器,中国空间站航天员,国外二手表网站,做淘宝需要知道什么网站吗3-1 P2P网络
传统中心化网络由中央服务器保存全量数据。客户端之间无法直接连接#xff0c;必须通过中央服务器作为桥梁。客户端必须和中央服务器建立连接后访问资源。客户端之间并无连通。
在P2P网络中通过将数据资源分散在网络各个节点中存储以及节点间交互连接#xff0…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之间会话结束网络中其他节点仍然可能发送请求或接受请求。最终所有节点都收到数据请求消息 泛洪算法性能
泛洪循环
节点1234之间组成一个环。原因节点1发送消息经过节点243节点3再次发送给节点1。如果节点1对于收到的消息不做循环判断而再次发送给节点2则形成泛洪循环。因此在全网任何时候都可能发生泛洪循环。从而产生大量无效广播消息大量网络和计算资源被浪费导致整个网络不可用。
TTL机制
为了控制广播消息发生循环对每个查询设置TTLTime to Live值例如TTLTTL-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仅支持精确关键词匹配查询无法支持内容/语义等复杂查询
分布式哈希表算法
DHTDistributed Hash Table即分布式哈希表典型的应用场景就是点对点网络P2P网络。
全分布式结构化网络中经常采用分布式散列表DTH对所有加入节点进行结构规划把全网维护的路由表和数据分割成不同的小范围路由和数据块保存在各个节点中。从而实现整个网络的节点寻址和数据存储。
哈希表是一种能高效进行数据读取/写入的数据结构通过哈希函数可以将任意的数据映像到固定长度的随机字符串由于函数具有单向性与唯一性因此这个随机字符串可以作为辨识数据的指纹即Key。读取哈希表的数据Value只需提供Key哈希表即可取得映像到该键值的完整数据。
在结构化P2P网络中每个节点只存储部分的信息或部分信息的索引。当用户需要在P2P系统中获取信息时必须知道这些信息或索引可以存在于哪些节点中。由于用户预先知道应该搜索哪些节点避免了非结构化P2P系统中使用的泛洪式查找因此提高了信息搜索的效率。
DHT经典算法
Kademlia算法二叉树结构Chord算法环形结构
Kademlia算法
所有节点都被当做一颗二叉树的叶子并且每一个节点的位置都由其ID值的最短前缀唯一的确定
对于任意一个节点都可以把这颗二叉树分解为一系列连续的不包含自己的子树。最高层的子树由整棵树不包含自己的树的另一半组成下一层子树由剩下部分不包含自己的一半组成以此类推直到分割完整个树。
节点的基本属性
节点IDNode 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个桶算法中K16即每个桶中最多放16个节点
节点每次同时选择3个邻居节点发送Findnode报文。 3-1-4 半分布式网络
半分布式集合全分布非结构化拓扑和集中式拓扑的优点将两种方式结合并做了平衡。
半分布式P2P网络由少量超级节点和大量普通节点组成。半分布式网络可以看做是由多个以超级节点为中心节点的集中式网络链接而成。
在各个超级节点上存储了系统中其他部分节点的信息节点发现算法仅在超级节点之间转发超级节点再将查询请求转发给适当的叶子节点。
半分布式结构也是一个层次式结构超级节点之间构成一个高速转发层超级节点和所负责的普通节点构成若干层次。
应用
KaZaa 一种P2P文件共享平台超级账本 优势
吸取了中心化结构和全分布式非结构化拓扑的优点选择性能高处理、存储、带宽等方面性能的节点作为超级节点SuperNodesHubs在各个超级节点上存储了系统中其他部分节点的信息。
有效地节省了中央服务器的带宽消耗减少了系统的文件传输延时资源发现效率高
泛洪只在超级节点间发生减少了广播风暴。多个超级节点备份数据提高网络整体健壮性。
扩展性较好容易管理
缺陷
对超级节点依赖性大容易受到攻击。
超级账本网络机制
节点类型
超级账本采用半分布式结构化网络拓扑。将节点分为普通用户节点和超级节点排序、背书节点等。超级节点可以由普通节点选举也可以自行配置单独一个超级节点停机不影响系统运行。
超级账本所有交易必须通过超级节点认证区块也是由超级节点生成普通节点间可以互相同步区块。
客户端节点
客户端或应用程序代表由最终用户操作的实体它必须连接到某一个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 floodUDP floodICMP floodconnect 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协议是一个最终一致性协议
前提和定义
假定一组节点互相连接每个节点和其他节点都可以互通消息。逻辑上为一个完整和独立的分布式系统。
该系统所有节点使用统一时间
每个节点保持三种状态之一
易感状态 susceptibleS节点处于易感状态接收新数据更新感染状态 infectedI节点由新数据将要分享数据给其他节点免疫状态 removedR节点已经更新处于免疫状态或者死亡状态不再参与传播数据过程
反熵算法 anti-entropy
每一个节点周期性地随机选择其他节点进行互相交换所有数据经过一段时间后最终所有节点间的数据保持一致性。通过实验分析反熵算法非常可靠但是每次节点两两交换自己的所有数据会带来非常大的通信负担所以不是特别高效。通常只用于新加入节点的数据初始化。
传谣算法 rumor-mongering
谣言传播过程是消息只包含最新数据谣言消息在某个时间点之后会被标记为removed并且不再被传播。缺点是系统有一定的概率会不一致通常用于节点间数据增量同步。初始状态所有节点都是“susceptible”易感状态。当一个节点收到新的数据更新状态转为“谣传者Hot rumor”。当节点为“谣传者”时定期随机选择其他节点进行数据同步。谣传者节点定义同步共享节点个数仅在定义的节点个数之内发送数据同步。如果同步数据多次后发现其他节点数据始终一致。则停止同步散布谣言并将该节点从“谣传者Hot rumor”改为“removed”免疫状态。传谣算法比反熵算法更高效。但会有一定概率节点会数据丢失。
Gossip协议消息
Push消息
发起信息交换的节点A随机选择联系节点B并向其发送自己的信息节点B在收到信息后更新比自己新的数据一般拥有新信息的节点【感染状态infectedI节点】才会作为发起节点。 Pull消息
发起信息交换的节点A随机选择联系节点B并从对方获取信息。一般无新信息的节点【易感状态susceptibleS节点】才会作为发起节点 PushPull消息
发起信息交换的节点A随机选择联系节点B同时从对方获取数据用于更新自己的本地数据。 如果把两个节点数据同步一次定义为一个周期则在一个周期内Push需通信1次Pull需2次PushPull需3次。虽然消息数增加了但从效果来讲PushPull最好理论上一个周期内可以使两个节点完全一致。
3-2-1 Gossip协议算法
Gossip算法1 SI模式反熵算法 SI模式中S表示易感状态susceptible节点状态I表示感染状态infected节点状态。在SI模式中节点的最初状态在易感状态S状态状态可迁移到感染状态I状态。一旦进入感染状态节点不再改变状态。
第二行表示循环会定时启动然后随机选择节点
算法使用两个布尔值push和pull表示发送或接收消息
当push为真时节点状态是Iinfected感染状态时发送更新数据到其他节点可感染其他节点。如果节点状态为Ssusceptible易感状态则忽略更新发送
如果pull为真时节点会通过update request拉取新的数据
在OnUpdate过程中节点会存储更新数据并且将自己的状态迁移到Iinfected感染状态
在OnUpdateRequest过程中如果节点为Iinfected感染状态节点会发送push消息到对方。如果是Ssusceptible易感状态则什么都不做
算法复杂度Push消息
考虑一个节点N的分布式系统只用Push消息更新所有节点数据Pi表示一个节点在第i次传播周期后为易感节点的概率(N-1)/N表示一个节点为感染节点的概率N(1-Pi)感染节点数量
通过以下方程我们可以推测第i1次还剩余多少易感节点的概率。 随着易感节点的减少最终所有节点都会成为感染状态即所有节点的数据都会被更新。
算法复杂度Pull消息
考虑一个节点N的分布式系统使用Pull消息更新所有节点数据Pi表示一个节点在第i次传播周期后为易感节点的概率
通过以下方程我们可以推测第i1次还剩余多少易感节点的概率。 随着易感节点的减少通过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时状态迁移到Rremoved。减少整个系统重发update消息带来的冗余
OnUpdate过程中当节点收到update消息时如果节点状态处于I或者R时发送feedback消息。
OnUpdateRequest过程和算法1 SI算法一样只有节点处于感染状态infected时才发送update消息。
SIR算法中易感节点susceptible和Rremoved状态节点理论上为0最终所有节点成为感染节点I。
第13行中的概率1/K定义节点迁移到免疫removed状态的概率。通过实验分析
当K120%的节点会丢掉update消息停止传播
当K50.24%的节点会丢掉update消息停止传播
当K100.00017%的节点会丢掉update消息停止传播
例如可假设K5节点每次在OnUpdate过程中对K值加1当K值等于5的时候节点状态迁移到Rremoved免疫状态。此时节点会丢掉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使用了ECIESElliptic 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进行通信节点利用分布式散列表DTHDistributed 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机制和helloSendDigestSendReq和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 FabricR3 Corda证书中已含足够信息使用链上存储的根证书对用户证书认证公钥中无不能附加额外信息联盟链chainMaker 弱权限模式下同地址标识认证 强权限模式下组织管理员公钥存入创世块公钥标识对应的组织、角色、权限等信息上链存储 地址小无不能附加额外信息 联盟链Enterprise Ethereum AllianceFISCO 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属性为CCNSTZhejiangLHangzhouOUYi Ma OU Ant GroupCN yi.maantchain.com的数字证书如下图黄色高亮部分。马毅的证书类似于他的身份证提供了马毅的信息可以用来证明关于他的重要事实。最重要的是马毅的公钥是他的证书中分发的而他的私人签名密钥则不是。此签名密钥必须保密。
马毅的所有属性都可以使用称为密码学的数学技术进行记录这样篡改将使证书无效。只要对方信任证书颁发者即证书授权中心CA密码学就允许马毅将证书提交给其他人以证明其身份。只要CA安全地保存某些加密信息CA的私钥任何阅读证书的人都可以确定有关马毅的信息没有被篡改它将始终具有马毅的特定属性。将马毅的X.509证书视为无法改变的数字身份证。 公钥、私钥和数字签名
身份验证和消息完整性是安全通信中的重要概念。身份验证要求确保交换消息的各方创建特定消息的身份。对于具有“完整性”的消息意味着在其传输期间不能被修改。例如你可能希望确保与真正的马毅而不是模仿者进行沟通。或者如果马毅向你发送了一条消息你可能希望确保其在传输过程中没有被其他任何人篡改过。
传统的身份验证机制依赖于数字签名顾名思义它允许一方对其消息进行数字签名。数字签名还可以保证签名消息的完整性。
从技术上讲数字签名机制要求签名方保存两个加密连接的密钥广泛可用的以充当授权锚的公钥以及用于在消息上产生数字签名的私钥。数字签名消息的接收者可以通过检查附加签名在预期发送者的公钥下是否有效来验证接收消息的来源和完整性。
私钥和公钥的唯一关系是保证安全通信的保证。密钥之间唯一的数学关系使得私钥在消息上的签名只有对应公钥在相同的消息上才可以与之匹配。
在下面示例中马毅使用他的私钥对邮件进行签名。任何使用他的公钥查看签名消息的人都可以验证签名。 证书授权中心
联盟链上的人员或节点能够通过由系统信任的机构为其发布的数字身份参与联盟链网络。在最常见的情况下数字身份或简称身份的形式为符合X.509标准并由证书授权中心CA颁发的经过加密验证的数字证书。
CA是互联网安全协议的常见部分你可能已经听说过一些比较流行的CASymantec最初是VerisignGeoTrustDigCertGoDaddy和Comodo等。
证书授权中心向不同的参与者颁发证书。这些证书由CA进行签名并将参与者的公钥绑定在一起并且可选是否具有全部属性列表。因此如果一个成员信任CA并且知道其公钥则可以信任与参与者绑定的证书中包含的公钥并且通过验证参与者证书上的CA签名来获取所包含的属性。
证书可以广泛传播因为它们既不包括参与者也不包括CA的私钥。因此它们可以用作信任的锚用于验证来自不同参与者的消息。
CA也有一个证书它们可以广泛使用。这就可以让给定CA获取身份证书的消费者验证自己的身份因为只有对应的私钥才可以生成该证书。
在区块链设置中希望与网络交互的每个参与者都需要一个身份。在此设置中你可能会说使用一个或多个CA从数字角度定义了组织的成员。CA是为组织的参与者提供可验证的数字身份的基础。 根CA中间CA和信任链
CA有两种形式根CA和中间CA。因为根CASymantecGeoTrust等必须安全地向互联网用户颁发数亿个证书所以将这个过程分散到所谓的中间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并不需要为互联网的根CASymantecGeotrust等。联盟中的组织可以单独建立自己信任的根CA也可以为一个联盟建立一个可信的根CA。
如本节概述中所述我们可以用组织已有的CA/RA去为Fabric联盟链上的成员颁发电子证书也可以使用Fabric CA去完成此部分的工作。Fabric还提供了一个脚本工具“cryptogen”帮助创建自签名的根证书和为主要成员节点、组织管理员等签发电子证书但此工具只用于测试网络所以这里不做赘述。下面主要介绍使用Fabric CA签发身份。
Fabric CA在区块链网络上执行以下功能
身份注册或连接到轻量级目录访问协议LDAP作为用户注册表。颁发注册证书。注册是Fabric CA颁发证书密钥对的过程由签名证书和形成身份的私钥组成。Fabric CA客户端首先在本地生成私钥和公钥然后将公钥发送到CACA返回一个编码证书即签名证书。证书更新和撤销
可以看出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、排序节点orderer4种。MSP还可以识别被撤销的身份列表。通过附加的Revoked Certificates文件夹里面存储着撤销证书的Subject Key IdentifierSKI和Authority Access IdentifierAKI。
在区块链网络中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种角色AdminPeerClient和Orderer。
下图中为组织Org1定义的签名策略。 3-3-3 联盟链网络加密通道
联盟链网络安全介绍
联盟链是多个组织共同管理的区块链对数据的安全性有更高的要求。
除了子网隔离、隐私数据、访问控制、账本加密等方式网络成员间通讯需满足机密性、身份认证和数据完整性并需防止通信被窃听和篡改。
传输层安全协议Transport Layer SecurityTLS是目前主流联盟链一致使用的通讯加密协议。
TLS是一种旨在提供计算机网络上的安全通信的加密协议。TLS建立在网景Netscape开发的安全套接字层Secure Socket LayerSSL规范基础之上SSL从网景移交到国际互联网工程任务组Internet Engineering Task ForceIETF后IETF将其更名为TLS。
TLS作为安全通信的协议以安全与性能为设计核心能够有效解决下列主要完全通信威胁
消息窃听消息篡改中间人攻击密钥窃听
加密通道面临的威胁及解决方案
消息窃听解决方案
对消息加密用以保存消息的机密性
使用加密速度较快的对称加密算法来实施加密
消息篡改解决方案
背景概念
消息常常具有一些固定的格式一些场景下可以无需破解原文直接对密文中的某些字段进行修改来施加攻击
方案
通信双方对消息的内容完整性进行验证以防消息被篡改。
在消息末尾添加消息认证码Message Authentication CodeMAC。
将机密性和消息完整性解决方案组合在一起构成认证加密Authenticated EncryptionAE技术。
中间人攻击
背景概念
指主动攻击者混入发送者和接收者的中间对发送者伪造成接收者对接收者伪造成发送者的攻击方式。
方案
在消息报文上签名。该做法在数字领域即为数字签名即发送方通过私钥对消息进行加密而接收方通过对应公钥进行解密。现实中常用的签名算法有RSADSAECDSA等。
信任锚点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。而窃听者虽然得到了pq和但无法计算出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-HellmanDH方法外其他密钥交换方法均需要证书消息。服务器密钥交换可选根据之前在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^142048分片/重组这里的分片不是由下层协议的帧长度限制的而是因为解密方需要收完整个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_SHA2561.3及更高版本与TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA1.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或netcats_client负责处理加密方面的工作其他的工作则由用户完全控制。
首先连接到服务器需要提供主机名和端口。例如 输入命令后将看到大量诊断输出 前几行显示有关服务器证书的信息 下一部分按交付顺序列出了服务器提供的所有证书对于每个证书第一行显示主题第二行显示颁发者信息 输出中的下一项是服务器证书内容简洁起见这里删除其中大部分内容 再往下是关于TLS连接的大量信息 证书验证
能够连接到TLS服务器并不意味着该服务配置正确即使该服务器支持所有正确的协议和密码套件。配置的证书与正确的DNS名称匹配同样重要。
上一节示例中验证状态码显示在倒数第二行为20无法获取本地颁发者证书这意味着未正确配置受信任的根证书。
可以使用-CApath开关指向正确的保留所有根证书的目录位置
如果此根证书当前为digicert签发不在OpenSSL的根证书目录下可以使用-CAfile开关指定此根证书在本地的位置如 即使获得了成功的状态码也并不意味着证书配置正确。这是因为s_client工具不会检查给定主机名的证书是否正确必须手动执行此操作并告诉它使用哪个主机名 如果不匹配您可能会看到状态码62 其他TLS验证相关的OpenSSL工具
OpenSSL还包含其他30多个命令工具下面简单介绍一下与验证TSL相关的一些工具
sess_idSSL/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证书吊销机制实现网络层黑名单管理这样可以防止离开联盟的节点可以任意连接链上节点减少节点利用历史证书进行网络攻击的机会降低网络安全风险
网络治理 参数治理 动态组网
需求背景
某些联盟参与方希望以较小的成本参与多个业务
某些联盟参与方希望只加入关心的业务无需同步所有业务的数据
参与方在不同业务中担任不同身份如非共识节点只对数据同步
使用Fabric Channel的部分业务希望MyChain有对应的能力方便业务迁移
功能特性
灵活组网根据业务需求的不同可以灵活组建小范围的拓扑子网允许云上、私有化混合组网的部署形态
独立的治理能力子网具有独立的共识机制、账户体系
物理隔离独立的数据存储子网DB的访问也是隔离的 多维度动态组网 大规模节点P2P 3-4-2 BTN网络
区块链规模化发展的需求
区块链与应用融合发展的需求
链上链下数据协同区块链与应用融合是区块链技术发展的重要方向。
物联网领域
结合区块链、安全计算等技术将物联网设备可信上链解决终端身份确认与数据确权问题打造分布式智能物联网
边缘计算能力
边缘内容分发网络、分布式算力网络等结合区块链实现贡献内容、资源量认定可信计费等
人工智能领域
结合区块链在数据层提供可信数据人工智能负责自动化的业务处理和智能化的决策实现区块链的自动化、自治化和智能化
区块链互联互通的需求
随着区块链应用的扩展链与链之间数据通信的需求越来越多需要建立通用的网络基础设施和通信协议去支持灵活、安全的链间通信
通信通道
网络通信的底层基础就是通信链路当前主要是通过互联网完成连接。而链间通信除了互联网链路还需要一个安全可信的逻辑通道。这个逻辑通道包含两个层面一个是链间消息中继通道另一个是链间通信协议
链及节点网络路由
灵活的链间通信需要对分布式身份进行统一标识以支持对链和节点的动态寻址
区块链网络面临的挑战
随着区块链应用的推广越来越多的商业流程在区块链上发生参与方越来越多链上节点的规模越来越大业务流程长涉及环节多链上参与节点数量大、分布广存在性能、稳定性等诸多技术挑战
网络通信性能挑战
在区块链网络通信中通常每一个节点都需要把自己的消息发送给全链的其他所有节点即应用层消息广播。随着节点规模变大一个节点无法和其他所有节点建立直连只能连接网络中的一部分节点所以一个节点的消息必须通过其他节点进行中继转发随着中继次数增加通信延迟也会逐渐增加节点规模越大通信性能越低。P2P模式下区块链的扩展性和性能无法兼得而通信的性能是制约区块链整体吞吐量的关键因素
网络稳定性挑战
区块链中的节点一般都是分布式部署在多地节点与节点之间通常通过公网通信。相对于公链联盟链上节点数量有限对网络状态更加敏感。一旦链上部分节点因为网络状态差而无法稳定参与共识或转发交易可能导致整个链的工作状态受到影响。联盟链多用于支持高性能生产应用要求比较高的交易吞吐量和服务稳定性而直接基于公网的P2P通信有太多不可控因素网络波动时常发生达不到业务对网络质量的要求。在全球部署场景下网络稳定性问题更加突出
典型网络拓扑结构
在互联网应用网络中有多种网络拓扑结构应用最广泛的就是层级结构和对等结构
层级结构网络及特点
互联网中广泛使用的CDN网络Content Delivery Network就是典型的层级结构网络。CDN是构建在Internet网络上的应用网络有中心节点源服务器、区域节点、边缘节点边缘服务器等组成。中心节点作为拓扑结构的最高层边缘节点作为拓扑结构的最低层数据从中心节点流向边缘节点边缘节点之间一般不需要直接通信。这种模式下系统能够提供极大的弹性吞吐量可以随着边缘节点的增加不断提升。CDN边缘cache、就近服务的设计可以节省骨干网带宽提升访问速度实现网络加速能力。CDN网络特别适合下行数据通信即从中心节点分发数据到边缘节点和用户
对等网络结构及特点
对等网络是一种在对等者peer之间基于对等计算模型构建的应用层网络也称为P2Ppeer to peer网络。典型的P2P网络应用出现在2000年左右相继涌现Napster、GnutElla、eDonkey等系统。P2P网络最突出的特点是去中心化这个特点也带来了网络可扩展性和健壮性方面的优势。在文件分发场景下P2P网络能够充分利用分散的资源如磁盘、带宽等发挥出了较好的性能优势。但在全局通信场景下由于P2P网络的节点连通性单节点负载能力消息转发效率等原因造成通信实时性差全局数据一致慢在区块链网络通信中这一点的影响比较突出
区块链网络优化
为了提升区块链网络的扩展性和性能区块链技术领域出现了多个网络优化方案
Falcon
Falcon网络是一个科研项目由康奈尔大学几位教授创建。它是用于bitcoin区块的新型中继网络基于应用层路由算法加速区块传输减少孤儿区块同时可以有效改善比特币网络的扩展性
FIBRE
FIBRE是一个开源项目由比特币项目的核心开发人员发起和维护。同样致力于提升比特币网络扩展性和吞吐量加速区块传输降低交易延迟
BloXroute
BloXroute是一个商业化项目属于每个BloXroute Labs公司。BloXroute Labs致力于搭建高效且中立的区块链分发网络BDNBlockchain Delivery Network为所有区块链解决扩容瓶颈。BDN网络帮助区块链节点更快完成大区块广播和交易池同步从而减少不必要的资源浪费使区块链能够更高效地运行进一步分散并最终消除区块链扩容瓶颈。为了实现这种扩容BDN使用了多种优化技术如交易压缩与缓存、流式数据转发直通路由、网络拓扑优化等。区块链可以在不更改协议、不牺牲安全性或去中心化的前提下接入BDN。BDN在区块链底部的网络层运行因此它不仅兼容作用于第一层和第二层的扩容解决方案而且支持所有类型的共识机制。目前BloXroute已经支持以太坊Ethereum、比特现金Bitcoin Cash、本体Ontology等区块链节点使用
互联网实时通信RTC
互联网实时通信RTC领域的网络优化技术是当前互联网领域比较热门的低延迟、高并发通信方案。其特有的传输优化能力能部分应用到区块链网络中来。但目前RTC技术在区块链中的实际应用还比较少仅个别区块链项目采用了QUIC协议Quick UDP Internet Connection
Falcon、FIBRE、BloXroute项目借鉴了CDN网络的技术思想以加快区块分发为主要技术手段实现区块链网络性能提升也一定程度上改善了区块链的扩展性
蚂蚁链BTN网络定位
蚂蚁区块链传输网络BTNBlockchain Transmission Network是面向全球的区块链传输骨干网络通过搭建多链共享的通信网络提升区块链节点的稳定性、连通性和实时性实现全球区块链网络高速、安全互联。
为了解决传统P2P网络中Peer到Peer网络不稳定的问题通常采用的方案是部署网络专线但是专线部署周期长、成本高尤其在全网状full-mesh网络中更是无法做到所有节点的通信都通过专线连接。BTN结合了蚂蚁集团优化全球网络用户体验的多年技术积累通过部署在全球的高吞吐骨干网络专线和大量的POPPoint-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时先把消息发给EdgeProxyEdgeProxy解析消息之后发现该消息是发送给节点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网络传输时首先需要对数据进行加密数据到达目的节点处后目的节点对数据进行解密处理 BKEBlockchain Key Exchange协议
BTN通过定义了一种BKEBlockchain 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网络。网络连接结果大大简化但同时又保证了区块链节点的对等性 混合部署的数字安全区块链平台
数字安全应用链采用了混合部署方式有私有化机房有云上节点也有私有云环境多种环境混合加上私有化网络特性多造成多种网络挑战