我正在尝试在 localnet 上测试一个程序,该程序会进行许多跨程序调用(CPI)。是否有一种简单的方法可以使用从 mainnet-beta 复制的所有帐户来初始化 localnet 集群?
我知道命令clone
上有一个标志,solana-test-validator
但是对我需要复制的所有帐户使用克隆是不切实际的。
我正在尝试在 localnet 上测试一个程序,该程序会进行许多跨程序调用(CPI)。是否有一种简单的方法可以使用从 mainnet-beta 复制的所有帐户来初始化 localnet 集群?
我知道命令clone
上有一个标志,solana-test-validator
但是对我需要复制的所有帐户使用克隆是不切实际的。
作为另一种选择,你可以尝试使用 Solana monorepo 的这个分支,它旨在从主网克隆分类帐的整个状态,并从中启动一个验证器:https ://github.com/DappioWonderland/solana
请注意,我没有使用它,也没有对其进行审核以确保它不会做任何可疑的事情,但如果它兑现了承诺,它应该正是你所需要的!
从命令行调用solana-test-validator
来执行此操作是不切实际的。
我采用的方法是solana account
将帐户获取到本地文件,然后使用 solana 测试验证器的“代码中”初始化来加载这些帐户,然后进行测试。
对于第一部分,您可以构建一个脚本来调用:
solana account -o LOCALFILE.json --output json-compact PUBLIC_KEY
它将获取关联的帐户PUBLIC_KEY
并放入LOCALFILE.son
然后,在 rust 中(只是一个使用 2 个帐户的示例,但它可能更多。您很可能想要遍历一个众所周知的目录来加载并循环该目录以构建输入 Vec:
fn load_stored(tvg: &mut TestValidatorGenesis) -> &mut TestValidatorGenesis {
let mut avec = Vec::<AccountInfo>::new();
for i in 0..2 {
let akp = get_keypair(USER_ACCOUNT_LIST[i]).unwrap();
avec.push(AccountInfo {
address: akp.pubkey(),
filename: USER_STORED_LIST[i],
});
}
tvg.add_accounts_from_json_files(&avec)
}
/// Setup the test validator with predefined properties
pub fn setup_validator() -> Result<(TestValidator, Keypair), Box<dyn error::Error>> {
let vwallet = get_keypair(WALLET_ACCOUNT).unwrap();
std::env::set_var("BPF_OUT_DIR", PROG_PATH);
let mut test_validator = TestValidatorGenesis::default();
test_validator.ledger_path(LEDGER_PATH);
test_validator.add_program(PROG_NAME, PROG_KEY);
load_stored(&mut test_validator);
// solana_logger::setup_with_default("solana=error");
let test_validator =
test_validator.start_with_mint_address(vwallet.pubkey(), SocketAddrSpace::new(true))?;
Ok((test_validator, vwallet))
}
您可以启动验证器-um
-c ADDRESS
以预加载包含 mainnet-beta 内容的帐户。在实践中这通常是不可行的,因为您只需要多个帐户,但对于小型程序它确实有效。