1

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 上发现了这一点,上面的内容作为我想象的实现似乎是有意义的。

4

1 回答 1

2

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

于 2021-05-19T12:57:07.687 回答