Концепции APTOS | Учетные записи
Tags: blockchain, aptos, webdev, tutorial
Published: 2022-08-30 11:58:37

Учетная запись на блокчейне Aptos содержит активы блокчейна. Эти активы, например, coins и NFT, по своей природе являются дефицитными и должны контролироваться. Любой такой актив представлен в учетной записи блокчейна как ресурс. Ресурс - это примитив языка Move, который подчеркивает контроль доступа и дефицит в своем представлении. Однако ресурс также может быть использован для представления других возможностей блокчейна, идентификационной информации и контроля доступа.

Каждая учетная запись на блокчейне Aptos идентифицируется 32-байтовым адресом учетной записи. Учетная запись может хранить данные, и эти данные хранятся в ресурсах. Первоначальным ресурсом являются сами данные учетной записи (ключ аутентификации и порядковый номер). Дополнительные ресурсы, такие как валюты или NFT, добавляются после создания учетной записи.

> **ПРИМЕР АДРЕСА УЧЕТНОЙ ЗАПИСИ**
> Адреса учетных записей состоят из 32 байтов. Обычно они отображаются в виде 64 шестнадцатеричных символов, причем каждый шестнадцатеричный символ - это полубайт. Пример того, как выглядит адрес учетной записи, приведен ниже в разделе "[Ваша первая транзакция](https://dev.to/egormajj/rukovodstvo-dlia-razrabotchikov-aptos-vasha-piervaia-tranzaktsiia-8fk)":
> ```
> Alice: eeff357ea5c1a4e7bc11b2b17ff2dc2dcca69750bfef1e1ebcaccf8c8018175b
> Bob: 19aadeca9388e009d136245b9a67423f3eee242b03142849eb4f81a4a409e59c
> ```

## Создание учетной записи

Когда пользователь запрашивает создание учетной записи, например, с помощью Aptos SDK, выполняются следующие криптографические шаги:

- Начните с генерации новой пары закрытый ключ - открытый ключ.
- От пользователя узнайте предпочтительную схему подписи для учетной записи: Должна ли учетная запись использовать одну подпись или для подписания транзакции требуется несколько подписей.
- Объедините открытый ключ со схемой подписи пользователя для создания 32-байтового ключа аутентификации.
- Инициализируйте порядковый номер счета в 0. И ключ аутентификации, и порядковый номер хранятся в учетной записи в качестве начального ресурса учетной записи.
- Создайте 32-байтовый адрес учетной записи из начального ключа аутентификации.

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

## Порядковый номер учетной записи

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

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

Эти транзакции будут храниться в mempool до тех пор, пока они не станут следующим порядковым номером для данной учетной записи (или пока не истечет срок их действия). Когда транзакция применяется, порядковый номер учетной записи увеличивается на 1. Учетная запись имеет строго возрастающий порядковый номер.

## Адрес учетной записи

В процессе создания новой учетной записи сначала создается 32-байтовый ключ аутентификации. Затем этот ключ аутентификации возвращается в неизменном виде в качестве 32-байтового адреса учетной записи.

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

## Схемы подписи

Учетная запись может отправлять транзакции. Блокчейн Aptos поддерживает следующие схемы подписи:

- [Ed25519](https://ed25519.cr.yp.to/) для транзакций с одной подписью, и
- MultiEd25519 для транзакций с несколькими подписями.

> ПРИМЕЧАНИЕ
> Блокчейн Aptos по умолчанию использует транзакции с одной подписью.

## Идентификаторы схемы подписи

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

- **1-байтовый идентификатор схемы единой подписи**: `0x00`.
- **1-байтовый идентификатор схемы нескольких подписей**: `0x01`. Обязательно укажите также значение `K` для генерации ключа аутентификации K-of-N нескольких подписей.

## Аутентификация с единой подписью

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

1. **Сгенерируйте пару ключей**: Сгенерируйте свежую пару ключей (`privkey_A`, `pubkey_A`). Блокчейн Aptos использует схему PureEdDSA на кривой Ed25519, как определено в RFC 8032.
2. **Разработайте 32-байтовый ключ аутентификации**: Создайте 32-байтовый ключ аутентификации из `pubkey_A`:

```
auth_key = sha3-256(pubkey_A | 0x00)
```
где `|` обозначает объединение. `0x00` - это 1-байтовый идентификатор схемы с одной подписью.

3. Используйте этот начальный ключ аутентификации в качестве постоянного адреса учетной записи.

## Аутентификация с несколькими подписями

При аутентификации K-of-N с несколькими подписями для учетной записи имеется в общей сложности N подписей, и для подтверждения подлинности транзакции должно использоваться не менее K из этих N подписей.

Чтобы сгенерировать ключ аутентификации учетной записи K-of-N с несколькими подписями и адрес учетной записи, выполните следующие действия:

1. **Сгенерируйте пары ключей**: Сгенерируйте `N` открытых ключей `p_1`, ..., `p_n`.
2. Определите значение `K`, пороговое количество подписей, необходимое для аутентификации транзакции.
3. **Определите 32-байтовый ключ аутентификации**: Вычислите ключ аутентификации, как описано ниже:

```
auth_key = sha3-256(p_1 | . . . | p_n | K | 0x01)
```

`0x01` - это 1-байтовый идентификатор схемы нескольких подписей.
4. Используйте этот начальный ключ аутентификации в качестве постоянного адреса учетной записи.

> **УЧЕТНЫЕ ЗАПИСИ В СЕТИ APTOS TESTNET**
> Для создания учетных записей в сети Aptos testnet требуется публичный ключ учетной записи и количество `Coin<TestCoin>` для пополнения этой учетной записи, в результате чего создается новая учетная запись с этими двумя ресурсами.

## Контроль доступа с подписью

Отправитель транзакции представлен подписью signer. Если функция в модуле Move принимает `signer` в качестве аргумента, то Aptos Move VM транслирует идентификатор учетной записи, подписавшей транзакцию, в `signer` в точке входа модуля Move. См. приведенный ниже пример кода Move с указанием `signer` в функциях `initialize` и `withdraw`. Если `signer` не указан в функции, например, в приведенной ниже функции `deposit` учетной записи, то для этой функции не существует контроля доступа:

```javascript 
module Test::Coin {
  struct Coin has key { amount: u64 }

  public fun initialize(account: &signer) {
    move_to(account, Coin { amount: 1000 });
  }

  public fun withdraw(account: &signer, amount: u64): Coin acquires Coin {
    let balance = &mut borrow_global_mut<Coin>(Signer::address_of(account)).amount;
    *balance = *balance - amount;
    Coin { amount }
  }

  public fun deposit(account: address, coin: Coin) acquires Coin {
      let balance = &mut borrow_global_mut<Coin>(account).amount;
      *balance = *balance + coin.amount;
      Coin { amount: _ } = coin;
  }
}
```

## Состояние учетной записи

Состояние каждого учетного записи включает в себя как код (модули Move), так и данные (ресурсы Move). Учетная запись может содержать произвольное количество модулей Move и ресурсов Move:

- **Move-модули**: Модули Move содержат код, например, объявления типов и процедур, но не содержат данных. Модуль Move кодирует правила обновления глобального состояния блокчейна Aptos.
- **Ресурсы Move**: Ресурсы Move содержат данные, но не код. Каждое значение ресурса имеет тип, который объявляется в модуле, опубликованном в распределенной базе данных Aptos блокчейна.