Corda Walking the Chain в финалеFlow - PullRequest
0 голосов
/ 15 ноября 2018

В Корде, FinalityFlow:

  1. Проверяет транзакцию на узле инициатора
  2. Нотариально заверяет транзакцию
  3. Сохраняется подписанная транзакция в хранилище инициатора
  4. Распределяет транзакцию по participants

Согласно консенсусу, проверка включает в себя обход цепи.

Я посмотрел в коде FinalityFlow. Где именно происходит прогулочная цепочка?

Нотариус и participants также ходят по цепочке? Если да, они проверяют подписи каждой транзакции в цепочке, но где именно в коде это происходит?

Насколько я понимаю, SendTransactionFlow отправляет транзакцию другим сторонам в списках participants. Другая сторона также запрашивает вложения и зависимости транзакций. Где на самом деле происходит прогулка?

Мне нужно понять, как ходить по цепочке с точки зрения кодирования.

1 Ответ

0 голосов
/ 15 ноября 2018

В FinalityFlow вызывающая сторона использует следующую строку для отправки нотариально заверенной транзакции в participants всех состояний:

subFlow(SendTransactionFlow(session, notarised))

Если мы посмотрим на AbstractNode.installCoreFlows, мы увидим, что узел устанавливает обработчик по умолчанию для FinalityFlow с именем FinalityHandler. FinalityHandler отвечает на вызов SendTransactionFlow в FinalityFlow, вызывая ReceiveTransactionFlow.

Внутри ReceiveTransactionFlow мы видим, что узел разрешает зависимости транзакции, проверяет транзакцию и проверяет ее подписи:

val stx = otherSideSession.receive<SignedTransaction>().unwrap {
    subFlow(ResolveTransactionsFlow(it, otherSideSession))
    it.verify(serviceHub, checkSufficientSignatures)
    it
}

Как часть разрешения зависимостей транзакции в ResolveTransactionsFlow, узел проверяет каждую и проверяет свои подписи (по умолчанию verify проверяет подписи в транзакции):

result.forEach {
    it.verify(serviceHub)
    serviceHub.recordTransactions(StatesToRecord.NONE, listOf(it))
}

Нотариус будет ходить по цепочке таким образом, только если он является проверяющим нотариусом.

...