Меркель деревья для сокрытия государственных полей от контрагентов?
Документы Corda v3 описывают обрывы транзакций и использование деревьев Меркле для "скрытия" информации во время транзакции. В частности, используемый пример - скрытие конфиденциальных данных от Oracle во время проверки транзакции.
Поддерживает ли инфраструктура Corda использование дерева Меркле для сокрытия информации от подписывания сторонних узлов? Или когда полностью подписанная транзакция подключена к сторонним узлам, может ли подмножество информации о состоянии быть скрытым? Может ли уровень "редактирования" варьироваться в зависимости от узла-участника или государство должно быть таким же, когда полностью подписанная транзакция передается другим сторонам?
2 ответа
Как говорит Каис, ограничение использования отрывов для сокрытия части транзакции от контрагента заключается в том, что контрагент, вероятно, не захочет подписать транзакцию, потому что он не может точно сказать, что он подписывает. Что, если одним из оторванных средств является принадлежащая им наличность и переводимая кому-то другому?
Однако при любой оторванной транзакции вы, по крайней мере, можете проверить, все ли компоненты определенной группы (входы, выходы, команды, вложения...) оборваны или нет. Вы можете использовать это, например, чтобы проверить, что никакие входные данные не были оторваны от транзакции перед подписанием:
@InitiatingFlow
@StartableByRPC
class Initiator(val counterparty: Party) : FlowLogic<Unit>() {
@Suspendable
override fun call() {
val notary = serviceHub.networkMapCache.notaryIdentities[0]
val txBuilder = TransactionBuilder(notary)
.addOutputState(TemplateState(), TemplateContract.ID)
.addCommand(TemplateContract.Commands.Action(), ourIdentity.owningKey)
val partlySignedTx = serviceHub.signInitialTransaction(txBuilder)
// We filter out the outputs, which are of type `TransactionState<ContractState>`.
val filteredTx = partlySignedTx.buildFilteredTransaction(Predicate {
when (it) {
is TransactionState<ContractState> -> false
else -> true
}
})
val session = initiateFlow(counterparty)
val signature = session.sendAndReceive<TransactionSignature>(filteredTx).unwrap { it }
val fullySignedTx = partlySignedTx.withAdditionalSignature(signature)
subFlow(FinalityFlow(fullySignedTx))
}
}
@InitiatedBy(Initiator::class)
class Responder(val session: FlowSession) : FlowLogic<Unit>() {
@Suspendable
override fun call() {
val filteredTx = session.receive<FilteredTransaction>().unwrap { it }
// We check that all inputs are visible before accidentally signing something away.
filteredTx.checkAllComponentsVisible(ComponentGroupEnum.INPUTS_GROUP)
val signature = serviceHub.createSignature(filteredTx)
session.send(signature)
}
}
Вы по-прежнему не можете проверить смарт-контракты транзакции, но, по крайней мере, можете быть уверены в том, что не подписываете какие-либо свои собственные данные.
Вы можете использовать этот подход по-разному. Например, вы можете проверить, что были разорваны только вложения, где вложения могут содержать секретные данные, которые контрагенту не разрешено просматривать.
В Corda транзакции - это предложения по обновлению главной книги. Предложение по сделке будет принято только в том случае, если:
- Не содержит двойных расходов
- Договорно действителен
- Подписано необходимыми сторонами
Ответ прост: это зависит от кода вашего контракта. Вы, конечно, можете использовать платформу для создания отфильтрованной транзакции и отправить ее контрагентам для подписания. Тем не менее, они будут подписывать, только если это действует по договору.
Я думаю, что вы столкнетесь с проблемами, идущими по этому пути, хотя, по сути, вы просите контрагентов подписать что-то, не зная, что именно они подписывают, например, транзакция может включать скрытый набор состояний, переводящих свои деньги.
Вы можете изучить дополнительные уровни шифрования и делиться ключами только с контрагентами, которым вы хотите просматривать конфиденциальные данные.
Corda также поддерживает отправку данных с использованием структуры потока, поэтому вы можете отправлять конфиденциальные данные отдельно вне транзакции.
И последнее замечание: после подписания транзакции ее нельзя изменить, не сделав транзакцию недействительной.
Наконец, взгляните на это сообщение в блоге Майка Хирна - https://www.corda.net/2017/06/corda-sgx-privacy-update/ Это решает проблему конфиденциальности, описанную без использования фильтрации.