在这个 Solana 智能合约中,在输入指令和账户数据之间应用 XOR 有什么作用?

问题描述

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 上发现了 this,上面的内容似乎是我想象中的一个实现。

解决方法

1 << n 设置所谓的掩码的第 n 位,例如 1 << 1 = 0010

XOR 是一种允许比较位的有用操作,在这种情况下,它利用了该属性。如果当前位为 0,则设置为 1,如果当前位为 1,则设置为 0。

使用上面的掩码,我们可以选择一个特定的位进行比较,或者在这种情况下,根据它当前的值进行切换。

1111 ^ 0010 = 1101,结果是不同的,匹配的位被设置为0

1101 ^ 0010 = 1111,这里的每一位都不同,所以不匹配的位也设置为1


简而言之,它有点切换,这是位操作代码中的常见习语。

bits ^= 1 << n

相关:https://stackoverflow.com/a/47990/15971564