November 14, 2022

Разработка с помощью Aleo-JS

Мой Discord: useless_dorozhkina#1394 Ссылка на оригинал статьи: https://www.entropy1729.com/start-developing-in-aleo-with-aleo-sdk-and-aleo-js/

В данной статье мы рассмотрим различные инструменты, которые мы разрабатываем, чтобы вы могли начать разработку ваших собственных приложений в Aleo. Кроме того, мы запустим локальную ноду для майнинга блоков всего за несколько шагов, чтобы позже использовать её для связи нашего нового приложения с реестром.

1. Запуск локальной ноды

Чтобы собрать всё необходимое в Aleo SDK и запустить ноду, вам понадобится установленный компилятор rust. Чтобы установить его, вы можете выполнить следующую команду:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Если он у вас уже есть, мы рекомендуем проверить, есть ли какие-либо обновления в компиляторе rust, чтобы быть уверенными, что все будет верно работать для Aleo SDK. Чтобы проверить, вы можете выполнить:

rustup update stable

Возможно вам потребуется закрыть и заново открыть терминал, чтобы должным образом завершить процесс установки.

Теперь вы готовы клонировать репозиторий Aleo SDK и начать полную настройку. На самом деле, вы клонируете форк Entropy1729 от Aleo SDK, который содержит все последние изменения и функции.

# Загрузить исходный код
git clone https://github.com/Entropy1729/aleo.git

# Перейти в root проекта
cd aleo

# Установить Aleo
cargo install --path .

Чтобы проверить, все ли вы сделали правильно, выполните:

aleo -h

вы должны будете увидеть следующее:

Все готово.

Aleo SDK идёт в комплекте с несколькими примерами программ, которых будет достаточно для наших целей, поэтому нет необходимости создавать новую программу. Некоторое время назад мы опубликовали статью под названием "Aleo Development Starter Pack", в которой создали и объяснили программу токенов, а затем развернули ее на локальной ноде.

Для этой статьи нам нужно будет лишь перейти к одному из примеров программ и запустить ноду, так что давайте сделаем это.

Для данного руководства мы будем использовать программу simple_token. Перед запуском ноды важно просмотреть содержимое следующего файла:

# Перейти к примеру программы
cd examples/simple_token

Там вы увидите файл с именем program.json, который выглядит следующим образом:

Данный файл содержит учетные данные (private key и address) аккаунта, который будет майнить и развертывать программы на нашей локальной ноде. Они будут полезны позже в этой статье, так что запомните их.

Теперь, чтобы продолжить запуск ноды, просто вводите следующие команды в каталоге simple_token, в котором вы уже находитесь:

# Развернуть программу и запустить майнер
aleo node start

И это все; вы должны увидеть подобный результат:

⏳ Starting a local development node for 'token.aleo' (in-memory)... 

• Executing 'credits.aleo/genesis'... 
• Executed 'genesis' (in 1979 ms) 
• Verified 'genesis' (in 7 ms) 
• Verified 'genesis' (in 6 ms)

🌐 Server is running at http://0.0.0.0:4180 

📦 Deploying 'token.aleo' to the local development node...

• Loaded universal setup (in 1580 ms) 
• Built 'mint' (in 9325 ms) 
• Certified 'mint': 254 ms
• Built 'transfer' (in 13848 ms) 
• Certified 'transfer': 509 ms 
• Calling 'credits.aleo/fee'...
• Executed 'fee' (in 2560 ms) 
• Verified certificate for 'mint': 65 ms 
• Verified certificate for 'transfer': 103 ms 
• Verified 'fee' (in 6 ms) 
• Verified certificate for 'mint': 66 ms 
• Verified certificate for 'transfer': 101 ms 
• Verified 'fee' (in 6 ms)
• Verified certificate for 'mint': 77 ms 
• Verified certificate for 'transfer': 102 ms 
• Verified 'fee' (in 6 ms) 
• Verified certificate for 'mint': 73 ms 
• Verified certificate for 'transfer': 144 ms 
• Verified 'fee' (in 6 ms)

🛡️ Produced block 1 (ab12slup04u3z84l6qsw06y6l85ryacxsjtymalf4f7p8c8gkguxvxsk44x5f)

{
    "previous_state_root": "2817610268342789758153341947932865525763648224638186354448819908118351259277field",
    "transactions_root": "3171802377909394876352269413600808592571527618205118587254721468779703127650field",
    "metadata": {
      "network": 3, 
      "round": 1, 
      "height": 1, 
      "coinbase_target": 18446744073709551615, 
      "proof_target": 18446744073709551615, 
      "timestamp": 1667595496
    } 
}

✅ Deployed 'token.aleo' in transaction 'at1xu40mu9g7y7atrjg8wtt9mzcr2t06wehdmt2lxmhvcrlsmclgyyskdhtqd'

• Executing 'credits.aleo/transfer'... 
• Executed 'transfer' (in 3245 ms) 
• Verified 'transfer' (in 6 ms) 
• Verified 'transfer' (in 6 ms) 
• Verified 'transfer' (in 6 ms)

🛡️ Produced block 2 (ab10qjn638rnq0rzzq0qgvnujerx9kekxwfs6jcktqdcftcnntjmvxq2m2dy2)

...

Теперь у вас есть локальная нода, которая майнит блоки. Как вы можете видеть в результате запуска, нода по умолчанию будет работать на http://0.0.0.0:4180.

Это все, что вам понадобится для этого руководства. Давайте двигаться дальше.

2. Отправка токенов

Чтобы протестировать и воспроизвести функции, которые имеются в Aleo-JS, нам понадобится много токенов. Прямо сейчас самый простой способ получить их — отправить запрос cURL ноде с помощью private key, который используется для майнинга блоков на локальной ноде, и с помощью address, на который мы хотим получить токены.

