qidao123.com技术社区-IT企服评测·应用市场

 找回密码
 立即注册

区块链日记7 - Solana入门 - PDA增编削查数据2

[复制链接]
发表于 2025-6-21 11:28:16 | 显示全部楼层 |阅读模式
在本节中,您将学习怎样构建基本的 Create, Read, Update, Delete (CRUD) 程序。
书接上文,区块链日记6 - Solana入门 - PDA增编削查数据1-CSDN博客 ,这节我们来操作部署、调用、测试。
目次
6.部署程序
7.设置测试文件
8.调用 Create 指令
9.调用 Update 指令
10.调用 Delete 指令
11.运行测试
完整代码


6.部署程序

您现在已经完成了基本的 CRUD 计划。通过运行 deploy 在 Playground 终端中。
确保您的 Playground 钱包具有 devnet SOL。可以从 水龙头 获取。
  1. deploy
复制代码

7.设置测试文件

起始代码还包括一个 anchor.test.ts 格式的测试文件。
  1. import { PublicKey } from "@solana/web3.js";
  2. describe("pda", () => {
  3.   it("Create Message Account", async () => {});
  4.   it("Update Message Account", async () => {});
  5.   it("Delete Message Account", async () => {});
  6. });
复制代码
在 describe() 中,但在 it() 部分之前添加以下代码。
  1. const program = pg.program;
  2. const wallet = pg.wallet;
  3. const [messagePda, messageBump] = PublicKey.findProgramAddressSync(
  4.   [Buffer.from("message"), wallet.publicKey.toBuffer()],
  5.   program.programId,
  6. );
复制代码
 汇总后为:
  1. import { PublicKey } from "@solana/web3.js";
  2. describe("pda", () => {
  3.   const program = pg.program;
  4.   const wallet = pg.wallet;
  5.   const [messagePda, messageBump] = PublicKey.findProgramAddressSync(
  6.     [Buffer.from("message"), wallet.publicKey.toBuffer()],
  7.     program.programId
  8.   );
  9.   it("Create Message Account", async () => {});
  10.   it("Update Message Account", async () => {});
  11.   it("Delete Message Account", async () => {});
  12. });
复制代码
  解释:
  

  • PublicKey.findProgramAddressSync:这是一个同步方法,用于生成 PDA 和对应的 bump 种子。

    • 输入参数

      • 第一个参数是一个种子数组,用于生成 PDA。种子可以是恣意的字节序列,通常包括一些标识符和用户的公钥。

        • Buffer.from("message"):一个固定的种子,用于标识 PDA 的用途(例如,用于存储消息)。
        • wallet.publicKey.toBuffer():用户钱包的公钥,用于将 PDA 与特定用户关联。

      • 第二个参数是程序的 ID(program.programId),这是当前智能合约的唯一标识。

    • 返回值

      • messagePda:生成的 PDA 地点。
      • messageBump:生成 PDA 时利用的 bump 种子。bump 种子是一个小的整数,用于确保 PDA 地点的唯一性。


  通过在 Playground 终端中运行 test 来运行测试文件,以检查它是否按预期运行。后续步调将添加实际测试。
  1. test
复制代码
 

8.调用 Create 指令

利用以下内容更新第一个测试:
  1. it("Create Message Account", async () => {
  2.   const message = "Hello, World!";
  3.   const transactionSignature = await program.methods
  4.     .create(message)
  5.     .accounts({
  6.       messageAccount: messagePda,
  7.     })
  8.     .rpc({ commitment: "confirmed" });
  9.   const messageAccount = await program.account.messageAccount.fetch(
  10.     messagePda,
  11.     "confirmed",
  12.   );
  13.   console.log(JSON.stringify(messageAccount, null, 2));
  14.   console.log(
  15.     "Transaction Signature:",
  16.     `https://solana.fm/tx/${transactionSignature}?cluster=devnet-solana`,
  17.   );
  18. });
复制代码
首先,测试文件发送一个调用 create 指令的事件,并将 “Hello, World!” 作为消息传递。
发送交易并创建账户后,测试文件利用其地点 (messagePda) 获取账户。
末了,测试文件会记录账户数据和交易详细信息的链接。


