J'ai une application Corda qui utilise M14 pour générer et exécuter corda pour exécuter un protocole TwoPartyProtocol où les deux parties peuvent échanger des données pour atteindre un consensus de validité des données. J'ai suivi Corda flow cookbook pour créer un flux. De plus, après avoir lu les docs de plusieurs jalons corda différents, j'ai compris que M14 n'a plus besoin de flowSessions comme mentionné dans le release notes ce qui élimine également la nécessité d'enregistrer des services.Corda: Demande de session rejetée par le parti car le demandeur n'a pas été enregistré
Mon TwoPartyFlow avec FlowLogics interne:
class TwoPartyFlow{
@InitiatingFlow
@StartableByRPC
open class Requestor(val price: Long,
val otherParty: Party) : FlowLogic<SignedTransaction>(){
@Suspendable
override fun call(): SignedTransaction {
val notary = serviceHub.networkMapCache.notaryNodes.single().notaryIdentity
send(otherParty, price)
/*Some code to generate SignedTransaction*/
}
}
@InitiatedBy(Requestor::class)
open class Responder(val requestingParty : Party) : FlowLogic<SignedTransaction>(){
@Suspendable
override fun call(): SignedTransaction {
val request = receive<Long>(requestor).unwrap { price -> price }
println(request)
/*Some code to generate SignedTransaction*/
}
}
}
Mais, en cours d'exécution ci-dessus en utilisant startTrackedFlow de api provoque l'erreur ci-dessus:
Party CN=Other,O=Other,L=NY,C=US rejected session request: com.testapp.flow.TwoPartyFlow$Requestor has not been registered
J'ai eu du mal à trouver la raison de documents ou les journaux corda depuis que les implémentations de flux de deux parties ont changé parmi plusieurs jalons de corda. Quelqu'un peut-il m'aider à comprendre le problème ici.
Mon appel API:
@GET
@Path("start-flow")
fun requestOffering(@QueryParam(value = "price") price: String) : Response{
val price : Long = 10L
/*Code to get otherParty details*/
val otherPartyHostAndPort = HostAndPort.fromString("localhost:10031")
val client = CordaRPCClient(otherPartyHostAndPort)
val services : CordaRPCOps = client.start("user1","test").proxy
val otherParty: Party = services.nodeIdentity().legalIdentity
val (status, message) = try {
val flowHandle = services.startTrackedFlow(::Requestor, price, otherParty)
val result = flowHandle.use { it.returnValue.getOrThrow() }
// Return the response.
Response.Status.CREATED to "Transaction id ${result.id} committed to ledger.\n"
} catch (e: Exception) {
Response.Status.BAD_REQUEST to e.message
}
return Response.status(status).entity(message).build()
}
Mon Gradle tâche deployNodes:
task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['build']) {
directory "./build/nodes"
networkMap "CN=Controller,O=R3,OU=corda,L=London,C=UK"
node {
name "CN=Controller,O=R3,OU=corda,L=London,C=UK"
advertisedServices = ["corda.notary.validating"]
p2pPort 10021
rpcPort 10022
cordapps = []
}
node {
name "CN=Subject,O=Subject,L=NY,C=US"
advertisedServices = []
p2pPort 10027
rpcPort 10028
webPort 10029
cordapps = []
rpcUsers = [[ user: "user1", "password": "test", "permissions": []]]
}
node {
name "CN=Other,O=Other,L=NY,C=US"
advertisedServices = []
p2pPort 10030
rpcPort 10031
webPort 10032
cordapps = []
rpcUsers = [[ user: "user1", "password": "test", "permissions": []]]
}
Pouvez-vous publier l'appel API? Vous semblez initier un 'InitiatorFlow', que je ne vois pas défini ci-dessus. – joel
Désolé. J'ai mis à jour ma question avec l'appel API et corriger l'erreur de flux. – codeviper
Comment utilisez-vous les nœuds pour tester l'API? – joel