Сб. Ноя 27th, 2021
    RSquad, Solana

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

    Опытом делится Алексей Поляков, лидер blockchain-практики RSquad.

    Теоретическая база для начала работы с блокчейном Solana

    Перед началом работы необходимо выделить основные сущности, которые встречаются в процессе создания приложений. В большинстве блокчейнов, например Free TON и Ethereum, мы оперируем таким термином, как смарт-контракт.

    Особенность же разработки под Solana заключается в том, что в этом блокчейне смарт-контракты stateless, то есть они не могут изменить своего состояния. Именно поэтому здесь они называются программами, т.к. именно это определение подходит к такой реализации.

    Программы для Solana, в основном, пишутся на языке Rust. Стоит понимать, что не все возможности языка доступны для написания программ этого блокчейна. Например стандартный макрос println!() здесь не сработает, вместо него доступен msg!(). И даже если вы не знаете этот язык в совершенстве, это не будет большим препятствием для начала работы с Solana.

    Основная единица в блокчейне Solana — это аккаунт, который в зависимости от параметров может быть как программой (аккаунт, который содержит в себе инструкции), так и хранилищем (хранит в себе данные).

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

    Аккаунт

    Как уже было сказано, аккаунт — основная единица в блокчейне Solana. При этом у аккаунта есть несколько ролей в зависимости от того, какие значения параметров заданы для него при регистрации. Основные роли:

    • исполняемый — аккаунт становится программой;
    • только для чтения — может быть использован одновременно несколькими программами;
    • изменяемый — для хранения данных.

    Ниже приведена структура информации об аккаунте:

    Параметры, которые нас сейчас будут интересовать:

    • is_writable;
    • executable.

    Программа

    Легко догадаться, что если выставить параметр executable = true, данный аккаунт фактически станет программой, способной только исполнять код, который она содержала при деплое.

    Изначально аккаунт содержит нулевые данные, но уже известно, какие структуры будут храниться, соответственно, мы знаем сколько места будет занято.

    Вновь созданный аккаунт изначально принадлежит System program. Она может передать аккаунт другому владельцу. Данные о владельце содержатся в информации об аккаунте в поле owner. В него записывается публичный ключ public key владельца.

    В случае с программой публичный ключ является program_id. У владельца аккаунта хранится приватный ключ private key, с помощью которого подписываются транзакции. Эти ключи образуют уникальную пару, которой можно подтвердить владение аккаунтом.

    У программы всегда есть entry point (точка входа) — это место, откуда начинается выполнение программы. Причем она должна быть одна для программы.

    Program_id — это уникальный публичный ключ для вызова программы из другой программы или со стороны клиента.

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

    Только для чтения

    Если поставить флаг is_writable = false, данный аккаунт будет доступен только для чтения. Такие аккаунты решают задачу параллельной обработки транзакций, где необходимо использовать общие данные. Так как данный аккаунт нельзя изменять, мы можем быть уверены, что нужные нам данные валидны.

    Хранение данных

    Ну и третья роль — хранение данных, которые являются результатом выполнения программ и сохраняются в соответствующем аккаунте. За хранение данных взимается плата.

    Новый аккаунт создается без данных и с нулевым балансом. Аккаунт может быть владельцем другого аккаунта, за это отвечает параметр owner. Чтобы иметь возможность переводить средства lamports необходимо is_writable = true.

    Данные хранятся в аккаунтах, причем необходимо правильно выставить флаги и поддерживать баланс положительным. Он должен быть неисполняемым и с возможностью записи. Существует два пути содержания аккаунта — внести достаточную сумму на баланс или платить ренту.

    Минимальный баланс

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

    Рента за эпоху

    Каждые два дня списывается небольшое количество lamports. При достижении нулевого баланса аккаунт удаляется.

    Транзакции

    Выполнение программы начинается с отправки транзакции в кластер. Среда выполнения Solana выполнит программу для обработки каждой из инструкций, содержащихся в транзакции, по порядку и атомарно.

    Транзакция содержит компактный массив подписей, за которым следует сообщение. Каждый элемент в массиве подписей является цифровой подписью данного сообщения. Среда выполнения Solana проверяет, совпадает ли количество подписей с числом в первых 8 битах заголовка сообщения. Она также проверяет, чтобы каждая подпись была подписана закрытым ключом, соответствующим открытому ключу по тому же индексу в массиве адресов учетных записей сообщения.

    Защита от повторений транзакций

    Транзакция включает в себя параметр последний blockhash для предотвращения дублирования и увеличения срока службы транзакций. Любая транзакция, полностью идентичная предыдущей, отклоняется, поэтому добавление нового хэша блоков позволяет нескольким транзакциям повторять одно и то же действие.

    У транзакций также есть время жизни, которое определяется хэшем блоков, так как любая транзакция, blockhash которой слишком старый, будет отклонена.

    Вместо вывода

    Мы рассмотрели базовые принципы работы блокчейна Solana со стороны разработчика. Платформа перспективна, и количество проектов, которое использует блокчейн Solana, продолжает расти. Наряду с впечатляющими скоростями платформа может похвастаться довольно развитой и растущей экосистемой dApps.

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

    8
    0

    от RSquad