Концепции Aleo | Аккаунты
Published: 2022-09-13 22:33:03

Аккаунт Aleo состоит из закрытого ключа аккаунта, ключа просмотра аккаунта и адреса аккаунта.

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

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

Создайте новый аккаунт Aleo [здесь](https://aleohq.github.io/aleo/).

## Закрытый ключ аккаунта

Закрытый ключ аккаунта
Закрытый ключ аккаунта создается из случайного выбора сид-фразы аккаунта. Эта сид-фраза аккаунта используется для генерации:

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

**Формат закрытого ключа**

```
APrivateKey1b47dMA8f9GfXPsW9s16qWfiYYmWGAAcorK9RkaVpBeFA
```
Закрытый ключ аккаунта имеет формат строки Base58, состоящей из 58 символов. Закрытый ключ аккаунта кодируется префиксом закрытого ключа, который читается как `APrivateKey1`, что указывает на то, что это закрытый ключ и его не следует передавать другим пользователям.

## Ключ подтверждения аккаунта

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

Ключ подтверждения аккаунта состоит из:

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

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

**Формат ключа для подтверждения**

```
AProvingKey1z3f8dMA8f9GffPsP2s85qWfiYYmBWcccorK9RkaVpAAFB
```
Ключ подтверждения аккаунта оформляется в виде строки Base58, состоящей из 58 символов. Ключ подтверждения аккаунта кодируется префиксом ключа подтверждения, который читается как `AProvingKey1`, что указывает на то, что это ключ подтверждения и он должен быть предоставлен только уполномоченным сторонам.

## Ключ доступа аккаунта
Ключ доступа к аккаунту Aleo является производным от закрытого ключа аккаунта и позволяет пользователям расшифровывать свои [записи](https://developer.aleo.org/concepts/transactions/#record-ciphertexts) из глобального реестра. Поскольку ключи доступа к аккаунту имеют доступ к каждой записи в аккаунте пользователя, этот ключ может быть использован сторонними аудиторами для проверки полной истории аккаунта.

Ключ доступа к аккаунту состоит из:

- секретный ключ для схемы шифрования аккаунта.

**Формат ключа доступа**

```
AViewKey1cVP45x3E1TxJFgiJqawy7w5WQDsUXWTbpWAXSXB1sDw8
```
Ключ доступа аккаунта форматируется как строка Base58, состоящая из 56 символов. Ключ доступа аккаунта кодируется с префиксом ключа доступа, который читается как `AViewKey1`, что указывает на то, что это ключ доступа к аккаунту, и он должен быть предоставлен только уполномоченным лицам.

## Адрес аккаунта

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

Адрес аккаунта состоит из:

- открытый ключ для схемы шифрования аккаунта.

**Формат адреса**

```
aleo1y90yg3yzs4g7q25f9nn8khuu00m8ysynxmcw8aca2d0phdx8dgpq4vw348
```
Адрес аккаунта форматируется как строка Bech32, состоящая из 63 символов. Адрес аккаунта кодируется с префиксом адреса, который читается как `aleo1`.

## Дополнительные сведения
**Префиксы аккаунтов**

Закрытый ключ аккаунта
- тип - байт 
- читаемый человеком префикс - `APrivateKey1`
- префикс байта - `[ 127, 134, 189, 116, 210, 221, 210, 137, 144 ]`

Ключ подтверждения аккаунта
- тип - байт 
- читаемый человеком префикс - `AProvingKey1`
- префикс байта - `[ 109, 249, 98, 224, 36, 15, 213, 187, 79, 190 ]`

Ключ доступа аккаунта
- тип - байт 
- читаемый человеком префикс - `AViewKey1`
- префикс байта - `[ 14, 138, 223, 204, 247, 224, 122 ]`

Адрес аккаунта
- тип - строка 
- читаемый человеком префикс - `aleo1`
- префикс байта - `aleo1`

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

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

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

## Создание аккаунта
Учитывая глобальные установленные параметры и подпрограммы Aleo.

**Генерация закрытого ключа**

1.Выбор 32-байтовой `seed` рандомно
2.Постройте компоненты закрытого ключа
  - `sk_sig` = Blake2s(`seed`, 0)
  - `sk_prf` = Blake2s(`seed`, 1)
  - `r_pk` = Blake2s(`seed`, `counter`)

3.`private_key` = (`seed`, `sk_sig`, `sk_prf`, `r_pk`)

`counter` - это значение u16, которое итерируется до тех пор, пока из `private_key` не будет получен правильный `view_key`

**Генерирование ключа доступа**
1.Construct `pk_sig` = AccountSignature.GeneratePublicKey(`ppaccount_sig`, `sk_sig`)
2.view_key = AccountCommitment.Commit(`ppaccount_cm`, (`pk_sig`, `sk_prf`), `r_pk`)

**Генерация адреса**

1. `address` = AccountEncryption.GeneratePublicKey(`ppaccount_enc`, `view_key`)

## Диаграмма аккаунта

```
graph TD
    A["Seed (32 Bytes)"] 
    A --> |"Blake2s(Seed, 0)"| B(sk_sig)
    A --> |"Blake2s(Seed, 1)"| C(sk_prf)
    A --> |"Blake2s(Seed, counter)"| D(r_pk)
    
    B --> E(Account Private Key)
    C --> E(Account Private Key)
    D --> E(Account Private Key)
    
    E --> F(Account View Key) 
    F --> G(Account Address) 
```