Sealevel — Параллельная обработка тысяч смарт-контрактов

Solana — самый производительный блокчейн в мире. На текущих итерациях Solana Testnet сеть из 200 физически отдельных узлов поддерживает устойчивую пропускную способность в более 50 000 транзакций в секунду при работе с графическими процессорами. Это достижение как таковое требует внедрения нескольких оптимизаций и новых технологий, в результате осуществляя прорыв в пропускной способности сети, который сигнализирует о новом этапе в разработке блокчейна.

7 ключевых технических инноваций, которые делают сеть Solana возможной:

  • Proof of History (POH)— часы перед консенсусом;
  • Tower BFT — PoH-оптимизированная версия PBFT;
  • Turbine — протокол распространения блоков;
  • Gulf Stream — протокол пересылки транзакций без мемпула;
  • Sealevel — Параллельно исполняемые смарт-контракты;
  • Cloudbreak — База данных горизонтально масштабируемых учетных записей; а также
  • Репликаторы — Распределенное хранение реестра

В этом материале мы рассмотрим Sealevel, параллельную среду выполнения смарт-контрактов Solana. Прежде чем мы начнем, нужно учесть, что среды выполнения EVM и EOS на основе WASM являются однопоточными. Это означает, что один контракт за раз изменяет состояние блокчейна. В Solana мы создали среду выполнения, которая может обрабатывать десятки тысяч контрактов параллельно, используя столько ядер, сколько доступно для валидатора.

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

Программы и Аккаунты

Cloudbreak, наша база данных учетных записей, является отображением открытых ключей учетных записей. Аккаунты поддерживают баланс и данные, где данные — это вектор байтов. Учетные записи имеют поле «владелец». Владелец — это открытый ключ программы, который управляет переходами состояний учетной записи. Программы являются кодом и не имеют состояния. Они полагаются на вектор данных в учетных записях, назначенных им для переходов состояний.

  1. Программы могут изменять только данные учетных записей, которым они назначены.
  2. Программы могут дебетовать только те счета, которые им назначены.
  3. Любая программа может кредитовать любую учетную запись.
  4. Любая программа может читать любой аккаунт.

По умолчанию при запуске все учетные записи принадлежат Системной программе.

  1. Системная программа — единственная программа, которая может назначить владельца учетной записи.
  2. Системная программа — единственная программа, которая может размещать инициализированные нулем данные.
  3. Назначение владельца учетной записи может происходить только один раз за время существования учетной записи.

Пользовательская программа загружается программой-загрузчиком. Программа-загрузчик может пометить данные в учетных записях как исполняемые. Пользователь выполняет следующие транзакции для загрузки пользовательской программы:

  1. Создать новый открытый ключ.
  2. Перевести монеты на ключ.
  3. Сказать Системной Программе выделить память.
  4. Сказать Системной Программе назначить учетную запись в Загрузчике.
  5. Загрузить байт-код в память по частям.
  6. Сказать программе Загрузчику пометить память как исполняемую.

На этом этапе загрузчик проверяет байт-код, и учетная запись, в которую загружен байт-код, может использоваться в качестве исполняемой программы. Новые учетные записи могут быть помечены как принадлежащие определенной пользователем программе.

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

Транзакции

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

size_t
readv(int d, const struct iovec iov, int iovcnt);
struct iovec {
char 
iov_base; / Base address. /
size_t iov_len; / Length. /
};

Интерфейсы, такие как readv или writev, заранее сообщают ядру всю память, которую пользователь хочет прочитать или записать. Это позволяет ОС предварительно выбирать, подготавливать устройство и одновременно выполнять операцию, если это позволяет устройство.

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

  1. Сортировка миллионов ожидающих транзакций.
  2. Планировка всех непересекающихся транзакций параллельно.

Более того, мы можем воспользоваться преимуществами оборудования CPU и GPU.

Solana, A Blockchain Built for Scale

Команды SIMD позволяют исполнять один фрагмент кода в нескольких потоках данных. Это означает, что Sealevel может выполнить дополнительную оптимизацию, уникальную в дизайне Solana:

  1. Сортировать все инструкции по идентификатору программы.
  2. Запустить одну и ту же Программу одновременно для всех учетных записей.

Чтобы понять, почему это такая мощная оптимизация, взгляните на Руководство разработчика CUDA:

“Архитектура CUDA построена на масштабируемом массиве многопоточных потоковых мультипроцессоров (SM). Когда программа CUDA на хост-процессоре вызывает сетку ядра, блоки сетки перечисляются и распределяются среди многопроцессорных систем с доступной производительностью.”

Современный графический процессор Nvidia имеет 4000 ядер CUDA, но около 50 многопроцессорных. Хотя мультипроцессор может одновременно выполнять только одну программную инструкцию, он может выполнять эту команду параллельно более чем с 80 различными входами. Таким образом, если все входящие транзакции, загруженные Sealevel, вызывают одни и те же программные инструкции, такие как CryptoKitties::BreedCats, Solana может выполнять все транзакции одновременно на всех доступных ядрах CUDA.

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

Solana, A Blockchain Built for Scale

Внедрение Solana Sealevel, наряду с такими инновациями, как Proof of History, Proof of Replication и Gulf Stream, создают самый производительный блокчейн в мире. Тестет Solana жив уже сегодня. Вы можете увидеть это по адресу https://testnet.https://solana.com/. В целях экономии мы используем только несколько узлов. Однако во многих случаях мы распространили его на более чем 200 физически различных узлов (не на совместно используемом оборудовании) в 23 центрах обработки данных в AWS, GCE и Azure для сравнительного анализа.

Среда выполнения также работает уже сегодня, и разработчики могут развернуть код в тестовом режиме уже сейчас. Сегодня разработчики могут создавать смарт-контракты на C, и мы активно работаем над набором инструментов Rust. Rust будет основным языком для разработки смарт-контрактов Solana. Набор инструментов Rust общедоступен как часть Solana Javascript SDK, и мы продолжаем работу над пакетом разработки ПО.

Вскоре Solana запустит общедоступную бета-версию, стимулирующую валидаторов для запуска узлов через Tour de SOL — аналог Cosmos «Game of Stakes» — которая ставит перед общественностью задачу протестировать пределы сети Solana, зарабатывая при этом токены.