使用链上信使

标签:AMOP 链上信使 私有话题 认证流程


链上信使协议介绍

链上信使协议AMOP(Advanced Messages Onchain Protocol)系统旨在为联盟链提供一个安全高效的消息信道,联盟链中的各个机构,只要部署了区块链节点,无论是共识节点还是观察节点,均可使用AMOP进行通讯,AMOP有如下优势:

  • 实时:AMOP消息不依赖区块链交易和共识,消息在节点间实时传输,延时在毫秒级。

  • 可靠:AMOP消息传输时,自动寻找区块链网络中所有可行的链路进行通讯,只要收发双方至少有一个链路可用,消息就保证可达。

  • 高效:AMOP消息结构简洁、处理逻辑高效,仅需少量cpu占用,能充分利用网络带宽。

  • 安全:AMOP的所有通讯链路使用SSL加密,加密算法可配置,支持身份认证机制。

  • 易用:使用AMOP时,无需在SDK做任何额外配置。

AMOP功能使用请参照Java SDK AMOP.

逻辑架构

../../_images/AMOP.jpg 以银行典型IDC架构为例,各区域概述:

  • 链外区域:机构内部的业务服务区,此区域内的业务子系统使用区块链SDK,连接到区块链节点。

  • 区块链P2P网络:此区域部署各机构的区块链节点,此区域为逻辑区域,区块链节点也可部署在机构内部。

普通话题

AMOP的消息收发基于话题(Topic)订阅机制,订阅者首先订阅一个话题,发送者往该话题发送消息,订阅者即可收到。

发送方式和内容

总共支持两种传播方式:

  • 单播:仅随机发送给一个指定话题的订阅者。

  • 多播:发送给所有指定话题的订阅者。

发送内容:

  • 文本消息

  • 文件

私有话题

在普通的配置下,任何一个订阅了某topic的接收者都能接受到发送者推送的消息。但在某些场景下,发送者只希望特定的接收者能接收到消息,不希望无关的接收者能任意的监听此topic。在此场景下,需要使用私有话题功能。

私有话题:对于特定的话题,发送者配置好期望的接受者的公钥,仅该公钥所对应的订阅者才能接收该私有话题的消息。

私有话题功能是自FISCO BCOS 2.1.0 之后新增的。使用过程如下:

  • 1:接收者使用生成公私钥脚本生成公私钥文件,私钥保留,公钥给生产者。

  • 2:参考配置案例将配置文件配好。启动接收端和发送端进行收发消息。

重要

注意:AMOP私有话题目前只支持非国密算法,因此生成在生成公私钥文件时,注意使用非国密工具生成。

私有话题的认证流程

假定链外系统1是话题消息发送者(消息发送端),链外系统2是话题订阅者(消息接收端)。私有话题的认证流程如下:

../../_images/AMOP_AUTHOR.jpg

  • 1:链外系统2连接Node2,宣称订阅T1,Node2将T1加入到话题列表,并将seq加1。同时每5秒同步seq到其他节点。

  • 2:Node1收到seq之后,对比本地seq和同步过来的seq,发现不一致,则从Node2获取最新的话题列表,并将话题列表更新到p2p的话题列表,对于还没认证的私有话题,状态置为待认证。Node1遍历列表。针对每一个待认证的私有话题,进行如下操作:

    • 2.1:Node1往Node1推送消息(消息类型0x37),请求链外系统1发起私有话题认证流程。

    • 2.2:链外系统1接收到消息之后,生成随机数,并使用amop消息(消息类型0x30)将消息发送出去,并监听回包。

    • 2.3:消息经过 链外系统1–>Node1–>Node2–>链外系统2的路由,链外系统2接收到消息后解析出随机数并使用私钥签名随机数。

    • 2.4:签名包(消息类型0x31)经过 链外系统2–>Node2–>Node1->链外系统1的路由,链外系统1接收到签名包之后,解析出签名并使用公钥验证签名。

    • 2.5:链外系统1验证签名后,发送消息(消息类型0x38),请求节点更新topic状态(认证成功或者认证失败)。

  • 3:如果认证成功,链外系统的一条消息到达Node1之后,Node1会将这条消息转发给Node2,Node2会将消息推送给链外系统2。

发送方式和内容

同样的私有话题支持单播和多播,发送文本和文件。

错误码

  • 99:发送消息失败,AMOP经由所有链路的尝试后,消息未能发到服务端,建议使用发送时生成的seq,检查链路上各个节点的处理情况。

  • 100:区块链节点之间经由所有链路的尝试后,消息未能发送到可以接收该消息的节点,和错误码‘99’一样,建议使用发送时生成的‘seq’,检查链路上各个节点的处理情况。

  • 101:区块链节点往Sdk推送消息,经由所有链路的尝试后,未能到达Sdk端,和错误码‘99’一样,建议使用发送时生成的‘seq’,检查链路上各个节点以及Sdk的处理情况。

  • 102:消息超时,建议检查服务端是否正确处理了消息,带宽是否足够。

  • 103:因节点出带宽限制,SDK发到节点的AMOP请求被拒绝。