You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 07:02:29