Runtime

Возможности программ

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

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

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

Политика

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

Политика такова:

Расчет бюджета

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

Следующие операции влекут за собой вычислительные затраты:

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

Текущий вычислительный бюджет можно найти в Solana SDK.

Например, если текущий бюджет:

max_units: 200,000,
log_units: 100,
log_u64_units: 100,
create_program address units: 1500,
invoke_units: 1000,
max_invoke_depth: 4,
max_call_depth: 64,
stack_frame_size: 4096,
log_pubkey_units: 100,

Затем программа

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

Во время выполнения программа может регистрировать оставшуюся часть вычислительного бюджета. См. debugging для получения дополнительной информации.

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

Новые возможности

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

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

Чтобы определить, какие функции активированы, используйте инструменты командной строки Solana:

solana feature status

Если вы столкнулись с проблемами, сначала убедитесь, что версия инструментов Solana, которую вы используете, соответствует версии, возвращаемой solana cluster-version. Если они не совпадают установите правильный набор инструментов.