Во-первых, вы говорите:
Поскольку данные отслеживаются в двух отдельных состояниях с разными участниками, это необходимо будет сделать в двух транзакциях.
blockquote>Это не обязательно так. Два отдельных состояния с разными участниками могут быть частью одной транзакции. Тем не менее, давайте предположим, что у вас есть причина разделять их здесь (например, конфиденциальность).
Начиная с Corda 4, платформа не обеспечивает многоядерных гарантий атомарности. Не существует встроенного способа гарантировать, что данная транзакция фиксируется только в том случае, если зафиксирована другая транзакция (но см. Пункт P.S. ниже).
Так что ни один из ваших вариантов не гарантирует атомарность нескольких транзакций. Я все еще верю, что вариант 1 был бы предпочтительнее, поскольку вы получаете гарантии структуры потока, что транзакция будет вызвана. Вы обеспокоены тем, что респондентом будет вызван поток, создающий вторую транзакцию, даже если первая транзакция не удалась Этого можно избежать, используя
waitForLedgerCommit
, чтобы убедиться, что транзакция 1 зафиксирована до начала потока для создания второй транзакции:class CustomerIssueFlowResponder(val otherPartyFlow: FlowSession) : FlowLogic<SignedTransaction>() { @Suspendable override fun call(): SignedTransaction { val signTransactionFlow = object : SignTransactionFlow(otherPartyFlow) { override fun checkTransaction(stx: SignedTransaction) = requireThat { val output = stx.tx.outputs.single().data "This must be an CustomerState." using (output is CustomerState) } } // signing transaction 1 val stx = subFlow(signTransactionFlow) val customerState = stx.tx.outputs.single().data as CustomerState // initiating transaction 2 once transaction 1 is committed waitForLedgerCommit(stx.id) subFlow(CustomerIssueOrUpdateFlow(customerState)) return stx } }
P.S. Один из возможных способов достижения многозаходности - использование обременений следующим образом:
- Представьте, что у нас есть две транзакции: Tx1, которая выводит S1, и Tx2, которая выводит S2
- As часть Tx1, обременяет S1, так что он может быть израсходован только в том случае, если вы знаете подпись нотариуса над Tx2, или возвращается в исходное состояние по истечении некоторого периода времени
- Как часть Tx2, обременять S2, чтобы он мог тратиться только в том случае, если вы знаете подпись нотариуса над Tx1 или возвращается в исходное состояние по истечении некоторого периода времени
Однако одна атака, которая приходит на ум, это вызывающая сторона
FinalityFlow
для Tx1, но не распространение подписи нотариуса по Tx1, позволяя им требовать Tx2, не отказываясь от Tx1. Это было бы решено, если бы нотариус опубликовал все свои подписи на какой-нибудь доске объявлений вместо того, чтобы полагаться на звонящего изFinalityFlow
для их распространения.
Я пользуюсь библиотекой GLib, она имеет много хороших стандартных и нестандартных функций.
См. https://developer.gnome.org/glib/stable/
и возможно Вы влюбляетесь... :)
Например:
https://developer.gnome.org/glib/stable/glib-String-Utility-Functions.html#g-strdup-printf
объясняет, что g_strdup_printf:
Подобный стандарту C sprintf () функционируют, но более безопасный, так как он вычисляет требуемое максимальное пространство и выделяет память для содержания результата.
Это действительно не отвечает на Ваш вопрос о самых безопасных библиотеках для использования, но большинство функций, которые уязвимы для переполнения буфера, которое Вы упомянули, имеет более безопасные версии, которые берут длину буфера в качестве аргумента для предотвращения дыр в системе безопасности, которые открыты, когда стандартные методы используются.
Если Вы не ослабили уровень предупреждений, Вы будете обычно получать предупреждения компилятора при использовании устаревших методов, предлагая, чтобы Вы использовали более безопасные методы вместо этого.
Я верю Apache Портативное Время выполнения (апрель), библиотека более безопасна, чем стандартная библиотека для C. Я использую его, ну, в общем, в качестве части апачского модуля, но также и для независимых процессов.
Как пример того, что я говорю о, D.J. Bernstein, более известный как djb, автор djbdns
и qmail
, создал djblib
, который обеспечивает быструю, трудную, безопасную альтернативу многим стандартным библиотечным функциям C.
Возможно, первый вопрос спросить состоит в том, если Ваш действительно нуждаются в плоскости C? (возможно, язык как .NET или Java является опцией - затем, например, переполнение буфера больше не является действительно проблемой),
Другая опция состоит в том, чтобы, возможно, записать части Вашего проекта в C++, если другие высокоуровневые языки не являются опцией. У Вас может затем быть интерфейс C, который инкапсулирует код C++, если Вам действительно нужен C.
Поскольку, если бы Вы добавляете все усовершенствованные функции, библиотека стандарта C++ имеет сборку в - Ваш код C только был бы незначительно быстрее большинство раз (и содержал бы намного больше ошибок, чем существующая и протестированная платформа).
Для Windows существует 'безопасная' библиотека C/C++.
Вы всегда имеете право реализовывать любую библиотеку, которую Вы любите и использовать его - твердая часть удостоверяется, что это доступно на платформах, Вам нужно Ваше программное обеспечение, чтобы продолжить работать. Можно также использовать обертки вокруг стандартных функций в соответствующих случаях.
Является ли это действительно хорошей идеей, несколько спорно, но существует TR24731, опубликованный стандартным комитетом C - для более безопасного набора функций C. Там существует определенно некоторый хороший материал. Посмотрите этот вопрос: Вы используете TR 24731 Безопасные Функции в Вашем коде C?, который включает ссылки на технический отчет.