问题描述
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