2017-10-18 4 views
0

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": []]] 
} 
+0

Pouvez-vous publier l'appel API? Vous semblez initier un 'InitiatorFlow', que je ne vois pas défini ci-dessus. – joel

+0

Désolé. J'ai mis à jour ma question avec l'appel API et corriger l'erreur de flux. – codeviper

+0

Comment utilisez-vous les nœuds pour tester l'API? – joel

Répondre

0

Il semble y avoir quelques problèmes avec le code affiché:

  • L'annotation doit être @StartableByRPC, et non @StartableNByRPC
  • Le prix passé à startTrackedFlow doit être long, pas un entier

Cependant, même après avoir résolu ces problèmes, je n'ai pas pu répliquer votre erreur. Pouvez-vous appliquer ces correctifs, faire un redéploiement propre de vos nœuds (gradlew clean deployNodes), et voir si l'erreur change?

+0

Merci d'avoir regardé dans le problème. J'ai fait les correctifs et ai gradlew cleanNodes propres. Mais, je vois la même erreur. Ai-je besoin d'ajouter les nœuds dans le cadre des autorisations dans la tâche deployNodes? ou est-ce que je manque une autre étape? – codeviper

+0

Pouvez-vous mettre à jour les exemples de code dans la question pour corriger les erreurs et montrer comment vous obtenez l'autre partie dans l'API? – joel

+0

Correction des échantillons de code et ajout de code pour obtenir l'autre partie. – codeviper

0

Vous ne devez pas vous connecter à l'autre noeud via RPC. RPC est la façon dont le propriétaire d'un nœud parle à son nœud. Dans le monde réel, vous n'avez pas les informations d'identification RPC de l'autre nœud et vous ne pouvez pas vous connecter au nœud de cette manière.

Au lieu de cela, vous devez utiliser votre propre client RPC de nœud pour récupérer l'identité de la contrepartie:

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

Voir un exemple M14 ici: https://github.com/corda/cordapp-example/blob/release-M14/kotlin-source/src/main/kotlin/com/example/api/ExampleApi.kt.

+0

Cela a du sens. Merci. – codeviper