HyperLeger Sawtooth поддерживает подписку на события в процессоре транзакций. Однако есть способ создать специфичные для приложения события в Transaction Processor, как в примере с Python: https://www.jacklllll.xyz/blog/2019/04/08/sawtooth/
ctx.addEvent(
'agreement/create',
[['name', 'agreement'],
['address', address],
['buyer name', agreement.BuyerName],
['seller name', agreement.SellerName],
['house id', agreement.HouseID],
['creator', signer]],
null)
В текущем Sawtooth-Java SDK v0.1.2 единственным переопределением является
apply(TpProcessRequest, State)
Без контекста. Однако по документации здесь: https://github.com/hyperledger/sawtooth-sdk-java/blob/master/sawtooth-sdk-transaction-processor/src/main/java/sawtooth/sdk/processor/TransactionHandler.java
addEvent(TpProcessRequest, Context)
Пока мне удалось прослушать события sawtooth/state-delta
, однако это дает мне все изменения состояния этого tx-family
import sawtooth.sdk.protobuf.EventSubscription;
import sawtooth.sdk.protobuf.EventFilter;
import sawtooth.sdk.protobuf.ClientEventsSubscribeRequest;
import sawtooth.sdk.protobuf.ClientEventsSubscribeResponse;
import sawtooth.sdk.protobuf.ClientEventsUnsubscribeRequest;
import sawtooth.sdk.protobuf.Message;
EventFilter filter = EventFilter.newBuilder()
.setKey("address")
.setMatchString(nameSpace.concat(".*"))
.setFilterType(EventFilter.FilterType.REGEX_ANY)
.build();
EventSubscription subscription = EventSubscription.newBuilder()
.setEventType("sawtooth/state-delta")
.addFilters(filter)
.build();
context = new ZContext();
socket = context.createSocket(ZMQ.DEALER);
socket.connect("tcp://sawtooth-rest:4004");
ClientEventsSubscribeRequest request = ClientEventsSubscribeRequest.newBuilder()
.addSubscriptions(subscription)
.build();
message = Message.newBuilder()
.setCorrelationId("123")
.setMessageType(Message.MessageType.CLIENT_EVENTS_SUBSCRIBE_REQUEST)
.setContent(request.toByteString())
.build();
socket.send(message.toByteArray());
Как только Message.MessageType.CLIENT_EVENTS_SUBSCRIBE_REQUEST
зарегистрирован, я получаю сообщения в потоке.
Я надеялся, что в TransactionHandler я смогу addEvent()
или создать какой-либо тип события, на которое можно подписаться, используя Java SDK.
Кто-нибудь еще пробовал создавать пользовательские события в JAVA на Sawtooth?