我在Solana程序中定义了UserAction枚举。
#[derive(AnchorDeserialize)]
#[derive(AnchorSerialize)]
pub enum UserAction {
VIEW,
LIKE,
SHARE,
COMMENT,
DOWNLOAD,
}
在入口点使用这个。
pub fn my_fun(ctx: Context<DoPost>, action: UserAction) -> ProgramResult {
// Do something
Ok(())
}
如何使用@solana/web3.js传递enum?
发布于 2022-02-28 22:04:40
正如您已经注意到的,在JS中没有本地的方法来实现这一点,所以您必须手动进行编码,首先是一个字节来定义指令类型,然后是所有其他字节来定义指令数据。
下面是一个简单的调用VIEW
的例子,假设它也需要一个u64
import * as BufferLayout from '@solana/buffer-layout';
const instructionLayout = BufferLayout.struct([
BufferLayout.u8('instruction'),
BufferLayout.ns64('number'),
]);
const data = Buffer.alloc(instructionLayout.span);
instructionLayout.encode({instruction: 0, number: 42}, data);
const instruction = TransactionInstruction({
keys: [
{pubkey: myPubkey, isSigner: false, isWritable: true},
// .. add all your account keys here
],
programId: myProgramId,
data,
});
要获得更完整的示例,请查看web3.js:createAccount
中如何为系统程序定义https://github.com/solana-labs/solana/blob/f0a235d16fd21da11176c21297176234121a3d8c/web3.js/src/system-program.ts#L655
https://stackoverflow.com/questions/71252795
复制相似问题