You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Corda中SendStateAndRefFlow使用及SGX兼容性、状态存储问题问询

问题解答

关于SendStateAndRefFlow与SGX适配的有效性说明

Mike的说法针对Corda 4.x及后续规划版本仍然有效。SendTransactionFlow的核心逻辑是传输完整签名交易,接收方基于交易验证规则自动存储相关状态;而SGX账本加密模式下,交易的敏感字段会做加密处理,完整交易传输的模式需要额外适配解密、权限校验逻辑,后续迁移成本更高。SendStateAndRefFlow仅传输业务所需的StateAndRef及对应的依赖交易链,和SGX的细粒度数据授权逻辑更匹配,确实能减少未来支持SGX时的迁移工作量。
你不需要完全避免使用SendTransactionFlow/ReceiveTransactionFlow:如果当前业务没有明确的SGX落地规划,原有模式可以继续正常使用;如果后续有支持SGX的计划,优先使用SendStateAndRefFlow系列接口更合理。

关联EvolvableTokenType的存储与调用方案

你遇到的报错是因为ReceiveStateAndRefFlow默认仅将依赖交易存入交易存储库,不会自动把状态写入节点Vault,且你当前仅传输了FungibleToken的StateAndRef,对应的EvolvableTokenType并没有同步传输到接收方节点,导致构造交易时无法索引到该LinearState。可按以下步骤处理:

  • 发送侧同步传输关联的EvolvableTokenType
    发送方调用SendStateAndRefFlow时,除了传入FungibleToken的StateAndRef列表,还要把对应的EvolvableTokenType的StateAndRef一起传入,确保接收方能拿到完整的依赖状态数据。
  • 接收侧手动将状态写入Vault
    接收方拿到所有StateAndRef后,主动调用Vault服务的记录接口持久化状态,示例代码如下:
// 接收所有StateAndRef,包含FungibleToken和对应的EvolvableTokenType
List<StateAndRef<ContractState>> allReceivedStates = subFlow(new ReceiveStateAndRefFlow<>(otherSideSession));
// 按类型筛选状态
List<StateAndRef<EvolvableTokenType>> evoTokenTypeList = allReceivedStates.stream()
        .filter(sar -> sar.getState().getData() instanceof EvolvableTokenType)
        .map(sar -> (StateAndRef<EvolvableTokenType>) sar)
        .collect(Collectors.toList());
List<StateAndRef<FungibleToken>> fungibleTokenList = allReceivedStates.stream()
        .filter(sar -> sar.getState().getData() instanceof FungibleToken)
        .map(sar -> (StateAndRef<FungibleToken>) sar)
        .collect(Collectors.toList());
// 手动写入Vault
List<ContractState> toRecordStates = Stream.concat(evoTokenTypeList.stream(), fungibleTokenList.stream())
        .map(sar -> sar.getState().getData())
        .collect(Collectors.toList());
getServiceHub().getVaultService().recordStates(StatesToRecord.ALL_VISIBLE, toRecordStates);
  • 构造交易时按需添加参考状态
    如果交易逻辑需要引用EvolvableTokenType,要显式将其作为参考状态加入TransactionBuilder:
txBuilder.addInputState(fungibleTokenList.get(0));
txBuilder.addReferenceState(new ReferencedStateAndRef<>(evoTokenTypeList.get(0)));

以上步骤执行完成后,EvolvableTokenType会被正常存入接收方Vault,交易构造时不会再出现状态未知的报错。

内容的提问来源于stack exchange,提问作者Tywin Lannister

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 00:24:06