在Corda中,一方如何与另一方共享其保管库中的现有状态?

时间:2018-11-16 13:45:45

标签: corda

假设有两个节点,爱丽丝和鲍勃。爱丽丝想让鲍勃知道她的状态。爱丽丝如何将状态发送给鲍勃,然后让他将其存储在金库中?

1 个答案:

答案 0 :(得分:0)

您将同时需要发起者流程和响应者流程:

  • 发起者将从其保管库中检索状态,检索创建此状态的交易,并将交易发送给交易对手进行记录
  • 响应者将记录交易,并存储其所有状态

启动器流程

@InitiatingFlow
@StartableByRPC
public class Initiator extends FlowLogic<Void> {
    private final UUID stateId;
    private final Party otherParty;

    private final ProgressTracker progressTracker = new ProgressTracker();

    public Initiator(UUID stateId, Party otherParty) {
        this.stateId = stateId;
        this.otherParty = otherParty;
    }

    @Override
    public ProgressTracker getProgressTracker() {
        return progressTracker;
    }

    @Suspendable
    @Override
    public Void call() throws FlowException {
        // Find the correct state.
        LinearStateQueryCriteria criteria = new LinearStateQueryCriteria(null, Collections.singletonList(stateId));
        Vault.Page<IOUState> queryResults = getServiceHub().getVaultService().queryBy(IOUState.class, criteria);
        if (queryResults.getStates().size() != 1)
            throw new IllegalStateException("Not exactly one match for the provided ID.");
        StateAndRef<IOUState> stateAndRef = queryResults.getStates().get(0);

        // Find the transaction that created this state.
        SecureHash creatingTransactionHash = stateAndRef.getRef().getTxhash();
        SignedTransaction creatingTransaction = getServiceHub().getValidatedTransactions().getTransaction(creatingTransactionHash);

        // Send the transaction to the counterparty.
        final FlowSession counterpartySession = initiateFlow(otherParty);
        subFlow(new SendTransactionFlow(counterpartySession, creatingTransaction));

        return null;
    }
}

响应流

@InitiatedBy(Initiator.class)
public class Responder extends FlowLogic<Void> {
    private final FlowSession counterpartySession;

    public Responder(FlowSession counterpartySession) {
        this.counterpartySession = counterpartySession;
    }

    @Suspendable
    @Override
    public Void call() throws FlowException {
        // Receive the transaction and store all its states.
        // If we don't pass `ALL_VISIBLE`, only the states for which the node is one of the `participants` will be stored.
        subFlow(new ReceiveTransactionFlow(counterpartySession, true, StatesToRecord.ALL_VISIBLE));

        return null;
    }
}