Corda — open source блокчейн для бизнеса

    Corda — это распределенный Ledger для хранения, управления и синхронизации финансовых обязательств между различными финансовыми организациями.

    У Corda достаточно хорошая документация с видео-лекциями, которую можно найти здесь. Я постараюсь кратко описать как устроен Corda внутри.

    Рассмотрим основные особенности Corda и уникальность его среди других блокчейнов:

    • У Corda нет собственной криптовалюты.
    • Corda не использует концепцию майнинга и систему Proof-of-Work.
    • Передача данных происходит только между участниками транзанкции/контракта. Здесь нет глобального броадкастинга всем узлам сети.
    • Нет центрального контроллера, управляющего всеми транзакциями.
    • Corda поддерживает различные механизмы консенсуса.
    • Консенсус достигается между участниками на уровне отдельного соглашения/контракта, а не на уровне всей системы.
    • Транзакция подтверждается лишь участниками, относящимися к ней.
    • Corda предлагает прямую связь между формальным человеческим юридическим языком и кодом смарт-контрактов.

    The ledger


    Понятие ledger в Corda субъективно. Нет единого центрального хранилища данных. Вместо этого каждый узел поддерживает отдельную базу данных известных ему фактов.

    Например, представьте сеть из 5 узлов, где круг — это известный узлу факт.



    Как мы видим, Ed, Carl и Demi знают о факте 3, а Alice и Bob о нем даже не подозревает. Corda гарантирует сохранение общих фактов в базу каждого узла, причем данные будут идентичными.

    Состояния


    Состояние — это неизменяемый объект, представляющий собой факт, известный одному или нескольким узлам сети в определенный момент времени.

    Состояния могут хранить произвольные данные, например, акции, облигации, кредиты, идентификационную информацию.

    Например, следующее состояние представляет собой IOU — соглашение о том, что Алиса должна Бобу сумму X:


    Жизненный цикл факта с течением времени представлен последовательностью состояний. Когда необходимо обновить текущее состояние, мы создаем новое, а текущее помечаем как историческое (historic).



    Транзакции


    Транзакции — это предложения по обновлению ledger-a. Они не транслируются всем участникам ledger-a и доступны лишь тем участникам сети, которые обладают законным правом на их просмотр и управление.

    Транзакция будет добавлена в ledger, если она:

    • контрактно валидна
    • подписана всеми необходимыми участниками
    • не содержит двойных трат (doble-spends)

    Corda использует модель UTXO (unspent transaction output), в которой каждое состояние ledger-а является неизменяемым.

    При создании, транзакции на вход передается output состояние предыдущей транзакции (по хэшу и индексу).


    Жизненный цикл транзакции:

    • Создание (На данный момент транзакция всего лишь предложение по обновлению ledger-a)
    • Сбор подписей (Необходимые участники транзакции одобряют предложение по обновлению путём добавления подписи к транзакции)
    • Коммит транзакции в ledger

    После добавления транзакции в ledger входные состояния помечаются как исторические и не могут использоваться в будущих транзакциях.


    Помимо входных и выходных состояний, транзакция может содержать:

    • Комманды (параметр транзакции, указывающий цель транзакции)
    • Вложения (календарь праздников, конвертер валют)
    • Временные окна (срок действия)
    • Нотариус (Notary, особые участники сети, валидирующие транзакции)


    Контракты


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

    Контракты в Corda пишутся на любом JVM языке (например, Java, Kotlin).

    class CommercialPaper : Contract {
        override fun verify(tx: LedgerTransaction) {
            TODO()
        }
    }
    

    Необходимо наследоваться от класса Contract и переопределить метод verify. В случае невалидности транзации выброситься исключение.

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

    В Corda контракты выполняются в так называемой песочнице — немного измененной JVM, гарантирующей детерминированное выполнение контрактов.

    Потоки


    Чтобы автоматизировать общение узлов сети, были добавлены потоки.

    Поток — это последовательность шагов, которая сообщает узлу, как выполнить конкретное обновление ledger-a, в какой момент необходимо подписать и провалидировать транзакцию.



    Иногда требуются часы, дни пока транзакция подпишется всеми сторонами и попадет в ledger. Что же случится, если отключить узел, участвующий в транзакции? Потоки имеют контрольные точки, в который состояния потока записывается в базу данных узла. При востановлении узла в сети он продолжит с того места, где остановился.

    Консенсус


    Чтобы попасть в ledger, транзакция должна достигнуть 2 консенсуса: на валидность и на уникальность.

    Решение о валидности транзакции принимается лишь сторонами, вовлеченными в нее непосредственно.

    Нотариальные ноды проводят проверку транзакции на уникальность, предотравщают двойные траты.

    Представим, что у Bob-a есть 100$, и он хочет перевести 80$ Charlie и 70$ Dan-у, используя одно и то же входное состояние.



    Такой трюк Corda не позволит провернуть. Хоть транзакция и пройдет проверку на валидность, проверка на уникальность провалится.

    Заключение


    Платформа Corda, разработанная блокчейн-консорциумом R3, не является чистым примером использования технологии блокчейн. Corda — это достатояно узкоспециализированное средство для финансовых организаций.
    Поделиться публикацией

    Комментарии 0

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

    Самое читаемое