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)