Как создавать события канала, используя Sawtooth Java SDK? - PullRequest
0 голосов
/ 11 июня 2019

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?

1 Ответ

0 голосов
/ 12 июня 2019

Вот пример события, добавляемого в Python. Ява была бы похожа. Вы добавляете свое событие с пользовательским именем в свой обработчик транзакций:

context.add_event(event_type="cookiejar/bake", attributes=[("cookies-baked", amount)])

См. https://github.com/danintel/sawtooth-cookiejar/blob/master/pyprocessor/cookiejar_tp.py#L138

Вот примеры обработчиков событий, написанных на Python и Go: https://github.com/danintel/sawtooth-cookiejar/tree/master/events Ява также будет похожа. В основном логика в обработчике событий:

  1. Подписаться на события, которые вы хотите слушать
  2. Отправить запрос валидатору
  3. Прочитать и разобрать ответ подписки
  4. В цикле прослушивание подписанных событий в цикле
  5. После выхода из цикла (если вообще) отписаться от событий
...