DEV Community

EgorMajj
EgorMajj

Posted on

Начало работы | Руководство по языку Aleo Instructions

Структура программы Aleo

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

ProgramID

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

program hello.aleo;
Enter fullscreen mode Exit fullscreen mode

Импорт (Imports)

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

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

program hello.aleo;
Enter fullscreen mode Exit fullscreen mode

Функция (Functions)

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

function foo:
    input r0 as field.public;
    input r1 as field.private;
    add r0 r1 into r2;
    output r2 as field.private;
Enter fullscreen mode Exit fullscreen mode

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

// The function `foo` takes a single input `r0` with type `field` and visibility `public`.
function foo:
    input r0 as field.public; 
Enter fullscreen mode Exit fullscreen mode

Выходы функций (Function Outputs)
Выход функции декларируется как output {register} as {type}.{visibility};
Выходы функций должны быть объявлены в конце определения функции.

...
    output r0 as field.public;
Enter fullscreen mode Exit fullscreen mode

Закрытие (Closures)

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

closure foo:
    input r0 as field;
    input r1 as field;
    add r0 r1 into r2;
    output r2 as field;
Enter fullscreen mode Exit fullscreen mode

Интерфейс (Interfaces)

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

interface array3:
    a0 as u32;
    a1 as u32;
    a2 as u32;
Enter fullscreen mode Exit fullscreen mode

Запись (Records)

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

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;
Enter fullscreen mode Exit fullscreen mode

Картирование (Mappings)

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

// 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;
Enter fullscreen mode Exit fullscreen mode

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

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;
Enter fullscreen mode Exit fullscreen mode

Finalize

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

// 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;
Enter fullscreen mode Exit fullscreen mode

Top comments (0)