这些事件通知与 Cobo Webhook 事件不是同一套机制。Cobo Webhook 事件(
wallets.mpc.tss_request.*)由 Cobo 平台发送到您在 Cobo Portal 注册的地址,并使用 Cobo 的 Webhook 签名。本页描述的事件由您自己部署的 TSS Node 发送,使用 request.* 事件名,由节点的 RSA 密钥签名,并在节点配置文件中配置。订阅其中一套不会收到另一套。关于 Cobo Webhook 事件,请参考 Webhook 事件类型。开始之前
事件通知使用一对 RSA 2048 密钥。请在首次启动节点前生成密钥对并存入节点数据库:配置事件通知
在 TSS Node 配置文件(如cobo-tss-node-config.yaml)中添加或取消注释 event 配置段:
顶层参数
服务器级参数
server 下的每个条目都继承顶层配置,并可覆盖其中任意一项。
以下示例将签名事件推送到一台服务器,并将全部事件推送到审计服务器,同时为审计服务器配置更长的重试预算:
支持的事件类型
请只订阅您的集成会实际处理的事件类型,避免节点在您并不使用的事件上消耗投递次数。KeyGen
KeySign
KeyReshare
KeyShareSign
请求格式
节点以表单编码的 POST 请求发送事件,JWT 放在TSS_JWT_MSG 字段中:
您的服务器必须返回
200 OK 或 201 Created。节点将其他状态码一律视为失败并重试。
事件结构
解码package_data 后,事件体结构如下:
每个
data 对象都包含 data_type、request_id、request_type、request_status、request_detail、extra_info、failed_reason 和 result,其中 request_detail 与 result 内部的字段按操作类型不同。
投递与重试
某次投递失败后,节点等待sleep_seconds 再重试,最多重试 retry_times 次。间隔固定,不会随重试次数增长。
以下行为对每台已配置的服务器都适用:
- 将
retry_times设为0表示无限重试,直到推送成功或节点停止。 - 节点在首次尝试前将事件写入数据库,状态为
pending。节点重启后会恢复投递,最多恢复 1000 条待推送事件。 - 推送成功后节点删除该事件记录;重试次数用尽后将该事件标记为
failed。
event_id 去重。
下表说明两个重试参数如何配合:
健康检查
当monitor_interval 非空时,节点会定期向每台事件服务器发送 ping 请求:
package_data 中的 event_type 为 ping。ping 失败时节点最多重试 2 次,间隔 3 秒。
请将 ping 与业务事件分开处理:返回 200 OK 即可,无需其他处理。
实现接收服务器
Cobo 提供 Go 与 Java 两个事件服务器模板,您可以克隆后填入自己的业务逻辑:- 仓库地址:cobo-mpc-callback-server-v2-template
- Go 实现:
cobo-mpc-event-server-golang/ - Java 实现:
cobo-mpc-event-server-java/
- 监听
POST /v2/event,从TSS_JWT_MSG表单字段中读取 JWT。 - 使用节点的 RSA 公钥(存放于
configs/tss-node-event-pub.key)验签,验签失败时返回400 Bad Request。 - 从
package_dataclaim 中解码出事件 JSON。 - 使用
cobo-waas2SDK 反序列化为TSSEvent,再按事件类型分发处理。 - 处理成功返回
200 OK。ping事件直接返回200 OK,无需其他处理。
README.md 与源码。
推荐配置
以下配置可避免关键事件被丢弃,并将token_expire_minutes 设得高于 request_timeout,使 token 不会在请求超时之前先过期:
sleep_seconds 较大时,请相应提高 token_expire_minutes。
常见问题
如何获取用于验签的公钥?
如何获取用于验签的公钥?
在节点上运行
./tss-node event key info,该命令以 PEM 格式输出公钥。将该公钥配置到接收服务器。同一事件会被重复投递吗?
同一事件会被重复投递吗?
会。网络失败,或您的服务器未返回
200 OK 或 201 Created 时,节点会重试。请按 event_id(UUID)去重。节点重启后未投递成功的事件会丢失吗?
节点重启后未投递成功的事件会丢失吗?
不会。节点在首次投递前会将事件以
pending 状态写入数据库,重启后恢复投递。retry_times 设为 0 与不配置有何区别?
retry_times 设为 0 与不配置有何区别?
设为
0 表示无限重试;不配置则使用默认值 60。token_expire_minutes 应该设为多少?
token_expire_minutes 应该设为多少?
建议设为 2 到 5 分钟,并保持高于
request_timeout,使 token 不会在请求超时之前先过期。当 sleep_seconds 较大时应进一步提高,因为节点在每次重试时都会重新生成 JWT。可以配置多台接收服务器吗?
可以配置多台接收服务器吗?
可以。在
server 下为每台服务器添加一个条目,各服务器独立接收事件、独立重试。