在@solana/web3.js中,当您创建事务指令时,您可以指定帐户的公钥、程序id,以及您的"数据";参数在锚程序中,您将模块声明为具有相应属性的程序,现在您的pub函数将变为指令。我在锚书中找不到他们如何具体地序列化他们的指令名称。如何为JavaScript前端指定要执行的指令?
如何为JavaScript前端指定要执行的指令?
Anchor为此使用IDL(接口描述语言(。每当你完成你的索拉纳程序,你就可以构建它(锚构建(。使用此命令,您已将idl导出到root/target/idl文件夹中。您可以将此文件部署到Solana网络并获取它,并在任何客户端中制作一个程序,如ts(typescript(,因为它的映射。您可以打开其中一个IDL.json文件以更好地理解。使用此文件,您可以调用指令或使用索拉纳程序的帐户。
此外,在root/target/types中还有另一个扩展名为ts的文件。我们在锚测试中使用这个文件来创建一个带有该文件的程序,并指定我们要使用的指令或帐户。此外,此文件对于在客户端内创建锚定程序也很有用。因为该文件包含";导出常量IDL&";。所以,我们可以使用这个文件来创建这样的程序:
import { PROGRAM_ID } from "./constants";//program account public key
import { IDL } from "./your_directory_of_programs";// directory of copy/paste types/your_program.ts file
export function getProgramInstance(connection, wallet) {
if (!wallet.publicKey) return;
const provider = new anchor.AnchorProvider(
connection,
wallet,
anchor.AnchorProvider.defaultOptions()
);
// Read the generated IDL.
const idl = IDL;
// Address of the deployed program.
const programId = PROGRAM_ID;
// Generate the program client from IDL.
const program = new anchor.Program(idl, programId, provider);
return program;
}
并调用这样的任何指令:
await program.methods
.yourInstruction()
.accounts({
})
.signers()
.rpc();
阅读索拉纳食谱的这一部分,了解当我们想从TS或任何其他客户端调用程序指令时会发生什么的更多细节。