Corda — это распределенный Ledger для хранения, управления и синхронизации финансовых обязательств между различными финансовыми организациями.
У Corda достаточно хорошая документация с видео-лекциями, которую можно найти здесь. Я постараюсь кратко описать как устроен Corda внутри.
Рассмотрим основные особенности Corda и уникальность его среди других блокчейнов:
Понятие ledger в Corda субъективно. Нет единого центрального хранилища данных. Вместо этого каждый узел поддерживает отдельную базу данных известных ему фактов.
Например, представьте сеть из 5 узлов, где круг — это известный узлу факт.
Как мы видим, Ed, Carl и Demi знают о факте 3, а Alice и Bob о нем даже не подозревает. Corda гарантирует сохранение общих фактов в базу каждого узла, причем данные будут идентичными.
Состояние — это неизменяемый объект, представляющий собой факт, известный одному или нескольким узлам сети в определенный момент времени.
Состояния могут хранить произвольные данные, например, акции, облигации, кредиты, идентификационную информацию.
Например, следующее состояние представляет собой IOU — соглашение о том, что Алиса должна Бобу сумму X:
Жизненный цикл факта с течением времени представлен последовательностью состояний. Когда необходимо обновить текущее состояние, мы создаем новое, а текущее помечаем как историческое (historic).
Транзакции — это предложения по обновлению ledger-a. Они не транслируются всем участникам ledger-a и доступны лишь тем участникам сети, которые обладают законным правом на их просмотр и управление.
Транзакция будет добавлена в ledger, если она:
Corda использует модель UTXO (unspent transaction output), в которой каждое состояние ledger-а является неизменяемым.
При создании, транзакции на вход передается output состояние предыдущей транзакции (по хэшу и индексу).
Жизненный цикл транзакции:
После добавления транзакции в ledger входные состояния помечаются как исторические и не могут использоваться в будущих транзакциях.
Помимо входных и выходных состояний, транзакция может содержать:
Когда мы говорим о валидности транзакции, то подразумеваем не только наличие необходимых подписей, но и валидность по контракту. Каждая транзакция связана с контрактом, который принимает её и валидирует входные и выходные состояния. Транзакция считается валидной, только если все её состояния валидны.
Контракты в Corda пишутся на любом JVM языке (например, Java, Kotlin).
Необходимо наследоваться от класса Contract и переопределить метод verify. В случае невалидности транзации выброситься исключение.
Вадидация транзакций должна быть детерминированной, т.е. контракт всегда должен либо принять, либо отклонить транзакцию. В сзязи с этим валидность транзакции не может зависеть от времени, случайных чисел, файлов узла сети и др.
В Corda контракты выполняются в так называемой песочнице — немного измененной JVM, гарантирующей детерминированное выполнение контрактов.
Чтобы автоматизировать общение узлов сети, были добавлены потоки.
Поток — это последовательность шагов, которая сообщает узлу, как выполнить конкретное обновление ledger-a, в какой момент необходимо подписать и провалидировать транзакцию.
Иногда требуются часы, дни пока транзакция подпишется всеми сторонами и попадет в ledger. Что же случится, если отключить узел, участвующий в транзакции? Потоки имеют контрольные точки, в который состояния потока записывается в базу данных узла. При востановлении узла в сети он продолжит с того места, где остановился.
Чтобы попасть в ledger, транзакция должна достигнуть 2 консенсуса: на валидность и на уникальность.
Решение о валидности транзакции принимается лишь сторонами, вовлеченными в нее непосредственно.
Нотариальные ноды проводят проверку транзакции на уникальность, предотравщают двойные траты.
Представим, что у Bob-a есть 100$, и он хочет перевести 80$ Charlie и 70$ Dan-у, используя одно и то же входное состояние.
Такой трюк Corda не позволит провернуть. Хоть транзакция и пройдет проверку на валидность, проверка на уникальность провалится.
Платформа Corda, разработанная блокчейн-консорциумом R3, не является чистым примером использования технологии блокчейн. Corda — это достатояно узкоспециализированное средство для финансовых организаций.
У 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 — это достатояно узкоспециализированное средство для финансовых организаций.