Интроспекция инструкций

Проблема

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

Решение

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

Можно использовать две вспомогательные функции для извлечения этих данных:

fn load_current_index(instruction_data: &[u8]) -> u16;
fn load_instruction_at(instruction_index: usize, instruction_data: &[u8]) -> Result<Instruction>;

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

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