Реализуйте ограничения, требующие от участников подписать транзакцию в коде IOUContract - PullRequest
0 голосов
/ 08 апреля 2020

Я просматривал учебные материалы Corda, и есть одно упражнение «Наложить ограничение на необходимые подписи в IOUContract.verify». Как реализовать это ограничение, требующее от участника (кредитора и заемщика) подписать сделку? Если кто-то знает, пожалуйста, дайте мне знать. Мой код:

    if (!((command.getSigners().contains(state.getLender().getOwningKey())) && (command.getSigners().contains(state.getBorrower().getOwningKey()))))
                    throw new IllegalArgumentException("Both lender and borrower together only may sign IOU issue transaction.");

Ответы [ 4 ]

1 голос
/ 08 апреля 2020

Ваш код выглядит как le git. Если вы не можете пройти тест, убедитесь, что получатель кредитора и заемщик указаны правильно в классе IOUState.

Если вы не уверены, вы можете посмотреть в этом примере класса контракта.

Также вы можете проверить здесь для альтернативного синтаксиса для реализации класса контракта.

0 голосов
/ 10 апреля 2020

Спасибо всем за подробное объяснение. Я реализовал приведенный ниже код, и теперь он работает нормально.

List<PublicKey> signers = tx.getCommands().get(0).getSigners();
HashSet<PublicKey> signersSet = new HashSet<>();
for (PublicKey key: signers) {signersSet.add(key);}

List<AbstractParty> participants = tx.getOutputStates().get(0).getParticipants();
HashSet<PublicKey> participantKeys = new HashSet<>();
for (AbstractParty party: participants) {participantKeys.add(party.getOwningKey());}

require.using("Both lender and borrower together only may sign IOU issue transaction.", signersSet.containsAll(participantKeys) && signersSet.size() == 2);
0 голосов
/ 08 апреля 2020
  1. В государственном контракте будет указано, кто является необходимыми подписавшими сторонами. В в этом примере контракт предполагает, что все участники (т.е. кредитор и заемщик) будут необходимыми подписавшими команды Create.
  2. Когда поток создает транзакцию для создания нового IOU, он должен указать , какую команду использовать (Create IOU в нашем случае); и кто подпишет эту команду (так что поток будет работать над сбором этих подписей).
  3. Поток проверит транзакцию перед ее подписанием, которая в свою очередь запустит контракт; если запрошенные подписи, указанные в команде Create внутри потока, не совпадают с тем, что контракт ожидает увидеть в качестве обязательных подписывающих лиц; тогда договор провалит транзакцию. В противном случае договор передаст транзакцию, и поток продолжит собирать подпись кредитора , затем собирать подпись заемщика .

Короче говоря, в контракте будет указано, кто является необходимыми подписавшими сторонами для определенной команды состояния, и поток, создающий транзакцию для этой комбинации состояния / команды, должен подчиняться правилам контракта, задавая тот же набор подписантов и сбор их подписей.

0 голосов
/ 08 апреля 2020

Код, который вы вставляете, взят из contract сетевого приложения. Вы начнете сбор подписей в потоке шнура приложения.

Давайте предположим, что в этой транзакции есть только кредитор и заемщик (без стороннего модератора), а кредитор является инициатором потока. Кредитор разработает состояние и подпишет его сам, и отправил половинную подписанную транзакцию заемщику через сеанс, а заемщик проверит его и подпишет через ответчика.

В этот момент у вас будет полностью подписанная транзакция. Что касается кода, я бы посоветовал вам взглянуть на это простое переговорное приложение для справки. https://github.com/corda/samples/blob/release-V4/negotiation-cordapp/workflows-kotlin/src/main/kotlin/negotiation/flows/AcceptanceFlow.kt

 val partStx = serviceHub.signInitialTransaction(txBuilder)

 // Gathering the counterparty's signature.
 val counterparty = if (ourIdentity == input.proposer) input.proposee else input.proposer
 val counterpartySession = initiateFlow(counterparty)
 val fullyStx = subFlow(CollectSignaturesFlow(partStx, listOf(counterpartySession)))
...