Corda Flow签署规则及非Linear ID检索状态的技术咨询
我来逐个拆解你这些关于Corda的问题,给你实用的解答:
1. 接受Corda Flow时,对方能否手动签署交易?
当然可以实现手动签署的逻辑!在Corda的Flow设计中,接收方节点完全可以暂停Flow的自动执行流程,先等待用户通过前端界面、本地控制台或者自定义的交互工具核对交易内容——比如查看涉及的资产金额、参与方、合约条款等细节。等用户确认无误后,再调用sign()方法完成签署动作。
举个简单的实现思路:你可以在接收方的Flow里引入一个自定义的用户交互服务,核心代码示例如下:
// 接收方Flow中的关键代码 val transaction = receive<SignedTransaction>(otherParty).unwrap { it } // 等待用户手动确认交易 val userApproval = serviceHub.cordaService(UserApprovalService::class.java).waitForUserConfirmation(transaction) if (userApproval) { val signedTx = serviceHub.signInitialTransaction(transaction, ourIdentity.owningKey) // 继续后续Flow流程 } else { // 用户拒绝交易,终止Flow throw FlowException("User rejected the transaction request") }
这里的UserApprovalService是你自己实现的服务,负责和用户交互获取确认指令,完全可以做到让用户手动触发签署动作。
2. 提议流与接受/拒绝操作的签署要求
针对这个问题分两部分说明:
- 提议流是否需要双方共同签署?
这完全取决于你的业务规则和合约的约束逻辑。如果你的合约在verify()方法中明确要求交易必须包含双方的签名才能生效,那提议流就必须由双方共同签署——比如常见的资产转账场景,发起方创建交易后,接收方验证无误签署,最后由公证节点完成公证。但如果是一些单向的告知类状态(比如发起方发布的公告),合约可能只要求发起方的签名即可,这种情况就不需要双方签署。 - 接受/拒绝操作是否需要双方签署?
接受操作本质是对提议交易的认可,所以如果合约要求双方签名,接收方的接受动作必然伴随着签署操作。而拒绝操作一般不需要签署——因为拒绝意味着交易不会被提交到账本,只是在Flow层面终止交互,不需要生成有效的账本状态,自然不需要双方签名确认。当然,如果你需要把“拒绝”这个动作也记录到账本里(比如生成一个拒绝状态),那可以自定义业务逻辑让双方签署,但这不是Corda的默认行为。
3. 如何使用Linear ID以外的属性检索状态?
Corda的Vault提供了灵活的查询能力,你可以基于状态的任意持久化属性来检索,步骤如下:
- 确保属性可持久化:在定义你的状态类时,要用来检索的属性需要在对应的
PersistentStateschema中定义(或者用@Column标记为持久化字段)。比如你的状态类YourState对应的schema里,要包含你想查询的customProperty字段。 - 构建自定义查询条件:使用
VaultQueryCriteria和QueryCriteria.VaultCustomQueryCriteria来拼接查询条件,示例代码如下:
// 构建查询条件:查找customProperty等于targetValue的所有YourState活跃状态 val customCriteria = QueryCriteria.VaultCustomQueryCriteria( Builder.equal(YourStateSchemaV1.PersistentYourState::customProperty, targetValue) ) // 结合状态状态(这里仅查询未消费的活跃状态) val vaultCriteria = VaultQueryCriteria(Vault.StateStatus.UNCONSUMED).and(customCriteria) // 执行查询 val queryResults = serviceHub.vaultService.queryBy<YourState>(vaultCriteria) // 获取匹配的状态列表 val matchingStates = queryResults.states
如果需要更复杂的查询(比如模糊匹配、多条件组合),可以使用Builder类的like()、and()、or()等方法来组合条件。另外,建议给常用的查询属性在数据库中建立索引,这样能大幅提升查询效率。
内容的提问来源于stack exchange,提问作者userAG




