Corda: request de session rechazada por la Parte ya que el solicitante no se ha registrado

Tengo una aplicación Corda que usa M14 para build y ejecutar corda para ejecutar un TwoPartyProtocol donde cualquiera de las partes puede intercambiar datos para alcanzar un consenso de validez de datos. Seguí el libro de cocina Corda flow para build un flujo.

Además, después de leer los documentos de varios hitos de corda diferentes, he entendido que M14 ya no necesita FlowSessions como se menciona en las notas de la versión, lo que también elimina la necesidad de registrar services.

Mi TwoPartyFlow con FlowLogics interno:

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*/ } } } 

Pero, ejecutar lo anterior utilizando startTrackedFlow desde Api causa el error anterior:

 Party CN=Other,O=Other,L=NY,C=US rejected session request: com.testapp.flow.TwoPartyFlow$Requestor has not been registenetworking 

Me costó encontrar el motivo de los documentos o loggings de Corda desde que las implementaciones de flujo de Dos Partes han cambiado entre varios Hitos de corda. ¿Alguien puede ayudarme a entender el problema aquí?

Mi llamada 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() } 

Mi tarea Gradle 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": []]] } 

Parece que hay un par de problemas con el código que publicaste:

  • La anotación debe ser @StartableByRPC , no @StartableNByRPC
  • El precio pasado a startTrackedFlow debe ser largo, no int

Sin embargo, incluso después de solucionar estos problemas, no pude replicar su error. ¿Puede aplicar estas correcciones, hacer una nueva implementación limpia de sus nodos ( gradlew clean deployNodes ) y ver si el error cambia?

No debe conectarse al otro nodo a través de RPC. RPC es cómo el dueño de un nodo habla a su nodo. En el mundo real, no tendría las cnetworkingenciales RPC del otro nodo y no podría iniciar session en el nodo de esta manera.

En su lugar, debe usar el cliente RPC de su propio nodo para recuperar la identidad de la contraparte:

val otherParty = services.partyFromX500Name("CN=Other,O=Other,L=NY,C=US")!!

Vea un ejemplo de M14 aquí: https://github.com/corda/cordapp-example/blob/release-M14/kotlin-source/src/main/kotlin/com/example/api/ExampleApi.kt .

  • Una list de files descargados es nula
  • ¿Cómo obtengo la identificación del documento de Firestre utilizando las classs de datos de kotlin?
  • Dagger 2 multibindings con Kotlin
  • android.view.InflateException: file XML binary línea # 32: file XML binary línea # 32: class de inflado de error
  • Scala require () equivalente en Kotlin
  • Determinar si una instancia es una instancia de una class de datos
  • Kotlin: ¿Cómo modificar un valor en un par?
  • Error al usar IntDef definido en Kotlin cuando se usa en Java
  • ¿Cómo ejecuto testings comstackndo un file kotlin en la memory y verifico el resultado?
  • Publique la biblioteca de Kotlin (no Android) en jCenter
  • Extensiones y variables de Kotlin para Android