Руководство по использованию Aptos CLI
Tags: blockchain, aptos, tutorial, development
Published: 2022-08-24 12:42:56

Утилита `aptos` - это интерфейс командной строки (CLI) для отладки, разработки и работы с нодой. В этом руководстве описано, как использовать утилиту `aptos` CLI.Чтобы установить CLI, см. [руководство по установке Aptos CLI](https://dev.to/egormajj/rukovodstvo-po-ustanovkie-aptos-cli-2i85).

## Справочник по командной строке
Доступные команды для вызова справочника. Введите `aptos help` или `aptos --help`, чтобы увидеть доступные варианты команды.

```javascript
$ aptos 0.2.1
Aptos Labs <opensource@aptoslabs.com>
CLI tool for interacting with the Aptos blockchain and nodes

USAGE:
    aptos <SUBCOMMAND>

OPTIONS:
    -h, --help       Print help information
    -V, --version    Print version information

SUBCOMMANDS:
    account    CLI tool for interacting with accounts
    config     Tool for configuration of the CLI tool
    genesis    Tool for setting up and building the Genesis transaction
    help       Print this message or the help of the given subcommand(s)
    info       Show information about the build of the CLI
    init       Tool to initialize current directory for the aptos tool
    key        CLI tool for generating, inspecting, and interacting with keys
    move       CLI tool for performing Move tasks
    node       Tool for manipulating nodes
```

Также справочник доступен по конкретным командам. Например, введите `aptos move --help`, чтобы получить справку по конкретной команде.

```javascript
$ aptos-move 0.2.1
CLI tool for performing Move tasks

USAGE:
    aptos move <SUBCOMMAND>

OPTIONS:
    -h, --help       Print help information
    -V, --version    Print version information

SUBCOMMANDS:
    compile    Compiles a package and returns the [`ModuleId`]s
    help       Print this message or the help of the given subcommand(s)
    init       Creates a new Move package at the given location
    publish    Publishes the modules in a Move package
    run        Run a Move function
    test       Run Move unit tests against a package path
```
Также доступен справочник по подкомандам. Например, введите `aptos move compile --help`, чтобы получить справку по конкретной команде.

```javascript
$ aptos-move-compile 0.2.1
Compiles a package and returns the [`ModuleId`]s

USAGE:
    aptos move compile [OPTIONS]

OPTIONS:
    -h, --help
            Print help information

        --named-addresses <NAMED_ADDRESSES>
            Named addresses for the move binary
            
            Example: alice=0x1234, bob=0x5678
            
            Note: This will fail if there are duplicates in the Move.toml file remove those first.
            
            [default: ]

        --output-dir <OUTPUT_DIR>
            Path to save the compiled move package
            
            Defaults to `<package_dir>/build`

        --package-dir <PACKAGE_DIR>
            Path to a move package (the folder with a Move.toml file)

    -V, --version
            Print version information
```

## Информация о CLI

Чтобы получить информацию о CLI для отладки, можно выполнить команду `aptos info`:

```javascript
$ aptos info
{
  "Result": {
    "build_branch": "main",
    "build_cargo_version": "cargo 1.61.0 (a028ae42f 2022-04-29)",
    "build_commit_hash": "9593a8d515b7c82886064812753b237d82075e35",
    "build_os": "macos-aarch64",
    "build_pkg_version": "0.2.1",
    "build_rust_channel": "1.61.0-aarch64-apple-darwin",
    "build_rust_version": "rustc 1.61.0 (fe5b13d68 2022-05-18)"
  }
}
```

## Примеры настроек

**Настройка глобальной конфигурации**

С помощью этой команды можно задать параметры глобальной конфигурации для CLI. Глобальная конфигурация находится в `~/.aptos/global_config.yaml.` На данный момент единственным полем, которое можно настроить, является `--config-type`, которое позволяет вам установить, где будет установлена конфигурация профиля. По умолчанию это workspace, что означает, что текущий каталог (`./.aptos/config.yaml`), в котором запущен CLI, будет содержать конфигурацию. Если установлено значение `global`, то будет использоваться глобальное расположение папки (`~/.aptos/config.yaml`).

```javascript
$ aptos config set-global-config --config-type global
{
  "Result": "Success"
}
```
Вы также можете показать глобальную конфигурацию с помощью команды `show-global-config`.

```javascript
$ aptos config show-global-config
{
  "Result": {
    "config_type": "Global"
  }
}
```
**Настройка выполнения shell**
Вы можете настроить завершения shell с помощью команды `generate-shell-completions`. Пожалуйста, посмотрите конфигурацию для вашей конкретной shell. В настоящее время поддерживаются следующие shell `[bash, zsh, fish, powershell, elvish]`. Ниже приведен пример для `oh my zsh`.

```javascript
$ aptos config generate-shell-completions --shell zsh --output-file ~/.oh-my-zsh/completions/_aptos
```
**Настройка локальной конфигурации и создание учетной записи**

Будет создана локальная папка `.aptos/` с конфигурацией `config.yaml`, которую можно использовать для хранения конфигурации между запусками CLI. Эта папка является локальной для вашего запуска, поэтому вам нужно будет продолжить запуск CLI из этой папки или повторно инициализировать в другой папке.

**Шаг 1. Запустите Aptos init**

Это инициализирует конфигурацию с заданным закрытым ключом.

```javascript
$ aptos init
Configuring for profile default
Enter your rest endpoint [Current: None | No input: https://fullnode.devnet.aptoslabs.com]

No rest url given, using https://fullnode.devnet.aptoslabs.com...
Enter your faucet endpoint [Current: None | No input: https://faucet.devnet.aptoslabs.com]

No faucet url given, using https://faucet.devnet.aptoslabs.com...
Enter your private key as a hex literal (0x...) [Current: None | No input: Generate new key (or keep one if present)]

No key given, generating key...
Account 50A49D913AA6381C01579E3FC00784B49AFA3A771F06389EBC65F8FF3A4E9A7D doesn't exist, creating it and funding it with 10000 coins
Aptos is now set up for account 50A49D913AA6381C01579E3FC00784B49AFA3A771F06389EBC65F8FF3A4E9A7D!  Run `aptos help` for more information about commands

{
  "Result": "Success"
}
```
Шаг 2. Изменение конфигурации

Чтобы изменить конфигурацию, вы можете либо выполнить команду `aptos init`, либо вручную отредактировать файл `.aptos/config.yaml`, который находится в вашем текущем рабочем каталоге.

**Шаг 3. Создание других профилей**

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

```javascript
$ aptos init --profile superuser
Configuring for profile superuser
Enter your rest endpoint [Current: None | No input: https://fullnode.devnet.aptoslabs.com]

No rest url given, using https://fullnode.devnet.aptoslabs.com...
Enter your faucet endpoint [Current: None | No input: https://faucet.devnet.aptoslabs.com]

No faucet url given, using https://faucet.devnet.aptoslabs.com...
Enter your private key as a hex literal (0x...) [Current: None | No input: Generate new key (or keep one if present)]

No key given, generating key...
Account 18B61497FD290B02BB0751F44381CADA1657C2B3AA6194A00D9BC9A85FAD3B04 doesn't exist, creating it and funding it with 10000 coins
Aptos is now set up for account 18B61497FD290B02BB0751F44381CADA1657C2B3AA6194A00D9BC9A85FAD3B04!  Run `aptos help` for more information about commands
{
  "Result": "Success"
}
```

## Примеры учетных записей

**Пополнение учетной записи с помощью faucet**

Вы можете пополнить учетную запись на faucet через CLI, используя либо учетную запись, либо профиль:

```javascript
$ aptos account fund --account B9BD2CFA58CA29BCE1D7ADD25FCE5C62220604CD0236FE3F90D9DE91ED9FB8CB
{
  "Result": "Added 10000 coins to account B9BD2CFA58CA29BCE1D7ADD25FCE5C62220604CD0236FE3F90D9DE91ED9FB8CB"
}
```

```javascript
$ aptos account fund --account default
{
  "Result": "Added 10000 coins to account B9BD2CFA58CA29BCE1D7ADD25FCE5C62220604CD0236FE3F90D9DE91ED9FB8CB"
}
```
**Просмотр баланса учетной записи и информации о переводах**

Вы можете просматривать баланс и информацию о переводах (пополнение и снятие средств) с помощью:

```javascript
$ aptos account list --query balance --account 0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb
```
Приведенная выше команда выведет на ваш терминал следующую информацию:

```javascript
{
  "Result": [
    {
      "coin": {
        "value": "10000"
      },
      "deposit_events": {
        "counter": "1",
        "guid": {
          "id": {
            "addr": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
            "creation_num": "1"
          }
        }
      },
      "withdraw_events": {
        "counter": "0",
        "guid": {
          "id": {
            "addr": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
            "creation_num": "2"
          }
        }
      }
    }
  ]
}
```
**Вызов ресурсов в учетной записи**

Вы можете вызвать список ресурсов в учетной записи из командной строки. Например, смотрите ниже, как вызвать список ресурсов в учетной записи, которую вы только что создали выше:

```javascript
$ aptos account list --query resources --account 0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb
```
Приведенная выше команда выдаст на ваш терминал следующую информацию о списке ресурсов:

```javascript
{
  "Result": [
    {
      "coin": {
        "value": "10000"
      },
      "deposit_events": {
        "counter": "1",
        "guid": {
          "id": {
            "addr": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
            "creation_num": "1"
          }
        }
      },
      "withdraw_events": {
        "counter": "0",
        "guid": {
          "id": {
            "addr": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
            "creation_num": "2"
          }
        }
      }
    },
    {
      "register_events": {
        "counter": "1",
        "guid": {
          "id": {
            "addr": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
            "creation_num": "0"
          }
        }
      }
    },
    {
      "counter": "3"
    },
    {
      "authentication_key": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
      "self_address": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
      "sequence_number": "0"
    }
  ]
}
```
Вы можете дополнительно указать профиль по умолчанию из конфигурации, в которой не указана учетная запись.

```javascript
$ aptos account list
{
  "Result": [
    {
      "coin": {
        "value": "10000"
      },
      "deposit_events": {
        "counter": "1",
        "guid": {
          "id": {
            "addr": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
            "creation_num": "1"
          }
        }
      },
      "withdraw_events": {
        "counter": "0",
        "guid": {
          "id": {
            "addr": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
            "creation_num": "2"
          }
        }
      }
    },
    {
      "register_events": {
        "counter": "1",
        "guid": {
          "id": {
            "addr": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
            "creation_num": "0"
          }
        }
      }
    },
    {
      "counter": "3"
    },
    {
      "authentication_key": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
      "self_address": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
      "sequence_number": "0"
    }
  ]
}
```
Кроме того, любое место, где есть учетная запись, может использовать имя профиля:

```javascript
$ aptos account list --query resources --account superuser
{
  "Result": [
    {
      "coin": {
        "value": "10000"
      },
      "deposit_events": {
        "counter": "1",
        "guid": {
          "id": {
            "addr": "0x742854f7dca56ea6309b51e8cebb830b12623f9c9d76c72c3242e4cad353dedc",
            "creation_num": "1"
          }
        }
      },
      "withdraw_events": {
        "counter": "0",
        "guid": {
          "id": {
            "addr": "0x742854f7dca56ea6309b51e8cebb830b12623f9c9d76c72c3242e4cad353dedc",
            "creation_num": "2"
          }
        }
      }
    },
    {
      "register_events": {
        "counter": "1",
        "guid": {
          "id": {
            "addr": "0x742854f7dca56ea6309b51e8cebb830b12623f9c9d76c72c3242e4cad353dedc",
            "creation_num": "0"
          }
        }
      }
    },
    {
      "counter": "3"
    },
    {
      "authentication_key": "0x742854f7dca56ea6309b51e8cebb830b12623f9c9d76c72c3242e4cad353dedc",
      "self_address": "0x742854f7dca56ea6309b51e8cebb830b12623f9c9d76c72c3242e4cad353dedc",
      "sequence_number": "0"
    }
  ]
}
```
**Вызов модулей в учетной записи**

Вы можете вызывать различные типы запросов для просмотра различных элементов под учетной записью. В настоящее время поддерживаются "ресурсы" и "модули", но в будущем появятся и другие типы запросов. Например, для получения модулей:

```javascript
$ aptos account list --query modules                   
{
  "Result": [
    {
      "bytecode": "0xa11ceb0b050000000b01000a020a12031c2504410405452d0772da0108cc0240068c030a0a9603150cab03650d90040400000101010201030104000506000006080004070700020e0401060100080001000009020300010f0404000410060100031107000002120709010602130a030106050806080105010802020c0a02000103040508020802070801010a0201060c010800010b0301090002070b030109000900074d657373616765056572726f72056576656e74067369676e657206737472696e67124d6573736167654368616e67654576656e740d4d657373616765486f6c64657206537472696e670b6765745f6d6573736167650b7365745f6d6573736167650c66726f6d5f6d6573736167650a746f5f6d657373616765076d657373616765156d6573736167655f6368616e67655f6576656e74730b4576656e7448616e646c65096e6f745f666f756e6404757466380a616464726573735f6f66106e65775f6576656e745f68616e646c650a656d69745f6576656e74b9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb0000000000000000000000000000000000000000000000000000000000000001030800000000000000000002020a08020b08020102020c08020d0b030108000001000101030b0a002901030607001102270b002b0110001402010104010105240b0111030c040e0011040c020a02290120030b05120e000b040e00380012012d0105230b022a010c050a051000140c030a050f010b030a04120038010b040b050f0015020100010100",
      "abi": {
        "address": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
        "name": "Message",
        "friends": [],
        "exposed_functions": [
          {
            "name": "get_message",
            "visibility": "public",
            "is_entry": false,
            "generic_type_params": [],
            "params": [
              "address"
            ],
            "return": [
              "0x1::string::String"
            ]
          },
          {
            "name": "set_message",
            "visibility": "public",
            "is_entry": true,
            "generic_type_params": [],
            "params": [
              "signer",
              "vector<u8>"
            ],
            "return": []
          }
        ],
        "structs": [
          {
            "name": "MessageChangeEvent",
            "is_native": false,
            "abilities": [
              "drop",
              "store"
            ],
            "generic_type_params": [],
            "fields": [
              {
                "name": "from_message",
                "type": "0x1::string::String"
              },
              {
                "name": "to_message",
                "type": "0x1::string::String"
              }
            ]
          },
          {
            "name": "MessageHolder",
            "is_native": false,
            "abilities": [
              "key"
            ],
            "generic_type_params": [],
            "fields": [
              {
                "name": "message",
                "type": "0x1::string::String"
              },
              {
                "name": "message_change_events",
                "type": "0x1::event::EventHandle<0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb::Message::MessageChangeEvent>"
              }
            ]
          }
        ]
      }
    }
  ]
}
```
**Перевод coins**

Aptos CLI также является простым кошельком и может переводить монеты между учетными записями.

```javascript
$ aptos account transfer --account superuser --amount 100
{
  "Result": {
    "gas_used": 73,
    "balance_changes": {
      "742854f7dca56ea6309b51e8cebb830b12623f9c9d76c72c3242e4cad353dedc": {
        "coin": {
          "value": "10100"
        },
        "deposit_events": {
          "counter": "2",
          "guid": {
            "id": {
              "addr": "0x742854f7dca56ea6309b51e8cebb830b12623f9c9d76c72c3242e4cad353dedc",
              "creation_num": "1"
            }
          }
        },
        "withdraw_events": {
          "counter": "0",
          "guid": {
            "id": {
              "addr": "0x742854f7dca56ea6309b51e8cebb830b12623f9c9d76c72c3242e4cad353dedc",
              "creation_num": "2"
            }
          }
        }
      },
      "b9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb": {
        "coin": {
          "value": "9827"
        },
        "deposit_events": {
          "counter": "1",
          "guid": {
            "id": {
              "addr": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
              "creation_num": "1"
            }
          }
        },
        "withdraw_events": {
          "counter": "1",
          "guid": {
            "id": {
              "addr": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
              "creation_num": "2"
            }
          }
        }
      }
    },
    "sender": "b9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
    "success": true,
    "version": 1139,
    "vm_status": "Executed successfully"
  }
}
```

## Пример с ключами

**Генерирование ключа**

Чтобы разрешить генерацию закрытых ключей, можно использовать команду `aptos key generate`. Вы можете генерировать ключи `x25519` или `ed25519`.

```javascript
$ aptos key generate --key-type ed25519 --output-file output.key
{
  "Result": {
    "PrivateKey Path": "output.key",
    "PublicKey Path": "output.key.pub"
  }
}

```
**Генерация конфигурации Peer**

Чтобы разрешить другим подключаться к вашей ноде, вам необходимо создать конфигурацию `peer`. Ниже показано, как можно использовать `aptos` CLI для создания конфигурации peer и записи ее в файл `peer_config.yaml`.

```javascript
$ aptos key extract-peer --output-file peer_config.yaml
```
Приведенная выше команда выведет на терминал следующий результат:

```javascript
{
  "Result": {
    "8cfb85603080b13013b57e2e80887c695cfecd7ad8217d1cac22fa6f3b0b5752": {
      "addresses": [],
      "keys": [
        "0x8cfb85603080b13013b57e2e80887c695cfecd7ad8217d1cac22fa6f3b0b5752"
      ],
      "role": "Upstream"
    }
  }
}
```
Файл `peer_config.yaml` будет создан в вашей текущей рабочей папке, с содержимым, как показано в примере ниже:

```javascript
---
8cfb85603080b13013b57e2e80887c695cfecd7ad8217d1cac22fa6f3b0b5752:
  addresses: []
  keys:
    - "0x8cfb85603080b13013b57e2e80887c695cfecd7ad8217d1cac22fa6f3b0b5752"
  role: Upstream
```
Примечание: В строке адреса необходимо заполнить свой адрес.

## Примеры MOVE

**Сборка Move**

Для локальной сборки пакета Move можно использовать `aptos` CLI. В приведенном ниже примере используется блокчейн `HelloBlockchain` в [move-examples](https://github.com/aptos-labs/aptos-core/tree/main/aptos-move/move-examples).

Адреса с именами могут быть либо адресом учетной записи, либо именем профиля.

```javascript
$ aptos move compile --package-dir aptos-move/move-examples/hello_blockchain/ --named-addresses HelloBlockchain=superuser
```
Приведенная выше команда выведет на терминал следующий результат:

```javascript
{
  "Result": [
    "742854F7DCA56EA6309B51E8CEBB830B12623F9C9D76C72C3242E4CAD353DEDC::Message"
  ]
}
```
**Сборка и модульное тестирование Move**

`aptos` CLI также можно использовать для сборки и локального запуска модульных тестов. В этом примере мы будем использовать `HelloBlockchain` в [move-examples](https://aptos.dev/cli-tools/aptos-cli-tool/use-aptos-cli#generating-a-peer-config:~:text=locally.%20In%20this%20example%2C%20we%27ll%20use%20the%20HelloBlockchain%20in-,move%2Dexamples,-.).

```javascript
$ aptos move test --package-dir aptos-move/move-examples/hello_blockchain/ --named-addresses HelloBlockchain=superuser
```
Приведенная выше команда выведет на терминал следующий результат:

```javascript
INCLUDING DEPENDENCY AptosFramework
INCLUDING DEPENDENCY AptosStdlib
INCLUDING DEPENDENCY MoveStdlib
BUILDING Examples
Running Move unit tests
[ PASS    ] 0x742854f7dca56ea6309b51e8cebb830b12623f9c9d76c72c3242e4cad353dedc::MessageTests::sender_can_set_message
[ PASS    ] 0x742854f7dca56ea6309b51e8cebb830b12623f9c9d76c72c3242e4cad353dedc::Message::sender_can_set_message
Test result: OK. Total tests: 2; passed: 2; failed: 0
{
  "Result": "Success"
}
```
Доказательство MOVE

С помощью `aptos` CLI можно запустить [Move Prover](https://github.com/move-language/move/tree/main/language/move-prover), который является инструментом формальной верификации для языка Move. Приведенный ниже пример подтверждает пакет `hello_prover` в [move-examples](https://aptos.dev/cli-tools/aptos-cli-tool/use-aptos-cli#generating-a-peer-config:~:text=hello_prover%20package%20in-,move%2Dexamples,-.).

```javascript
aptos move prove --package-dir aptos-move/move-examples/hello_prover/
```
Приведенная выше команда выведет на терминал следующий результат:

```javascript
SUCCESS proving 1 modules from package `hello_prover` in 1.649s
{
  "Result": "Success"
}
```
**Debug и вывод Stacktrace**

В этом примере мы будем использовать `DebugDemo` в [debug-move-example](https://aptos.dev/cli-tools/aptos-cli-tool/use-aptos-cli#generating-a-peer-config:~:text=use%20DebugDemo%20in-,debug%2Dmove%2Dexample,-.).

Во-первых, вам нужно включить Move nursery в [файл Move toml.](https://aptos.dev/cli-tools/aptos-cli-tool/use-aptos-cli#generating-a-peer-config:~:text=in%20your%20Move-,toml%20file,-.)

Теперь вы можете использовать `Debug::print` и `Debug::print_stack_trace` в вашем файле [DebugDemo Move](https://aptos.dev/cli-tools/aptos-cli-tool/use-aptos-cli#generating-a-peer-config:~:text=print_stack_trace%20in%20your-,DebugDemo%20Move%20file,-.).

Вы можете выполнить следующую команду:

```javascript
$ aptos move test --package-dir crates/aptos/debug-move-example
```
Команда выдаст следующий результат:

```
Running Move unit tests
[debug] 0000000000000000000000000000000000000000000000000000000000000001
Call Stack:
    [0] 0000000000000000000000000000000000000000000000000000000000000001::Message::sender_can_set_message

        Code:
            [4] CallGeneric(0)
            [5] MoveLoc(0)
            [6] LdConst(0)
          > [7] Call(1)
            [8] Ret

        Locals:
            [0] -
            [1] 0000000000000000000000000000000000000000000000000000000000000001


Operand Stack:
```
**Публикация пакета Move с названным адресом**

В этом примере мы будем использовать `HelloBlockchain` в [move-examples](https://github.com/aptos-labs/aptos-core/tree/main/aptos-move/move-examples).

Опубликуйте пакет с адресом вашей учетной записи, установленным для `HelloBlockchain`.

Здесь необходимо изменить 8946741e5c907c43c9e042b3739993f32904723f8e2d1491564d38959b59ac71 на адрес вашей учетной записи.

```javascript
$ aptos move publish --package-dir aptos-move/move-examples/hello_blockchain/ --named-addresses HelloBlockchain=8946741e5c907c43c9e042b3739993f32904723f8e2d1491564d38959b59ac71
```
Вы можете дополнительно использовать названные профили для адресов. Первый держатель `default`

```javascript
$ aptos move publish --package-dir aptos-move/move-examples/hello_blockchain/ --named-addresses HelloBlockchain=default
```

**Запуск функции Move**

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

Аргументы должны иметь тип с двоеточием для разделения. В этом примере мы хотим, чтобы входные данные были разобраны как строка, поэтому мы поместили `string:Hello`!

```javascript
$ aptos move run --function-id 0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb::message::set_message --args string:hello!
{
  "Result": {
    "changes": [
      {
        "address": "b9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
        "data": {
          "authentication_key": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
          "self_address": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
          "sequence_number": "3"
        },
        "event": "write_resource",
        "resource": "0x1::account::Account"
      },
      {
        "address": "b9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
        "data": {
          "coin": {
            "value": "9777"
          },
          "deposit_events": {
            "counter": "1",
            "guid": {
              "id": {
                "addr": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
                "creation_num": "1"
              }
            }
          },
          "withdraw_events": {
            "counter": "1",
            "guid": {
              "id": {
                "addr": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
                "creation_num": "2"
              }
            }
          }
        },
        "event": "write_resource",
        "resource": "0x1::coin::CoinStore<0x1::aptos_coin::AptosCoin>"
      },
      {
        "address": "b9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
        "data": {
          "counter": "4"
        },
        "event": "write_resource",
        "resource": "0x1::guid::Generator"
      },
      {
        "address": "b9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
        "data": {
          "message": "hello!",
          "message_change_events": {
            "counter": "0",
            "guid": {
              "id": {
                "addr": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
                "creation_num": "3"
              }
            }
          }
        },
        "event": "write_resource",
        "resource": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb::Message::MessageHolder"
      }
    ],
    "gas_used": 41,
    "success": true,
    "version": 3488,
    "vm_status": "Executed successfully"
  }
} 
```
Кроме того, профили могут заменять адреса в идентификаторе функции.

```javascript
$ aptos move run --function-id default::message::set_message --args string:hello!
{
  "Result": {
    "changes": [
      {
        "address": "b9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
        "data": {
          "authentication_key": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
          "self_address": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
          "sequence_number": "3"
        },
        "event": "write_resource",
        "resource": "0x1::account::Account"
      },
      {
        "address": "b9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
        "data": {
          "coin": {
            "value": "9777"
          },
          "deposit_events": {
            "counter": "1",
            "guid": {
              "id": {
                "addr": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
                "creation_num": "1"
              }
            }
          },
          "withdraw_events": {
            "counter": "1",
            "guid": {
              "id": {
                "addr": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
                "creation_num": "2"
              }
            }
          }
        },
        "event": "write_resource",
        "resource": "0x1::coin::CoinStore<0x1::aptos_coin::AptosCoin>"
      },
      {
        "address": "b9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
        "data": {
          "counter": "4"
        },
        "event": "write_resource",
        "resource": "0x1::guid::Generator"
      },
      {
        "address": "b9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
        "data": {
          "message": "hello!",
          "message_change_events": {
            "counter": "0",
            "guid": {
              "id": {
                "addr": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
                "creation_num": "3"
              }
            }
          }
        },
        "event": "write_resource",
        "resource": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb::Message::MessageHolder"
      }
    ],
    "gas_used": 41,
    "success": true,
    "version": 3488,
    "vm_status": "Executed successfully"
  }
}
```

## Примеры команд Ноды

**Запуск локальной тестовой сети**

Вы можете запустить локальный тестнет из aptos CLI, который будет соответствовать версии, с которой он был собран. Кроме того, можно запустить faucet  локальной одной нодой в  тестнете.

```javascript
$ aptos node run-local-testnet --with-faucet
Completed generating configuration:
        Log file: "/Users/greg/.aptos/testnet/validator.log"
        Test dir: "/Users/greg/.aptos/testnet"
        Aptos root key path: "/Users/greg/.aptos/testnet/mint.key"
        Waypoint: 0:d302c6b10e0fa68bfec9cdb383f24ef1189d8850d50b832365eea21ae52d8101
        ChainId: TESTING
        REST API endpoint: 0.0.0.0:8080
        FullNode network: /ip4/0.0.0.0/tcp/6181

Aptos is running, press ctrl-c to exit
```
Это обеспечит стабильное состояние, если нода будет выключена, она начнет работу с предыдущего состояния. Если вы хотите перезапустить сеть из `genesis`, вы можете добавить флаг `--force-restart`.

```javascript
$ aptos node run-local-testnet --with-faucet --force-restart
Are you sure you want to delete the existing chain? [yes/no] >
yes
Completed generating configuration:
        Log file: "/Users/greg/.aptos/testnet/validator.log"
        Test dir: "/Users/greg/.aptos/testnet"
        Aptos root key path: "/Users/greg/.aptos/testnet/mint.key"
        Waypoint: 0:649efc34c813d0db8db6fa5b1ffc9cc62f726bb5168e7f4b8730bb155d6213ea
        ChainId: TESTING
        REST API endpoint: 0.0.0.0:8080
        FullNode network: /ip4/0.0.0.0/tcp/6181

Aptos is running, press ctrl-c to exit
```

## Церемонии Genesis

Инструмент `aptos` поддерживает загрузку новых блокчейнов посредством так называемой церемонии генезиса. Результатом церемонии генезиса является вывод команд Move, которые подготавливают блокчейн к работе в режиме онлайн. Входные данные состоят из:

- Набор валидаторов и их конфигурация
- Начальный набор модулей Move, известный как фреймворк
- Уникальный `ChainId` (u8), который отличает эту сеть от других развертываний.
- Для тестовых сетей также существует учетная запись, которая управляет минтом AptosCoin

## Генерирование Genesis

- Органайзер genesis создает `Layout` и распределяет его.
- Органайзер genesis подготавливает bytecode фреймворка Aptos и распределяет его.
- Каждый участник создает свою конфигурацию `ValidatorConfiguration` и распределяет ее.
- Каждый участник генерирует `genesis.blob` из полученных вкладов.
- Организатор genesis выполняет `genesis.blob` для получения начальной путевой точки и распределяет ее.
- Каждый участник создает свой `aptos-node`. При запуске `aptos-node` проверяет, что `genesis.blob` соответствует путевой точке, предоставленной организатором genesis.
- Блокчейн начнет консенсус после того, как наберется необходимый stake.

**Подготовка Aptos-core**

Следующее руководство предполагает, что у вас есть доступ к репозиторию Aptos-core или связанным с ним инструментам. Вы можете загрузить и подготовить Aptos-core с [GitHub](https://aptos.dev/cli-tools/aptos-cli-tool/use-aptos-cli#generating-a-peer-config:~:text=Aptos%2Dcore%20from-,GitHub,-%3A):

```
git clone https://github.com/aptos-labs/aptos-core.git
cd aptos-core
git checkout --track origin/testnet
./scripts/dev_setup.sh
source ~/.cargo/env
```
**Файл `Layout`**

Файл Layout содержит:

`root_key`: открытый ключ Ed25519 для управления AptosCoin.
`users`: набор участников
`chain_id`: `ChainId` или уникальное целое число, которое отличает данное развертывание от других сетей Aptos

Пример:

```
root_key: "0xca3579457555c80fc7bb39964eb298c414fd60f81a2f8eedb0244ec07a26e575"
users:
  - alice
  - bob
chain_id: 8
```
**Создание Aptos фреймворк**

Из репозитория Aptos-core создайте фреймворк и поместите его в папку:

```
cargo run --package framework
mkdir aptos-framework-release
cp aptos-framework/releases/artifacts/current/build/**/bytecode_modules/* aptos-framework-release
```
Фреймворк будет храниться в каталоге `aptos-framework-release`.

**Файл `ValidatorConfiguration` **

Файл ValidatorConfiguration содержит:

- `account_address`: Учетная запись, которая управляет этим валидатором. Он должен быть получен из ключа `account_key`, предоставленного в файле `ValidatorConfiguration`.
- `consensus_key`: Открытый ключ для аутентификации сообщений консенсуса от валидатора.
- `account_key`: Открытый ключ для учетной записи, которая управляет этим валидатором. Он используется для получения адреса `account_address`.
- `network_key`: Открытый ключ для аутентификации и шифрования сети валидатора и fullnode.
- `validator_host`: сетевой адрес, на котором находится валидатор. Он содержит поле `host` и `port`. `host` должен быть либо именем DNS, либо IP-адресом. В настоящее время поддерживается только IPv4.
- `full_node_host`: необязательный сетевой адрес, на котором находится fullnode. Содержит поле `host` и `port`. `host` должен быть либо именем DNS, либо IP-адресом. В настоящее время поддерживается только IPv4.
- `stake_amount`: Количество монет, на которые делает ставку данная нода. Ожидается, что это значение будет равно `1`, если оно отличается, конфигурация будет считаться недействительной.

Пример:

```
account_address: ccd49f3ea764365ac21e99f029ca63a9b0fbfab1c8d8d5482900e4fa32c5448a
consensus_key: "0xa05b8f41057ac72f9ca99f5e3b1b787930f03ba5e448661f2a1fac98371775ee"
account_key: "0x3d15ab64c8b14c9aab95287fd0eb894aad0b4bd929a5581bcc8225b5688f053b"
network_key: "0x43ce1a4ac031b98bb1ee4a5cd72a4cca0fd72933d64b22cef4f1a61895c2e544"
validator_host:
  host: bobs_host
  port: 6180
full_node_host:
  host: bobs_host
  port: 6182
stake_amount: 1
```
Чтобы создать его с помощью `aptos` CLI:

1.Сгенерируйте ключи валидатора:

```
cargo run --package aptos -- genesis generate-keys --output-dir bobs
```
2.Создайте свою конфигурацию `ValidatorConfiguration`:

```
cargo run --package aptos -- \\
    genesis set-validator-configuration \\
    --keys-dir bobs \\
    --username bob \\
    --validator-host bobs_host:6180 \\
    --full-node-host bobs_host:6180 \\
    --local-repository-dir .
```
3.Последняя команда создаст файл `bob.yaml`, который должен быть распределен среди других участников для генерации `genesis.blob`.

**Генерация генезиса и путевой точки**

`genesis.blob` и путевая точка могут быть сгенерированы после получения файла `Layout`, каждого из отдельных файлов `ValidatorConfiguration` и релиза фреймворка. Важно убедиться, что `ValidatorConfiguration`, предоставленный на предыдущем этапе, совпадает с дистрибутивом для генерации `genesis.blob`. Если есть несоответствие, сообщите об этом всем участникам.

Для генерации `genesis.blob` и путевой точки:

- Поместите файл `Layout` в папку, например, `genesis`.
- Поместите все файлы `ValidatorConfiguration` в папку `genesis`.
- Убедитесь, что файлы `ValidatorConfiguration` перечислены под набором `users` в файле `Layout`.
- Создайте папку `framework` в папке `genesiss` и поместите файлы `.mv` релиза framework в папку `framework`.
- Используйте `aptos` CLI для генерации genesis и путевой точки:

```
cargo run --package aptos -- genesis generate-genesis --local-repository-dir genesis
```
**Запуск aptos-node**

После генерации `genesis.blob` и путевой точки поместите их в каталог конфигурации вашего валидатора и fullnode и запустите ваш валидатор и fullnode.