Итак, первое, что нам нужно сделать, это создать Account, который мы будем использовать для разработки; для этого мы клонируем Aleo-JS и начнем его использовать.

## Клонировать репозиторий AleoJS
git clone https://github.com/Entropy1729/aleo-js.git

Внутри репозитория вы найдете каталог под названием dev_site, который содержит все необходимые конфигурации для запуска тестового веб-сайта и начала использования функционала Aleo-JS.

Чтобы создать и запустить тестовый веб-сайт, выполните следующие команды:

## Перейти в каталог dev_site
cd dev_site

## Создать зависимости
npm run build

## Запустить локальный веб-сайт
npm run dev

Вы должны увидеть следующий вывод или нечто на него похожее:

<i> [webpack-dev-server] Project is running at:
<i> [webpack-dev-server] Loopback: http://localhost:4000/
<i> [webpack-dev-server] On Your Network (IPv4): http://192.168.0.34:4000/
<i> [webpack-dev-server] On Your Network (IPv6): http://[fe80::1]:4000/
<i> [webpack-dev-server] Content not from webpack is served from '~/Documents/aleo_repos/aleo-js/dev_site/dist' directory
asset cc9f07ba5b4549f3396a.module.wasm 484 KiB [emitted] [immutable] (auxiliary name: index)
asset index.bundle.js 292 KiB [emitted] (name: index)
asset index.html 185 bytes [emitted]
runtime modules 30.2 KiB 15 modules

Результат указывает на то, что новый веб-сайт запущен на http://localhost:4000/.

Если мы откроем эту ссылку, мы должны будем увидеть веб-сайт с белым фоном и надписью "Aleo JS Test Site". Отныне мы будем использовать веб-консоль в инструментах разработчика нашего веб-браузера для тестирования каждой функции. Как мы упоминали ранее, нам нужен аккаунт, чтобы начать получать деньги с нашей ноды. В веб-консоли выполните следующие команды:

// Точка входа для использования Account и NodeConnection
const { Account } = await AleoJS

// Создать новый Account
const myAcc = new Account()

// Получить ключи аккаунта
myAcc.keys()

вы должны будете увидеть нечто похожее на следующее:

Отлично! Мы создали новый аккаунт. Теперь у нас есть все, что нам нужно для перевода токенов.

cURL, который мы собираемся использовать, выглядит следующим образом

Вам нужно будет заменить поле "from" тела запроса на упомянутый при запуске ноды private key, который мы использовали в program.json. Это закрытый ключ, который содержит "намайненные" токены нашей ноды. Наконец, address должен быть тем, который мы сгенерировали с помощью Aleo-JS. Для этого шага это должно быть всё.

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

3. Поиграем с Aleo-JS

Библиотека Aleo-JS включает в себя множество полезных функций для нашей разработки; мы уже научились запускать тестовый веб-сайт и увидели первые шаги по созданию подключения к ноде и настройке аккаунта на ней.

Aleo-JS в основном разделяет функционал между NodeConnection и Account. Изначально всё выглядит следующим образом:

// Точка входа для использования Account и NodeConnection
const {Account, NodeConnection} = await AleoJS

// Создать новый Account
const myAcc = new Account({privateKey:"<private-key-account>"})

// Создать соединение с нашей нодой
const myConn = new NodeConnection("http://127.0.0.1:4180")

// Установить учетную запись для нашего подключения
myConn.setAccount(myAcc)

Теперь вместо того, чтобы создавать новый аккаунт, мы импортировали уже существующий с помощью сгенерированного ранее privateKey. Теперь вы можете использовать два разных класса в зависимости от того, что вы хотите сделать; вот несколько примеров функций, которыми обладает соединение:

// Получить последний блок
myConn.getLatestBlock()

// Получить блок с высоты
myConn.getBlock(1)

// Получить все транзакции в блоке
myConn.getTransactions(1)

Теперь давайте рассмотрим некоторые примеры функций, связанных с учетной записью:

Подписание

Все, что вам нужно сделать, чтобы подписать и подтвердить сообщение:

// Подписать и подтвердить подпись без аккаунта
let signature = myAcc.sign("a message to sign")
myAcc.verify("a message to sign", signature)

Расшифровывание записей

Чтобы расшифровать свои записи, сначала вам нужно будет получить от ноды ваш Unspent Ciphertexts, вы можете сделать это с помощью следующей функции:

// Расшифровать записи
const ciphers = await myConn.getUnspentCiphertexts()
[ "record1qyqsqlrpzaje45yalyycgqz5p3furdk8ltuj3dek4fum7tpxr9dze6gdqyqsp4azr4ch86n25crcj8tr9ck37m20e07xtd88wpwjgjt6e2w9jug0qqq9mgzd752llfgvy93qlnukxyzcys7ve6kd0mvknms7aacg4qx3cyglrwzgx"
]

Теперь давайте расшифруем эти шифротексты:

ciphers.map(c => myAcc.decryptRecord(c)).map(r => r.to_string()).pop()

И после этого вы должны увидеть, что ваша запись отправки была расшифрована со стороны клиента!:

"{
    owner: aleo19jr4shhpfusy7y5zm7g56hspe4hus6p84m5c9k3rqh77c43gfgqsyjqcgx.private,
    gates: 100u64.private,
    _nonce: 7738884396647363829465636137955226807109756206255384966048643179446086246493group.public
}"

Чтобы ознакомиться со всеми доступными функциями и некоторыми примерами каждой из них, вы можете обратиться к документации Aleo-JS. Кроме того, у вас есть документация Aleo-SDK, поскольку это зависимость Aleo-JS, некоторые её типы и функции могут быть полезны для разработки более сложных программ.

Счастливого написания кода!