5.4.3.17 链码以及块事件通知报文信息接口
该接口是由链下业务系统侧实现。城市节点网关在监听到注册的链码或者块事件触发后调用该接口将事件执行结果通知给链下业务系统。
链下业务系统在收到城市节点网关通知后应返回一个包含 success的字符串,否则城市节点网关将尝试分别在第3、12、27、48 秒后再次发起通知,共计5次。
1. 通讯方式:POST
2. 签名算法:详见5.4.3.1应用接入签名算法
3. 请求参数
序号 | 字段名 | 字段 | 类型 | 必填 | 备注 |
---|---|---|---|---|---|
1 | 信息头 | header | Map | 是 | |
2 | 信息体 | body | Map | 否 | |
3 | 签名值 | mac | String | 是 | |
header | |||||
1 | 用户唯一标识 | userCode | String | 是 | |
2 | 应用唯一标识 | appCode | String | 是 | |
body | |||||
1 | 链码Code | chainCode | String | 否 | 块事件通知时为空 |
2 | 城市编码 | orgCode | String | 是 | |
3 | 注册的链码事件key | eventKey | String | 否 | |
4 | 注册的链码事件ID | eventId | String | 是 | |
5 | 注册的链码事件参数 | attachArgs | String | 否 | 注册时填写的附加参数 |
6 | 监听到的链码事件key | eventName | String | 否 | 链码中设置的事件名称,块事件通知时为空 |
7 | 当前链码的交易ID | txId | String | 否 | 块事件通知时为空 |
8 | 监听到的链码事件值 | payload | String | 否 | |
9 | 当前交易块高 | blockNumber | Long | 是 | |
10 | 响应随机码 | nonceStr | String | 是 | 业务平台可根据该值判断是否接收过通知,同一个业务的多次通知中,该字符串不变 |
11 | 上一个块哈希 | previousHash | String | 否 | 链码事件通知时为空 |
示例
链码事件通知
{"header":{"userCode":"lessing","appCode":"CL20191107112252"},"body":{"chainCode":"cc_bsn_test_00","orgCode":"ORG1571365934172","eventKey":"test:\\S{32}","eventId":"2964a0f60b3e460f834618b3664af2da","attachArgs":"abc=123211","eventName":"test:12345678123456781234567812345678","txId":"32fc105681820fa556b8a460efc1e43a47daa864b959ea1753abb4640f2dce49","payload":"","blockNumber":74,"nonceStr":"522c8061b5e84837bad72ca08c6a353f"},"mac":"MEQCIDU4tROyjLtvD1b8TTbWWAlCPuUbmdPAEUXwRRgVn7kIAiA58je5u/7xDuRPcgeUWL3nB9mouUGQ6dGKJMmD7Jm08g=="}
块事件通知:
{"header":{"userCode":"USER0001202007101641243516163","appCode":"app0001202101191411238426266"},"body":{"orgCode":"ORG2020041114171692360","eventId":"8746bb9a1e854c9f8b3710f5a63f7c59","attachArgs":"a=1","previousHash":"022281f6089e3684501251775166b6b0afd18a176ec98a835cb5d09aff0d4950","blockNumber":12,"nonceStr":"79a7baa26c854caeb2e2e7abc0b7f07e"},"mac":"MEUCIQDiZrwf8fKG/3fuaVrsfTN3BKmLx+qnnEuuSaHfvIBbMQIgS+1qHKXeVR24WXwOGu3Nze/tLLziQ0LkjXaueYu0ctM="}
4. 报文中的payload参数在fabric 1.4.3 版本中没有传递,具体代码请参考:
https://github.com/hyperledger/fabric/blob/v1.4.3/core/peer/deliverevents.go#L251 ,如果需要使用payload参数,可以按照以下方式获取:
1)把需要通过事件传递的内容按照key-value存储到链上;
2)把事件名和1中的key拼接作为eventName传递,例如:eventkey_key;
3)注册时使用正则注册事件,例如 :eventkey_[\s\S]*;
4)收到事件后,根据事件名称解析出key,调用一次查询获取value;
5)如果需要传递的payload数据量不大,可以直接拼接到enevtName上,enevtName没有长度限制;
在国密版本的fabric中,我们修改了这段代码,可以收到payload参数。