Начало работы | Руководство по языку Aleo Instructions
Published: 2022-09-14 12:58:14

## Структура программы Aleo
Программа Aleo содержит описания ProgramID, Imports, Functions, Closures, Interfaces, Records, Mappings и Finalize. Порядок следования соблюдается только для импортов, которые должны находиться в верхней части файла. Декларации доступны локально в пределах файла программы. Если вам нужна декларация из другого файла программы, вы должны импортировать ее.

## ProgramID
Идентификатор программы декларируется как `{name}.{network}`.
В настоящее время `aleo` является единственным поддерживаемым `network` доменом.

```javascript
program hello.aleo;
```

## Импорт (Imports)
Импорт декларируется как `import {ProgramID}`;
Импорт получает другие декларации по их идентификатору программы и переносит их в область видимости текущего файла. Вы можете импортировать зависимости, загруженные в каталог `imports`.

```javascript
import foo.aleo; // Import the `foo.aleo` program into the `hello.aleo` program.

program hello.aleo;
```

## Функция (Functions)
Функция декларируется как `function {name}`:
Функции содержат инструкции, которые могут вычислять значения. Для декларирования функции должны находиться в текущей области видимости программы.

```javascript
function foo:
    input r0 as field.public;
    input r1 as field.private;
    add r0 r1 into r2;
    output r2 as field.private;
```

**Вход функции (Function Inputs)**
Вход функции декларируется как `input {register} us {type}.{visibility}`;
Входы функций должны быть декларирован сразу после вызова имени функции.

```javascript
// The function `foo` takes a single input `r0` with type `field` and visibility `public`.
function foo:
    input r0 as field.public; 
```
**Выходы функций (Function Outputs)**
Выход функции декларируется как `output {register} as {type}.{visibility}`;
Выходы функций должны быть объявлены в конце определения функции.

```javascript
...
    output r0 as field.public;
```

## Закрытие (Closures)
Закрытие декларируется как `closedure {name}:`
Функции содержат инструкции, которые могут вычислять значения. Закрытия - это вспомогательные функции, которые не могут выполняться напрямую. Закрытия должны декларироваться другими функциями.

```javascript
closure foo:
    input r0 as field;
    input r1 as field;
    add r0 r1 into r2;
    output r2 as field;
```

## Интерфейс (Interfaces)
Интерфейс - это структура данных, декларирирована как `interface {name}:`
Записи содержат декларации `{name} as {type}.{visibility}`;
Структуры данных записи должны содержать декларации `owner` и `gates`, как показано ниже.
При передаче записи в качестве входа в функцию программы также требуется декларация `_nonce as group.{visibility}`.

```javascript
interface array3:
    a0 as u32;
    a1 as u32;
    a2 as u32;
```

## Запись (Records)
[Запись](https://dev.to/egormajj/kontsieptsii-aleo-zapisi-272l) декларируется как `record {name}:`
Записи содержат декларации `{name} as {type}.{visibility}`;
Структуры данных записи должны содержать декларации `owner` и `gates`, как показано ниже.
При передаче записи в качестве входных данных в функцию программы также требуется декларация `_nonce as group.{visibility}`.

```javascript
record token:
    // The token owner.
    owner as address.private;
    // The Aleo balance (in gates).
    gates as u64.private;
    // The token amount.
    amount as u64.private;
```

## Картирование (Mappings)
Отображение декларируется как `mapping {name}:`
Сопоставления содержат пары ключ-значение.

```javascript
// On-chain storage of an `account` map, with `owner` as the key,
// and `amount` as the value.
mapping account:
    // The token owner.
    key owner as address.public;
    // The token amount.
    value amount as u64.public;
```

**Инкремент и декремент (Increment and Decrement)**
Инструкция инкремента декларируется как `increment {name}[{register}] by {register}`; инструкция декремента декларируется как `decrement {name}[{register}] by {register}`;

```javascript
finalize transfer_public:
    // Input the token sender.
    input r0 as address.public;
    // Input the token receiver.
    input r1 as address.public;
    // Input the token amount.
    input r2 as u64.public;

    // Decrements `account[r0]` by `r2`.
    // If `account[r0]` does not exist, it will be created.
    // If `account[r0] - r2` underflows, `transfer_public` is reverted.
    decrement account[r0] by r2;

    // Increments `account[r1]` by `r2`.
    // If `account[r1]` does not exist, it will be created.
    // If `account[r1] + r2` overflows, `transfer_public` is reverted.
    increment account[r1] by r2;
```

## Finalize
Функция finalize декларируется как `finalize {name}`:
Завершить программную функцию.
При успешном завершении функции finalize логика программы выполняется.
При неудаче функции finalize логика программы возвращается назад.

```javascript
// The function `transfer_public_to_private` turns a specified token amount
// from `account` into a token record for the specified receiver.
// 
// This function preserves privacy for the receiver's record, however
// it publicly reveals the caller and the specified token amount.
function transfer_public_to_private:
    // Input the token receiver.
    input r0 as address.public;
    // Input the token amount.
    input r1 as u64.public;

    // Produces a token record for the token receiver.
    cast r0 0u64 r1 into r2 as token.record;

    // Output the receiver's record.
    output r2 as token.record;

    // Decrement the token amount of the caller publicly.
    finalize self.caller r1;

finalize transfer_public_to_private:
    // Input the token owner.
    input r0 as address.public;
    // Input the token amount.
    input r1 as u64.public;

    // Decrements `account[r0]` by `r1`.
    // If `account[r0]` does not exist, it will be created.
    // If `account[r0] - r1` underflows, `transfer_public_to_private` is reverted.
    decrement account[r0] by r1;
```