Predicate возвращает false, если в корде используются учетные записи вместе с oracle. - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь использовать функции учетных записей в Corda вместе с функциями oracle, проблема заключается в создании отфильтрованной функции для получения подписи oracle. мой код kotlin, который использовал предикат для проверки наличия в моей транзакции ключа oracle, всегда возвращает false, хотя у меня есть oracle открытый ключ, добавленный в список c ключей publi, используемых для подписи начальных транзакций.

var requiredSigners = Arrays.asList(oracle.owningKey, urIdentity.owningKey, lenderAccountNewKey)
val output = IOUState(exchangeRate * value, lenderAccountNewKey, borrowerAccountNewKey)
    val transactionBuilder = TransactionBuilder(notary)
    var participantsList = ArrayList<AbstractParty>(output.participants)
    participantsList.add(oracle)
    transactionBuilder.addOutputState(output, IOUContract.ID)
            .addCommand(IOUContract.Commands.Create(), participantsList.map { it.owningKey })
    transactionBuilder.verify(serviceHub)

 var localSignedTx = serviceHub.signInitialTransaction(transactionBuilder)

        var filteredTx = localSignedTx.buildFilteredTransaction(Predicate {
            when (it) {
                is Command<*> -> oracle.owningKey in it.signers
                else -> false
            }
        }
val oracleSignature = subFlow(SignFlow(oracle, filteredTransaction))
    val stx = locallySignedTransaction.withAdditionalSignature(oracleSignature)


при попытке запустить с помощью следующего кода журналы приведены ниже.

[INFO] 2020-05-26T07: 00: 59,660Z [Node thread-1] corda.flow. - Поток вызвал ошибку: Коллекция не содержит элемента, соответствующего предикату. Отправка в потоковую больницу для сортировки. {Actor_id = internalShell, Actor_owning_identity = O = PartyA, L = Лондон, C = GB, Actor_store_id = NODE_CONFIG, fiber-id = 10000003, flow-id = 040d69f9-f93a-4a23-bdb4-594c41d38987, invocation_ida = 3da64e3d * -4a41-8f18-b0ca05557490, invocation_timestamp = 2020-05-26T07: 00: 58.102Z, origin = internalShell, session_id = dec88c8e-1441-425b-bfe0-f00ad6b12126, session_timestamp = 2020-05-26T06: 58: 59.126Z thread-id = 161} [ИНФОРМАЦИЯ] 2020-05-26T07: 00: 59,666Z [Node thread-1] statemachine.StaffedFlowHospital. - Поток [040d69f9-f93a-4a23-bdb4-594c41d38987] поступил в больницу в состоянии

1 Ответ

1 голос
/ 27 мая 2020
  • Вы должны передать requiredSigners список при указании команды; в настоящее время вы передаете participantsList.
  • Кстати, oracle не должен быть участником; Обычно это третья сторона, которая предоставляет проверенные данные.
    Какой смысл отправлять oracle отфильтрованную транзакцию, если вы собираетесь зарегистрировать эту полную транзакцию и соответствующие состояния внутри oracle, сделав ее участником ( предполагая, что participantsList - это то, что вы собираетесь использовать в своем конечном потоке).
  • Вы должны использовать WireTransaction для построения отфильтрованной транзакции (т.е. localSignedTx.tx.buildFilteredTransaction()) (обратите внимание на .tx).
  • У вас опечатка, вы используете filteredTransaction в SignFlow; имя вашей переменной filteredTx.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...