将任意长度数据传递给锚点 (Solana) 指令调用的最佳方法是什么?



我想在Solana帐户中存储任意长度的结构化数据集合…类似于JS中的[{foo: "bar"}, {foo: "quux"}],理想情况下在对象中任意嵌套。我正在考虑将其存储在Rust结构中的Vec<T>中(这是正确的方法吗?),但不清楚如何通过锚RPC发送此消息,即如何对其进行borsh编码。

更具体地说,例如我有这个指令,但我不知道如何使用Anchor的program.rpc.createWorkSpec将数据发送到它。

指针吗?

好的,所以这最终工作几乎是我预期的开始,所以我一定是在我尝试的中间事情中做错了什么。

您可以看到https://github.com/workbenchapp/worknet/blob/c51113b09b64201cc25a22dfb845a295f6ee5072/programs/worknet/src/lib.rs#L12接受Vec<Container>作为其参数之一…

#[derive(Default, Copy, Clone, AnchorSerialize, AnchorDeserialize)]
pub struct PortMapping {
pub inner_port: u16,
pub outer_port: u16,
pub port_type: PortType,
}
#[derive(Clone, AnchorSerialize, AnchorDeserialize)]
pub struct Container {
pub image: String,
pub args: Vec<String>,
pub port_mappings: Vec<PortMapping>,
}
#[account]
#[derive(Default)]
pub struct WorkSpec {
containers: Vec<Container>,
}

可以传递嵌套对象/数组映射(rust_snake转换为jsCamelCase)

const specContainers = [
{
image: "alpine",
args: ["echo", "hi"],
portMappings: [],
},
];
await program.rpc.createWorkSpec(specContainers, {
accounts: {
spec: spec.publicKey,
authority: provider.wallet.publicKey,
systemProgram: SystemProgram.programId,
},
signers: [spec],
});

最新更新