剩下的几个和Create类似。
9.调用 Update 指令

  1. it("Update Message Account", async () => {
  2.   const message = "Hello, Solana!";
  3.   const transactionSignature = await program.methods
  4.     .update(message)
  5.     .accounts({
  6.       messageAccount: messagePda,
  7.     })
  8.     .rpc({ commitment: "confirmed" });
  9.   const messageAccount = await program.account.messageAccount.fetch(
  10.     messagePda,
  11.     "confirmed",
  12.   );
  13.   console.log(JSON.stringify(messageAccount, null, 2));
  14.   console.log(
  15.     "Transaction Signature:",
  16.     `https://solana.fm/tx/${transactionSignature}?cluster=devnet-solana`,
  17.   );
  18. });
复制代码
10.调用 Delete 指令

  1. it("Delete Message Account", async () => {
  2.   const transactionSignature = await program.methods
  3.     .delete()
  4.     .accounts({
  5.       messageAccount: messagePda,
  6.     })
  7.     .rpc({ commitment: "confirmed" });
  8.   const messageAccount = await program.account.messageAccount.fetchNullable(
  9.     messagePda,
  10.     "confirmed",
  11.   );
  12.   console.log("Expect Null:", JSON.stringify(messageAccount, null, 2));
  13.   console.log(
  14.     "Transaction Signature:",
  15.     `https://solana.fm/tx/${transactionSignature}?cluster=devnet-solana`,
  16.   );
  17. });
复制代码
11.运行测试

  1. test
复制代码
检查 SolanaFM 链接以查看交易详细信息。

(可以发现和预期一致!)
完整代码

  1. import { PublicKey } from "@solana/web3.js";
  2. describe("pda", () => {
  3.   const program = pg.program;
  4.   const wallet = pg.wallet;
  5.   const [messagePda, messageBump] = PublicKey.findProgramAddressSync(
  6.     [Buffer.from("message"), wallet.publicKey.toBuffer()],
  7.     program.programId
  8.   );
  9.   it("Create Message Account", async () => {
  10.     const message = "Hello, World!";
  11.     const transactionSignature = await program.methods
  12.       .create(message)
  13.       .accounts({
  14.         messageAccount: messagePda,
  15.       })
  16.       .rpc({
  17.         commitment: "confirmed",
  18.       });
  19.     const messageAccount = await program.account.messageAccount.fetch(
  20.       messagePda,
  21.       "confirmed"
  22.     );
  23.     console.log(JSON.stringify(messageAccount, null, 2));
  24.     console.log(
  25.       "Transaction Signature:",
  26.       `http://solana.fm/tx/${transactionSignature}?cluster=devnet-solana`
  27.     );
  28.   });
  29.   it("Update Message Account", async () => {
  30.     const message = "Hello, Solana!";
  31.     const transactionSignature = await program.methods
  32.       .update(message)
  33.       .accounts({
  34.         messageAccount: messagePda,
  35.       })
  36.       .rpc({
  37.         commitment: "confirmed",
  38.       });
  39.     const messageAccount = await program.account.messageAccount.fetch(
  40.       messagePda,
  41.       "confirmed"
  42.     );
  43.     console.log(JSON.stringify(messageAccount, null, 2));
  44.     console.log(
  45.       "Transaction Signature:",
  46.       `https://solana.fm/tx/${transactionSignature}?cluster=devnet-solana`
  47.     );
  48.   });
  49.   it("Delete Message Account", async () => {
  50.     const transactionSignature = await program.methods
  51.       .delete()
  52.       .accounts({
  53.         messageAccount: messagePda,
  54.       })
  55.       .rpc({
  56.         commitment: "confirmed",
  57.       });
  58.     const messageAccount = await program.account.messageAccount.fetchNullable(
  59.       messagePda,
  60.       "confirmed"
  61.     );
  62.     console.log("Expect Null:", JSON.stringify(messageAccount, null, 2));
  63.     console.log(
  64.       "Transaction Signature:",
  65.       `https://solana.fm/tx/${transactionSignature}?cluster=devnet-solana`
  66.     );
  67.   });
  68. });
复制代码
参考:链接

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|qidao123.com技术社区-IT企服评测▪应用市场 ( 浙ICP备20004199|浙ICP备20004199号 )|网站地图

GMT+8, 2025-8-13 11:07 , Processed in 0.081561 second(s), 32 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表