You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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提供了灵活的查询能力,你可以基于状态的任意持久化属性来检索,步骤如下:

  1. 确保属性可持久化:在定义你的状态类时,要用来检索的属性需要在对应的PersistentState schema中定义(或者用@Column标记为持久化字段)。比如你的状态类YourState对应的schema里,要包含你想查询的customProperty字段。
  2. 构建自定义查询条件:使用VaultQueryCriteriaQueryCriteria.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

火山引擎 最新活动