Dans le didacticiel, il est mentionné qu'un nœud peut demander à l'autre partie d'interroger son emplacement de stockage et d'obtenir les résultats requis. Y a-t-il une API qui peut être utilisée pour intégrer cette logique dans le flux? Aussi, est-il possible de demander à nos contreparties de recueillir des contributions de leurs contreparties et de retourner les résultats cumulatifs. Veuillez partager l'exemple de code, le cas échéant. Merci.Corda: collecte des entrées provenant d'autres correspondants du réseau
0
A
Répondre
1
Il n'y a pas d'API spécialisée. Vous utilisez simplement les appels FlowSession.send
/FlowSession.receive
/FlowSession.sendAndReceive
standard.
Cependant, lors de la réception des données de la contrepartie (généralement soit un SignedTransaction
ou un StateAndRef
), assurez-vous de résoudre sa chaîne de dépendance à l'aide ResolveTransactionsFlow
afin que vous puissiez vérifier qu'il a été créé par une séquence valide des transactions.
Il existe également une paire SendTransactionFlow
/ReceiveTransactionFlow
intégrée qui automatise le processus de réception d'une transaction, de déballage et de résolution de ses dépendances.
Voici un exemple d'un noeud recevant un StateAndRef<ContractState>
envoyé par une contrepartie:
@InitiatingFlow
@StartableByRPC
class Initiator(private val counterparty: Party) :
FlowLogic<StateAndRef<ContractState>>() {
@Suspendable
override fun call(): StateAndRef<ContractState> {
val counterpartySession = initiateFlow(counterparty)
// Our flow will suspend and wait for a StateAndRef from the counterparty.
val untrustedData = counterpartySession.receive<StateAndRef<ContractState>>()
// Data received off the wire is considered untrustworthy, and must be unwrapped.
val stateAndRef = untrustedData.unwrap { stateAndRef ->
// We resolve the chain of transactions that generated this StateAndRef.
subFlow(ResolveTransactionsFlow(setOf(stateAndRef.ref.txhash), counterpartySession))
// TODO: More checking of what we've received.
stateAndRef
}
return stateAndRef
}
}
@InitiatedBy(Initiator::class)
class Responder(val counterpartySession: FlowSession) : FlowLogic<Unit>() {
@Suspendable
override fun call() {
// We extract the first StateAndRef in our vault...
val stateAndRef = serviceHub.vaultService.queryBy(ContractState::class.java).states.first()
// ...and send it to our counterparty.
counterpartySession.send(stateAndRef)
}
}