Введение в Aleo
Ссылка на оригинал статьи: https://www.entropy1729.com/aleo-introduction/
Мой Discord: useless_dorozhkina#1394
Aleo — блокчейн, предназначенный для приватных вычислений. Это значит, что пользователи могут писать программы с помощью языка программирования Leo (или на более низком уровне с помощью инструкций Aleo) и развертывать их on-chain, чтобы кто угодно смог использовать программу приватно. Данные записываются в блокчейне в зашифрованном виде, поэтому только люди, обладающие соответствующим ключом дешифрования, могут их увидеть. В этом блоге мы на высоком уровне рассмотрим концепции, создающие словарный запас и ментальную модель, необходимые для понимания экосистемы Aleo и написания программ для ее блокчейна.
Концептуально можно думать, что Aleo строится на идеях о криптовалютах, сохраняющих конфиденциальность, основанных на доказательствах с нулевым разглашением таких, как Zcash; но с улучшенными вычислительными возможностями, как у Ethereum по сравнению с Bitcoin.
Aleo реализует идеи, описанные в Zexe paper, которую мы рассмотрим в следующем посте.
Аккаунты
Пользователи в Aleo идентифицируются их аккаунтами, наборами из трех ключей: address
(также называется публичным ключом), view key
и private key
.
address
— это публично доступный идентификатор, по сути номер банковского счета. Чтобы отправить деньги или просто взаимодействовать с кем-либо в блокчейне, вам понадобится их адрес.
view key
позволяет пользователям расшифровывать свои собственные данные в блокчейне. Если кто-либо завладеет вашим view key
, он сможет увидеть все ваши данные, прошлую и будущую активность в блокчейне.
private key
используется, чтобы подписывать каждое ваше взаимодействие в блокчейне. Если вы захотите отправить кому-то деньги, вы должны будете подписать сообщение с помощью вашего private key
, чтобы убедить всех, что это действительно вы, кто отправляет деньги. Если кто-либо заполучит ваш private key
, он сможет выдать себя за вас и украсть все ваши средства (или что-либо еще, что у вас может быть).
И view key
, и address
производятся из приватного ключа, таким образом, создание аккаунта равносильно созданию приватного ключа, что в конечном счете просто порождает некоторую случайность (хотя добиться истинной случайности в компьютере сложнее, чем вы думаете).
Программы
Программы Aleo складываются из состояния и функций, которые могут каким-либо образом запрашивать или изменять это состояние. Состояние (как говорилось ранее, зашифрованное) хранится on-chain, и каждый экземпляр программы имеет свое собственное; если программа развертывается несколько раз, каждый экземпляр сохраняет отдельное состояние.
Самый простой пример — это программа credits
. Именно в ней хранится и обрабатывается всё состояние всех денег aleo. credits
— это пример собственной, встроенной в блокчейн Aleo программы; т.е. она не была развернута пользователем, программа существовала в блокчейне с самого начала. Вы можете посмотреть ее код здесь. В Aleo, когда пользователь A
хочет отправить деньги пользователю B
, он взаимодействует с программой credits
, вызывая функцию transfer
; таким образом обновляется состояние программы, кредиты вычитаются от A
и передаются B
.
Записи
Состояние программы сохраняется с помощью records
. Запись — по сути просто структура, содержащая в себе некоторое данные. Это могут быть какие угодно данные; они определяются самой программой. Например, программа credits
использует следующую структуру записи для отслеживания денежных средств пользователей:
program credits.aleo; record credits: owner as address.private; gates as u64.private;
Каждая запись credits
содержит в себе владельца и количество gates
, которые являются наименьшим денежным номиналом в Aleo (эквивалент Satoshi
в Bitcoin или Wei
в Ethereum). Пользователь может хранить несколько записей программы credits;
это означает, что такое состояние, как баланс пользователя может быть восстановлено только путем сканирования цепочки на предмет всех его записей.
Из-за такого "разделения" состояния его отслеживание может быть сложной задачей; обычно это делается приложениями, работающими поверх блокчейна, такими как кошельки.
Транзакции и Переходы
Транзакция — это набор transitions
, а каждый такой переход — это изменение состояния какой-либо программы в блокчейне. Как и в примере с credits
, вызов transfer
для перевода денег пользователем A
пользователю B
является примером перехода. Если пользователь A
захотел бы отправить деньги пользователям B
и C
, он смог бы взять два необходимых для этого перехода и объединить их в одну транзакцию. Он смог бы совершить и две отдельные транзакции, каждую со своим переходом, если бы захотел.
Изменение состояния, выполняемое переходом, осуществляется с помощью записей. Каждый переход Aleo будет расходовать некоторые записи и создавать на их месте новые. Записи могут быть потрачены лишь раз.
И снова, как в примере с credits
, если пользователь A
имеет запись, содержащую 5 gates, и захочет отправить 3 gates пользователю B
, он создаст переход, выполняющий следующее:
— В качестве входных данных получает запись с 5 gates
— Тратит эту запись и создает две новые на её месте
- Одну с 3 gates
, которой владеет пользователь B
- Одну с 2 gates
, которой владеет пользователь A
Подобная модель очень похожа на ту, что используется в Bitcoin и называется UTXO. То, что в Bitcoin называется outputs
, в Aleo называется records
.
Но имейте в виду, что в Aleo можно выполнять гораздо более общие вычисления, чем простой перевод денег между людьми. Приведенный выше пример — это самый простой пример перехода, но все может стать намного сложнее, когда задействованы более интересные программы.
Однако, основная идея остается прежней; каждый переход будет принимать некоторые записи в качестве входных данных, расходовать их и создавать новые на их месте. Записи можно потратить только один раз.
Фиксации Записей
Фиксация — это уникальный идентификатор записи. В криптографии термин commitment
имеет гораздо более общее значение, но в данном случае вы можете думать о фиксации записи, как об ее id, хэше, который однозначно ее идентифицирует.
Серийный Номер
Когда запись тратится, серийный номер генерируется на основе ее фиксации и приватного ключа владельца записи. Цель серийного номера — отметить (on-chain), что запись была израсходована, чтобы ее нельзя было потратить снова (таким образом предотвращается двойное расходование).
Причина, по которой вместо того, что вести список потраченных фиксаций записей, делается это, — приватность. Aleo должен быть полностью приватным, поэтому никто, кроме владельца записи, не должен иметь возможность определить, была запись потрачена или нет. Так как серийный номер получается из приватного ключа владельца, только владелец может связать фиксацию записи с её серийным номером.
Выполнение Off-chain, Проверка On-chain
В Aleo вычисления, выполняемые при каждом переходе, выполняются off-chain. Это не похоже на Ethereum (и почти любой другой блокчейн), где каждая нода в сети будет выполнять все вычисления.
Здесь, когда пользователь отправляет переход в сеть, выполнение программы уже завершено. То, что отправляет пользователь, — это Доказательство с Нулевым Разглашением того, что все было вычислено верно в соответствии с правилами, определенными выполняемой программой. Таким образом, единственное, что делают ноды Aleo при обработке транзакций, — проверяют их правильность и соответствующим образом обновляют состояние (т.е. тратят записи и создают новые).
Таким образом, когда программа aleo развертывается в блокчейне, на самом деле развертывается только verifier
; фрагмент кода, который проверяет правильность данного доказательства ZK для перехода, относящегося к программе.