Что делает применение XOR между инструкциями ввода и данными учетной записи в этом смарт-контракте Solana?

https://github.com/solana-labs/break/blob/master/program/src/lib.rs

      use solana_program::{
    account_info::AccountInfo, entrypoint, entrypoint::ProgramResult, pubkey::Pubkey,
};

entrypoint!(process_instruction);
fn process_instruction<'a>(
    _program_id: &Pubkey,
    accounts: &'a [AccountInfo<'a>],
    instruction_data: &[u8],
) -> ProgramResult {
    // Assume a writable account is at index 0
    let mut account_data = accounts[0].try_borrow_mut_data()?;

    // xor with the account data using byte and bit from ix data
    let index = u16::from_be_bytes([instruction_data[0], instruction_data[1]]);
    let byte = index >> 3;
    let bit = (index & 0x7) as u8;
    account_data[byte as usize] ^= 1 << (7 - bit);

    Ok(())
}

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

Заранее спасибо.


РЕДАКТИРОВАТЬ: Это сделано для создания программного адреса? Я нашел это в их API, и мне кажется, что вышесказанное имеет смысл в качестве реализации этого, как я могу себе представить.

1 ответ

1 << n наборы nбит того, что называется маской, например 1 << 1 = 0010.

XOR - полезная операция, которая позволяет сравнивать биты, и в этом случае она использует это свойство. Если текущий бит равен 0, он будет установлен в 1, а если он равен 1, он будет установлен в 0.

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

1111 ^ 0010 = 1101, результатом будет разница, бит, который соответствует, устанавливается в 0.

1101 ^ 0010 = 1111, здесь каждый бит отличается, поэтому бит, который не совпадает, также устанавливается на 1.


Короче говоря, он немного переключается, это обычная идиома в коде битовых манипуляций.

      bits ^= 1 << n

Связанный: /questions/10497706/kak-vyi-ustanavlivaete-ochischaete-i-pereklyuchaete-odin-bit/10497734#10497734

Другие вопросы по тегам