Структура программы Aleo
Программа Aleo содержит описания ProgramID, Imports, Functions, Closures, Interfaces, Records, Mappings и Finalize. Порядок следования соблюдается только для импортов, которые должны находиться в верхней части файла. Декларации доступны локально в пределах файла программы. Если вам нужна декларация из другого файла программы, вы должны импортировать ее.
ProgramID
Идентификатор программы декларируется как {name}.{network}
.
В настоящее время aleo
является единственным поддерживаемым network
доменом.
program hello.aleo;
Импорт (Imports)
Импорт декларируется как import {ProgramID}
;
Импорт получает другие декларации по их идентификатору программы и переносит их в область видимости текущего файла. Вы можете импортировать зависимости, загруженные в каталог imports
.
import foo.aleo; // Import the `foo.aleo` program into the `hello.aleo` program.
program hello.aleo;
Функция (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;
Вход функции (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;
Выходы функций (Function Outputs)
Выход функции декларируется как output {register} as {type}.{visibility}
;
Выходы функций должны быть объявлены в конце определения функции.
...
output r0 as field.public;
Закрытие (Closures)
Закрытие декларируется как closedure {name}:
Функции содержат инструкции, которые могут вычислять значения. Закрытия - это вспомогательные функции, которые не могут выполняться напрямую. Закрытия должны декларироваться другими функциями.
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}
.
interface array3:
a0 as u32;
a1 as u32;
a2 as u32;
Запись (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;
Картирование (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;
Инкремент и декремент (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;
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;
Top comments (0)