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
相关产品推荐
相关产品推荐

