区块链日记5 - Solana入门 - 摆设第一个Solana步伐

打印 上一主题 下一主题

主题 1776|帖子 1776|积分 5328

在本节中,您将使用 Anchor 框架构建、摆设和测试一个简单的 Solana 步伐(智能合约)。一步一步跟着我来,将完成第一个步伐摆设到 Solana 区块链上。
目录
1.创建 Anchor 项目
2.构建和摆设步伐
3.测试步伐
4.关闭步伐


本节的目标是让您认识 Solana Playground。本指南介绍了步伐派生地址 (PDA) 和跨步伐调用 (CPI) 部分中的更详细示例。有关更多详细信息,请参阅 Solana 上的步伐页面。
1.创建 Anchor 项目

首先,在新的浏览器选项卡中打开 https://beta.solpg.io。
单击左侧面板上的 “Create a new project” 按钮。
输入项目名称,选择 Anchor 作为框架,然后单击 “Create” 按钮。

您将在 src/lib.rs 文件中看到一个使用步伐代码创建的新项目。
这个根本的 Solana 步伐会创建一个新帐户并在其中存储一个数字。该步伐包含一个指令 (initialize),该指令将 u64 数字作为输入,创建一个新帐户,并将该数字生存在该帐户的数据中。当您调用该指令时,它还会将一条消息记录到事件的步伐日志中。
(我把它的内容贴下来:)
  1. use anchor_lang::prelude::*;
  2. // This is your program's public key and it will update
  3. // automatically when you build the project.
  4. declare_id!("11111111111111111111111111111111");
  5. #[program]
  6. mod hello_anchor {
  7.     use super::*;
  8.     pub fn initialize(ctx: Context<Initialize>, data: u64) -> Result<()> {
  9.         ctx.accounts.new_account.data = data;
  10.         msg!("Changed data to: {}!", data); // Message will show up in the tx logs
  11.         Ok(())
  12.     }
  13. }
  14. #[derive(Accounts)]
  15. pub struct Initialize<'info> {
  16.     // We must specify the space in order to initialize an account.
  17.     // First 8 bytes are default account discriminator,
  18.     // next 8 bytes come from NewAccount.data being type u64.
  19.     // (u64 = 64 bits unsigned integer = 8 bytes)
  20.     #[account(init, payer = signer, space = 8 + 8)]
  21.     pub new_account: Account<'info, NewAccount>,
  22.     #[account(mut)]
  23.     pub signer: Signer<'info>,
  24.     pub system_program: Program<'info, System>,
  25. }
  26. #[account]
  27. pub struct NewAccount {
  28.     data: u64
  29. }
复制代码

 解释:
declare_id!macro 指定步伐的链上地址。Solana Playground 会在您下一步构建步伐时主动更新此地址。
  1. declare_id!("11111111111111111111111111111111");
复制代码
 
#[program] 属性对包含表示步伐指令的函数的模块举行注释。
  1. #[program]
  2. mod hello_anchor {
  3.     use super::*;
  4.     pub fn initialize(ctx: Context<Initialize>, data: u64) -> Result<()> {
  5.         ctx.accounts.new_account.data = data;
  6.         msg!("Changed data to: {}!", data); // Message will show up in the tx logs
  7.         Ok(())
  8.     }
  9. }
复制代码
在此示例中,initialize 指令接纳两个参数:
1.ctx: Context<Initialize> - 将此指令所需的帐户通报给函数,如 Initialize 结构中所指定。
2.data: u64 - 调用指令时必须提供的自定义参数。
函数体将 new_account 的 data 字段设置为提供的 data 参数,然后将消息打印到步伐日志中。

  1. #[derive(Accounts)]
  2. pub struct Initialize<'info> {
  3.     #[account(init, payer = signer, space = 8 + 8)]
  4.     pub new_account: Account<'info, NewAccount>,
  5.     #[account(mut)]
  6.     pub signer: Signer<'info>,
  7.     pub system_program: Program<'info, System>,
  8. }
