求Hyperledger Sawtooth浏览器客户端应用订阅自定义事件(custom events)的JavaScript示例(由自定义交易处理器custom transaction processor触发)
Hyperledger Sawtooth JavaScript客户端订阅自定义事件示例
我来给你分享一个可直接参考的JavaScript客户端订阅自定义事件的实现,同时也补充下交易处理器端触发事件的关键代码,帮你端到端跑通功能:
1. 先安装依赖
首先确保你已经安装了Sawtooth的JavaScript SDK:
npm install sawtooth-sdk
2. 客户端订阅代码示例
这段代码会连接到Sawtooth节点的事件服务,订阅你自定义的事件类型:
const { EventClient, EventFilter, EventSubscription } = require('sawtooth-sdk/client/event'); const { CryptoFactory } = require('sawtooth-sdk/signing'); const secp256k1 = require('sawtooth-sdk/signing/secp256k1'); // 初始化加密工具(如果不需要签名验证可以跳过,根据你的需求调整) const context = secp256k1.createContext(); const privateKey = context.newRandomPrivateKey(); const signer = new CryptoFactory(context).newSigner(privateKey); // 连接到Sawtooth的事件服务(默认端口是40003,根据你的节点配置修改) const eventClient = new EventClient('ws://localhost:40003', signer); // 定义自定义事件过滤器:替换成你的事件类型,比如"my_custom_namespace/my_event_type" const eventFilter = new EventFilter( EventFilter.EVENT_TYPE_FILTER, ['my_custom_namespace/my_event_type'] // 与交易处理器触发的事件类型保持一致 ); // 创建事件订阅实例 const subscription = new EventSubscription(eventFilter); // 注册事件处理回调:收到事件时执行 eventClient.addEventCallback((events) => { console.log('收到自定义事件集合:', events); // 遍历处理每个事件 events.forEach(event => { // 解析事件数据,这里假设是UTF8字符串,你可以根据实际格式调整(比如JSON、Protobuf) const payload = event.data.toString('utf8'); console.log('当前事件Payload内容:', payload); // 在这里添加你的业务逻辑,比如更新前端页面状态 }); }); // 注册错误处理回调 eventClient.addErrorCallback((err) => { console.error('事件订阅出现错误:', err); }); // 启动事件订阅 eventClient.start([subscription]) .then(() => console.log('自定义事件订阅已成功启动')) .catch(err => console.error('启动订阅失败:', err));
3. 自定义交易处理器触发事件的关键代码
要让客户端收到事件,必须在你的自定义交易处理器中主动触发对应事件。下面是Python版本的TP示例(Sawtooth的TP常用Python开发,其他语言可对应调整):
from sawtooth_sdk.processor.core import TransactionProcessor from sawtooth_sdk.processor.handler import TransactionHandler from sawtooth_sdk.protobuf.events_pb2 import Event class MyCustomTransactionHandler(TransactionHandler): # 这里省略你的namespace、family名称等基础定义... def apply(self, transaction, context): # 执行你的交易核心处理逻辑... # 触发自定义事件 custom_event = Event( event_type="my_custom_namespace/my_event_type", # 与客户端订阅的类型完全匹配 data=b'{"status": "success", "transaction_id": "' + transaction.transaction_id.encode() + b'"}' # 事件数据可以是任意二进制格式,这里用JSON字符串示例 ) # 将事件添加到上下文,Sawtooth会把它推送给订阅的客户端 context.add_event(custom_event) # 交易处理器启动代码(省略)...
注意事项
- 确保客户端连接的事件服务地址/端口和节点配置一致,Sawtooth默认事件服务WS端口为40003
- 客户端订阅的事件类型必须和交易处理器触发的完全一致,否则无法收到事件
- 事件数据格式可灵活选择(JSON、Protobuf、二进制等),只需保证客户端和TP的解析/序列化逻辑对应即可
内容的提问来源于stack exchange,提问作者klautern
相关产品推荐
相关产品推荐

