Аккаунты только для чтения
Этот дизайн охватывает обработку учетных записей только для чтения и записи в runtime. Несколько транзакций, которые изменяют одну и ту же учетную запись, должны обрабатываться последовательно, чтобы они всегда воспроизводились в одном и том же порядке. В противном случае это может привести к недетерминированности леджера. Однако некоторым транзакциям нужно только читать, а не изменять данные в определенных учетных записях. Несколько транзакций, которые считывают только одну и ту же учетную запись, могут обрабатываться параллельно, поскольку порядок воспроизведения не имеет значения, что обеспечивает выигрыш в производительности.
Чтобы идентифицировать учетные записи только для чтения, структура MessageHeader транзакции содержит num_readonly_signed_accounts
и num_readonly_unsigned_accounts
. Инструкции program_ids
включены в вектор учетных записей как неподписанные учетные записи только для чтения, поскольку исполняемые учетные записи также не могут быть изменены во время обработки инструкции.
Обработка во время выполнения
Правила обработки транзакций во время выполнения необходимо немного обновить. Программы по-прежнему не могут писать или тратить счета, которые им не принадлежат. Но новые правила среды выполнения гарантируют, что учетные записи только для чтения не могут быть изменены даже программами, которым они принадлежат.
Учетные записи только для чтения имеют следующее свойство:
- Доступ только для чтения ко всем полям учетной записи, включая лампы (не могут быть зачислены или дебетованы) и данные учетной записи
Инструкции по кредитованию, дебетованию или изменению учетной записи только для чтения не будут выполнены.
Оптимизация блокировки учетной записи
Модуль «Учетные записи» отслеживает текущие заблокированные учетные записи во время выполнения, отделяя учетные записи только для чтения от учетных записей с возможностью записи. Блокировка учетной записи по умолчанию дает учетной записи обозначение «доступной для записи» и может быть доступна только одному потоку обработки одновременно. Учетные записи только для чтения блокируются отдельным механизмом, позволяющим выполнять параллельное чтение.
Хотя учетные записи только для чтения еще не реализованы, они могут кэшироваться в памяти и совместно использоваться всеми потоками, выполняющими транзакции. Идеальный проект должен хранить этот кеш, пока любая транзакция, проходящая через среду выполнения, ссылается на учетную запись только для чтения, и освобождать кеш, когда последняя транзакция выходит из среды выполнения.
Учетные записи только для чтения также могут быть переданы в процессор в качестве ссылок, сохраняя дополнительную копию.