复制代码
该 #[derive(Accounts)] 属性定义了一个结构体,该结构体指定特定指令所需的账户,其中每个字段代表一个单独的账户。
Anchor通过字段范例(比方Signer<'info>)和束缚(比方#[account(mut)])主动处置惩罚与帐户验证相干的常见安全检查。
(简单来说,就是有个结构体,能创建账户,并且里面能校验)

#[account] 属性定义了一个结构体,该结构体表示此步伐创建和拥有的账户的数据范例。
 
  1. #[account]
  2. pub struct NewAccount {
  3.   data: u64
  4. }
复制代码
2.构建和摆设步伐

要构建步伐,只需在终端中运行 build 即可。

(构建成功)
Solana Playground 更新了 declare_id 年的地址 !().此地址代表您的步伐的链上地址(步伐 ID)。
(如图所示!)

 构建步伐后,在终端中运行 deploy,将步伐摆设到网络(默认为 devnet)。步伐摆设需要将 SOL 分配给存储步伐的链上账户。

(进度条在动!)

(摆设完成,会弹出一个链接,点开后看到摆设详情)
在摆设之前,请确保您有足够的 SOL。您可以通过在 Playground 终端中运行 solana airdrop 5 或使用 空投。
您还可以使用左侧面板上的 Build (构建 ) 和 Deploy (摆设) 按钮。

3.测试步伐

起始代码包括一个位于 tests/anchor.test.ts 中的测试文件。此文件演示如何从客户端调用步伐上的 initialize 指令。

 (我把它贴下来:)
  1. // No imports needed: web3, anchor, pg and more are globally available
  2. describe("Test", () => {
  3.   it("initialize", async () => {
  4.     // Generate keypair for the new account
  5.     const newAccountKp = new web3.Keypair();
  6.     // Send transaction
  7.     const data = new BN(42);
  8.     const txHash = await pg.program.methods
  9.       .initialize(data)
  10.       .accounts({
  11.         newAccount: newAccountKp.publicKey,
  12.         signer: pg.wallet.publicKey,
  13.         systemProgram: web3.SystemProgram.programId,
  14.       })
  15.       .signers([newAccountKp])
  16.       .rpc();
  17.     console.log(`Use 'solana confirm -v ${txHash}' to see the logs`);
  18.     // Confirm transaction
  19.     await pg.connection.confirmTransaction(txHash);
  20.     // Fetch the created account
  21.     const newAccount = await pg.program.account.newAccount.fetch(
  22.       newAccountKp.publicKey
  23.     );
  24.     console.log("On-chain data is:", newAccount.data.toString());
  25.     // Check whether the data on-chain is equal to local 'data'
  26.     assert(data.eq(newAccount.data));
  27.   });
  28. });
复制代码
摆设步伐后,要运行测试文件,请在终端中运行 test。
(结果如下:)

查找确认测试成功通过的输出。
还可以使用 Test (测试 ) 左侧面板上的按钮。

 然后,您可以通过运行 solana confirm -v 来查看生意业务日志 命令并从测试输出中指定生意业务哈希(署名):
  1. solana confirm -v [TxHash]
复制代码

您还可以查看生意业务详情 SolanaFM 或 Solana Explorer 通过搜索生意业务署名(哈希)举行搜索。
请记住在用于匹配 Solana Playground 的 Explorer 上更新集群(网络)连接。Solana Playground 默认使用 devnet 集群。
4.关闭步伐

末了,关闭步伐可以完全恢复分配给链上步伐的 SOL。
您可以通过运行以下命令并指定在 declare_id 中找到的步伐地址来关闭步伐 !():
  1. solana program close [ProgramID]
复制代码

(余额已经恢复!)
 
Congratulations!
恭喜你!刚刚使用 Anchor 框架构建并摆设了您的第一个 Solana 步伐。 

参考:链接

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

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

饭宝

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表