Знакомство с Aleo
Published: 2022-09-12 11:52:41

Aleo - это блокчейн для частных вычислений. Это означает, что пользователи могут писать программы на языке программирования Leo (или на более низкоуровневых инструкциях Aleo) и размещать их на блокчейне для частного использования всеми желающими. Данные записываются в зашифрованном виде на блокчейне, поэтому увидеть их могут только люди, имеющие соответствующий ключ для расшифровки. В этом посте мы рассмотрим высокоуровневые концетрации, чтобы сформировать словарный запас и ментальную модель, необходимые для понимания экосистемы Aleo и написания программ для блокчейна.

Концептуально можно считать, что Aleo основывается на идеях криптовалют, сохраняющих конфиденциальность, основанных на доказательствах знания, таких как Zcash, с вычислительными возможностями, как это сделал Ethereum для Bitcoin.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/taum6t588x62sxxw21ju.jpg)

Aleo реализует идеи, описанные в статье Zexe, которую мы рассмотрим в нашем следующем посте.

## Аккаунты
Пользователи в Aleo идентифицируются по своему аккаунту, который представляет собой набор из трех ключей: `address` (также называемый открытым ключом), `view key` и `private key`.

`address` - это публичный идентификатор, по сути, номер банковского счета. Чтобы отправить деньги или в более общем смысле взаимодействовать с кем-то на блокчейне, вам нужен его адрес.

`view key` - это то, что позволяет пользователю расшифровывать собственные данные в блокчейне. Если кто-то завладеет вашим `view key`, он сможет увидеть все ваши данные, прошлые и будущие действия на блокчейне.

`private key` используется для подписи каждого вашего взаимодействия на блокчейне. Если вы хотите отправить кому-то деньги, вы должны подписать свое сообщение своим `private key`, чтобы убедить других, что это действительно вы отправляете деньги. Если кто-то завладеет вашим `private key`, он может выдать себя за вас и украсть все ваши средства (или что-либо еще, что у вас может быть).

И `view key`, и `address` являются производными от закрытого ключа, поэтому создание счета равносильно созданию закрытого ключа, что в конечном итоге является просто созданием некоторой случайности (хотя добиться истинной случайности в компьютере сложнее, чем можно подумать).

## Программы
Программы Aleo состоят из состояния и функций, которые могут запрашивать или изменять это состояние определенным образом. Состояние хранится в сети (зашифрованное, как уже говорилось), и каждый экземпляр программы имеет свое собственное состояние; если программа развертывается несколько раз, каждый из них хранит отдельное состояние.

Самый простой пример - программа `credits`. Именно здесь хранится и обрабатывается состояние всех денег aleo. `credits` - это пример встроенной программы, которая является родной для блокчейна Aleo, т.е. она не была развернута пользователем, она была там с самого начала. Вы можете ознакомиться с ее кодом [здесь](https://github.com/AleoHQ/snarkVM/blob/testnet3/vm/compiler/src/program/mod.rs#L105). В Aleo, когда пользователь `A` хочет отправить деньги пользователю `B`, он взаимодействует с программой `credits`, вызывая функцию `transfer`; это обновляет состояние программы, вычитая часть кредитов у `A` и отдавая их `B`.

## Записи
Состояние программы хранится с помощью `records`. В конечном итоге запись - это просто структура, содержащая некоторые данные. Эти данные могут быть любыми; они определяются самой программой. В качестве примера, программа `credits` использует следующую структуру записей для отслеживания денег пользователей:

```javascript
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`)  - это уникальный идентификатор для записей. В криптографии термин `commitment` имеет гораздо более общее значение, но здесь вы можете считать обязательство записи ее идентификатором, хэшем, который уникально ее идентифицирует.

## Серийный номер
Когда запись используется, генерируется серийный номер на основе ее обязательства и закрытого ключа владельца записи. Цель серийного номера - отметить ( в сети), что запись была использована, чтобы она не могла быть использована снова (т.е. это предотвращает [двойное использование](https://en.wikipedia.org/wiki/Double-spending)).

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

## Выполнение вне сети, проверка в сети
В Aleo вычисления, выполняемые каждым переходом, производятся вне сети. Это отличается от Ethereum (и почти любого другого блокчейна), где каждая нода в сети выполняет все вычисления.

Здесь, когда пользователь посылает переход в сеть, выполнение программы уже завершено. Пользователь отправляет доказательство с нулевым разглашением о том, что все было вычислено правильно в соответствии с правилами, определенными программой, которую он выполняет. Таким образом, единственное, что делают ноды Aleo при обработке транзакций, это _проверяют их правильность_ и соответствующим образом обновляют состояние (т.е. используют записи и создают новые).

Поэтому, когда программа aleo развертывается на блокчейне, то фактически развертывается только `verifier` - часть кода, которая проверяет правильность данного доказательства с нулевым разглашением для перехода, относящегося к программе.