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

AWS Security LIVE!

Tune in for AWS Security LIVE!

Join AWS Security LIVE! for expert insights and actionable tips to protect your organization and keep security teams prepared.

Learn More

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Immerse yourself in a wealth of knowledge with this piece, supported by the inclusive DEV Community—every developer, no matter where they are in their journey, is invited to contribute to our collective wisdom.

A simple “thank you” goes a long way—express your gratitude below in the comments!

Gathering insights enriches our journey on DEV and fortifies our community ties. Did you find this article valuable? Taking a moment to thank the author can have a significant impact.

Okay