微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在这个 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。