Можете ли вы создать сеанс потока для нескольких участников в Corda? - PullRequest
0 голосов
/ 27 февраля 2020

Я пытался изучить Corda, и у меня есть конкретный c вариант использования для контракта, в котором участвовало несколько участников. Простите, если мое понимание неверно, и, пожалуйста, поправьте меня, если я ошибаюсь! :)

Насколько я понимаю, в контракте мы реализуем функцию проверки транзакции, которая вызывает указанный контракт. Состояние может содержать «состояние» текущей транзакции вместе с любыми данными, касающимися транзакции. Поток - это бизнес-логика c, связанная с состоянием / контрактом.

У меня есть конкретный c вариант использования, который я хочу рассмотреть в контракте, и в нем участвуют несколько сторон, которые совместно используют один и тот же информация о контракте / транзакции. Я хочу, чтобы в состоянии могли находиться несколько участников.

Чисто из того, что я понимаю, я кодировал следующее для состояния:

@BelongsToContract(MasterContract.class)
public class MasterState implements ContractState {

    private final List<Party> employers = emptyList();
    private final List<Party> contractors = emptyList();
    private final String projectName;

    public MasterState(String projectName, List<Party> employers, List<Party> contractors) {
        this.projectName = projectName;
        this.employers.addAll(employers);
        this.contractors.addAll(contractors);
    }

    public String getProjectName() {
        return projectName;
    }

    public List<Party> getEmployers() {
        return employers;
    }

    public List<Party> getContractors() {
        return contractors;
    }

    @Override
    public List<AbstractParty> getParticipants() {
        List<AbstractParty> allParts = new ArrayList<>();
        allParts.addAll(employers);
        allParts.addAll(contractors);
        return allParts;
    }
}

Я хочу иметь возможность создавать ( через команду) новый экземпляр MasterContract, предоставив несколько «работодателей» или «подрядчиков». Я пытаюсь определить: MasterCreationFlow.call() следующим образом:

@Suspendable
    @Override
    public Void call() throws FlowException {
        Party notary = getServiceHub().getNetworkMapCache().getNotaryIdentities().get(0);

        // Create the transaction components
        JCTMasterState outputState = new JCTMasterState(projectName, Arrays.asList(getOurIdentity()), contractors);

        //List of required signers:
        List<PublicKey> requiredSigners = Arrays.asList(getOurIdentity().getOwningKey());
        requiredSigners.addAll(getOwningKeys(contractors));

        Command createCommand = new Command<>(new JCTMasterContract.Create(), requiredSigners);
...

Однако я застрял с идеей InitiateFlow(). Похоже, что вы можете сделать это только между двумя сторонами. Я понимаю, что Корда - точка-точка. Но я хочу понять, что именно FlowSession делает? До сих пор я читал, что FlowSession - это всего лишь канал между двумя сторонами, который затем используется некоторым подпотоком. Есть ли способ расширить FlowSession для создания общего сеанса между несколькими контрагентами? Или мне придется инициировать несколько потоков?

Заранее спасибо!

1 Ответ

0 голосов
/ 27 февраля 2020

Вы правы, что FlowSession находится между двумя сторонами, то есть стороной, вызывающей метод initiateFlow(someParty) и someParty.

Итак, чтобы вы могли создать несколько сеансов между инициатором потока и вашими подрядчиками, вы можете сделать это:

Set<FlowSession> sessions = contractors.stream().map(it -> 
                            initiateFlow(it)).collect(Collectors.toSet());

Затем, например, вы можете передать сеансы для сбора подписей от подрядчики:

final SignedTransaction fullySignedTx = subFlow(new CollectSignaturesFlow(partSignedTx, 
                                    sessions, CollectSignaturesFlow.Companion.tracker()));
...