当前位置: 首页 > 知识库问答 >
问题:

R3 Corda-java.lang.IllegalArgumentException: CollectSignaturesFlow的发起者必须已经签署了交易

左丘宜年
2023-03-14

我编写了以程,以促进两方之间的交易 - 发行人和订阅者。我在收集交易对手的签名阶段一直收到此错误:

java.lang.IllegalArgumentException:CollectSignaturesFlow的发起人必须对事务进行签名。

堆栈跟踪:

java.lang.IllegalArgumentException: The Initiator of CollectSignaturesFlow must have signed the transaction.
    at net.corda.core.flows.CollectSignaturesFlow.call(CollectSignaturesFlow.kt:89) ~[corda-core-3.3-corda.jar:?]
    at net.corda.core.flows.CollectSignaturesFlow.call(CollectSignaturesFlow.kt:64) ~[corda-core-3.3-corda.jar:?]
    at net.corda.core.flows.FlowLogic.subFlow(FlowLogic.kt:290) ~[corda-core-3.3-corda.jar:?]
    at com.sample.flow.sampleFlow$Initiator.call(sampleFlow.kt:106) ~[main/:?]
    at com.sample.flow.sampleFlow$Initiator.call(sampleFlow.kt:30) ~[main/:?]
    at net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:96) [corda-node-3.3-corda.jar:?]
    at net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:44) [corda-node-3.3-corda.jar:?]
    at co.paralleluniverse.fibers.Fiber.run1(Fiber.java:1092) [quasar-core-0.7.9-jdk8.jar:0.7.9]
    at co.paralleluniverse.fibers.Fiber.exec(Fiber.java:788) [quasar-core-0.7.9-jdk8.jar:0.7.9]
    at co.paralleluniverse.fibers.RunnableFiberTask.doExec(RunnableFiberTask.java:100) [quasar-core-0.7.9-jdk8.jar:0.7.9]
    at co.paralleluniverse.fibers.RunnableFiberTask.run(RunnableFiberTask.java:91) [quasar-core-0.7.9-jdk8.jar:0.7.9]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_181]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_181]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [?:1.8.0_181]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [?:1.8.0_181]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_181]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_181]
    at net.corda.node.utilities.AffinityExecutor$ServiceAffinityExecutor$1$thread$1.run(AffinityExecutor.kt:62) [corda-node-3.3-corda.jar:?]

我的暗号:flow.kt

progressTracker.currentStep = GATHERING_SIGS
val participantsParties = sampleState.participants.map { serviceHub.identityService.wellKnownPartyFromAnonymous(it)!! }
val flowSessions = (participantsParties - serviceHub.myInfo.legalIdentities.get(0)).map { initiateFlow(it) }.toSet()
val fullySignedTx = subFlow(CollectSignaturesFlow(partSignedTx, flowSessions, listOf(ourSigningKey), GATHERING_SIGS.childProgressTracker()))

我尝试了在线提供的解决方案,即:

    < li >将各方的会话作为参数添加到< code > collectsignatureflow < li >我尝试了文档中提到的< code > collectsignatureflow 的所有构造函数

我不知道我错在哪里。有人能帮我一下吗?提前感谢!

共有1个答案

吴展
2023-03-14

你的解决方案是错误的;我将使用< code>cordapp-example流程演示两方(或多方)如何签署交易:

  1. 首先,流应包含 2 个部分:发起方响应方
  2. 假设您的颁发者是启动发起方的一方,则您的订阅者是运行响应方的参与方
  3. 颁发者首先创建标识输入、输出、命令和所需签名者的事务。
  4. 发行人签署交易,注意结果如何称为partSignedTx;这是因为订阅者尚未签名。
  5. 颁发者创建一个与订阅者的会话,以用作通信通道,通过该通道,他们收集订阅者的签名(您不会像创建自己的会话,而只是与其他人创建会话)。
  6. 颁发者使用该会话从订户请求签名。
  7. 响应程序流内的订阅者对事务进行签名。
  8. 启动流中的颁发者接收签名。收集签名流具有发送(发送要签名的事务)和接收(接收签名)。请注意结果如何称为 fullSignedTx,因为现在颁发者和订阅者都对事务进行了签名。
 类似资料:
  • 在定点数学中,我使用了大量16位信号,并用32位中间结果进行乘法运算。例如: 假设a是一个q14数,那么c与b的比例相同。 这很好,适用于有符号和无符号算术。 问题是:如果我混合类型会发生什么?例如,如果我知道乘数“a”总是在 0.0 到 1.0 之间,那么很容易使其成为无符号的 int q15 以获得额外的精度(并将移位计数更改为 15)。但是,我从来不明白如果您尝试在 C 中将有符号和无符号数

  • web3.eth.sendSignedTransaction()方法用来发送已经签名的交易,例如,可以使用web3.eth.accounts.signTransaction() 方法进行签名。 调用: web3.eth.sendSignedTransaction(signedTransactionData [, callback]) 参数: signedTransactionData:Strin

  • 在使用PHP的本机password_hash()函数时,我必须(或应该)生成自己的salt,尽管(据我所知),它已经可以创建salt,如本例所示(由http://www.php.net): 目前,我一直在使用sha512进行散列,并生成38,500个字符盐。(我不确定字符计数是否真的重要,所以我还是试了试...它似乎奏效了,比如允许我成功注册和登录用户,但我不知道它的全部安全缺陷)类似这样的东西:

  • 学习如何使用其他语言开发自己的模块,并且通过各种插件来扩展Ansible.探索Ansible的Python API,并且编写Python插件,将其结合到你自己系统的各种解决方案中,这是非常有意义的. Python API 开发动态的Inventory数据源 Developing Modules Developing Plugins 帮助测试PR 开发者同时可能也对完全发现感兴趣,可以参考 Ansi

  • 开发者须知 简介 本部分主要介绍百度网盘开放平台的接入流程,主要包括申请appid和获取用户授权。获取授权后,即可根据开发需求,依照接口的使用规则进行相应的开发。 接入流程 1.成为开发者 step1:使用百度账号登录开放平台官网 请在官网首页右上角找到登录入口,使用百度账号进行登录。如果您还没有百度账号,请按照百度账号统一注册流程进行注册。 step2: 申请账号认证并接入 登录后,点击官网首页

  • 签署以太坊交易 要使脱机签名交易得到签署,需要设定一个RawTransaction类型。RawTransaction类似于前面提到的Transaction类型,但是它不需要通过具体的账号地址来请求,因为可以从签名中推断出来。 为了创建和签署原生交易,交易的顺序如下: 1.确定交易发起者帐户的下一个可用随机数nonce 2.创建RawTransaction对象 3.使用递归长度前缀编码(RLP即Re