Skip to content

Commit

Permalink
update Anchor 合约框架实现 - hello, World 🌍 With PDA
Browse files Browse the repository at this point in the history
  • Loading branch information
DaviRain-Su committed Aug 16, 2023
1 parent 6a30a00 commit c87e33a
Show file tree
Hide file tree
Showing 2 changed files with 140 additions and 23 deletions.
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
---
sidebar_position: 9
sidebar_label: Anchor 合约框架实现 - hello, World
sidebar_label: Anchor 合约框架实现 - hello, World 🌍 With PDA
sidebar_class_name: green
---

# Anchor 合约框架实现 - hello, World
# Anchor 合约框架实现 - hello, World 🌍 With PDA

让我们通过构建和部署 `Hello World!` 程序来进行练习。

Expand Down Expand Up @@ -37,25 +37,141 @@ anchor init hello_world

#### 2. 编写你的程序

接下来,使用下面的`Hello World!`程序更新`hello_world/program/src/lib.rs`。当程序被调用时,该程序会简单地将`Hello, world!`打印到程序日志中
接下来,使用下面的`Hello World!`程序更新`hello_world/program/src/lib.rs`。当程序被调用时,该程序会将传入的数据保存到数据存储账户中去也就是下面的`HelloWorld`账户

```rust
use anchor_lang::prelude::*;

declare_id!("Eo7uunKkgdRe8JtgmDimLkUEuT1oYbua4zWRCysWpv45");
declare_id!("22sSSi7GtQgwXFcjJmGNNKSCLEsiJxyYLFfP3CMWeMLj");

#[program]
pub mod hello_world {
use super::*;

pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
msg!("Hello,World!");
pub fn initialize(ctx: Context<Initialize>, data: String) -> Result<()> {

msg!("{}", data);

*ctx.accounts.hello_world = HelloWorld {
authority: *ctx.accounts.authority.key,
data,
};

Ok(())
}

pub fn update(ctx: Context<UpdateHelloWorld>, data: String) -> Result<()> {
ctx.accounts.hello_world.data = data;
msg!("{}", ctx.accounts.hello_world.data);
Ok(())
}
}

#[derive(Accounts)]
pub struct Initialize<'info> {
#[account(
init,
payer = authority,
space = 8 + HelloWorld::INIT_SPACE,
seeds = [b"hello-world"],
bump
)]
pub hello_world: Account<'info, HelloWorld>,
#[account(mut)]
pub authority: Signer<'info>,
pub system_program: Program<'info, System>,
}

#[derive(Accounts)]
pub struct Initialize {}
pub struct UpdateHelloWorld<'info> {
#[account(
mut,
seeds = [b"hello-world"],
bump
)]
pub hello_world: Account<'info, HelloWorld>,
#[account(mut)]
pub authority: Signer<'info>,
}

#[account]
#[derive(InitSpace)]
pub struct HelloWorld {
pub authority: Pubkey,
#[max_len(100)]
pub data: String,
}

#[error_code]
pub enum ErrorCode {
#[msg("You are not authorized to perform this action.")]
Unauthorized,
#[msg("Cannot get the bump.")]
CannotGetBump,
}
```

下面这是一个本地的测试脚本文件,用来调用上面的合约程序。


```ts
import * as anchor from "@coral-xyz/anchor";
import { Program } from "@coral-xyz/anchor";
import { HelloWorld } from "../target/types/hello_world";

describe("hello-world", () => {
let provider = anchor.AnchorProvider.env();
// Configure the client to use the local cluster.
anchor.setProvider(provider);

const program = anchor.workspace.HelloWorld as Program<HelloWorld>;

const authority = provider.wallet.publicKey;

let [helloWorld] = anchor.web3.PublicKey.findProgramAddressSync(
[Buffer.from("hello-world")],
program.programId
);

it("Is initialized!", async () => {
// Add your test here.
const tx = await program.methods.initialize("Hello World!").accounts({
helloWorld,
authority,
systemProgram: anchor.web3.SystemProgram.programId,
}).rpc();

console.log("tx signature: ", tx);

// Fetch the state struct from the network.
const accountState = await program.account.helloWorld.fetch(helloWorld);
console.log("account state: ", accountState);

});

it("get hello world!", async () => {

// Add your test here.
const tx = await program.methods.update("Davirain").accounts({
helloWorld,
}).rpc();

console.log("tx signature: ", tx);


// Fetch the state struct from the network.
const accountState = await program.account.helloWorld.fetch(helloWorld);
console.log("account state: ", accountState);
});


it("read account name", async () => {

// Fetch the state struct from the network.
const accountState = await program.account.helloWorld.fetch(helloWorld);
console.log("account state: ", accountState);
});
});
```

#### 3. 运行本地测试验证器
Expand Down Expand Up @@ -105,7 +221,7 @@ solana logs <PROGRAM_ID>

或者也可以通过[Solana Exporer](https://explorer.solana.com/?cluster=custom),查看产生的日志📔。

在测试验证器仍在运行时,尝试使用[此处](https://github.com/DaviRain-Su/all-in-one-solana/tree/main/code/contract/hello_world/app/hello-frontend)的客户端脚本调用您的程序。
在测试验证器仍在运行时,尝试使用[此处](https://github.com/CreatorsDAO/hello-world-with-pda/tree/main/app)的客户端脚本调用您的程序。

这将返回一个[Solana Explorer](https://explorer.solana.com)的URL(`Transaction https://explorer.solana.com/tx/${transactionSignature}?cluster=custom`)。将URL复制到浏览器中,在Solana Explorer上查找该交易,并检查程序日志中是否打印了`Hello, world!`。或者,您可以在运行`solana logs`命令的终端中查看程序日志。

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,19 @@ sidebar_label: 🎨 创建奖励代币
sidebar_class_name: green
---

以下是您提供的文本的润色版本,以使中文读起来更流畅:

# 🎨 创建奖励代币

现在我们已经铸造了一个NFT,我们将学习如何铸造一系列的NFT。我们将使用Candy Machine来完成这个任务——这是一个Solana程序,允许创作者将他们的资产上链。这不是创建系列的唯一方式,但在Solana上它是标准的,因为它具有一些有用的功能,如机器人保护和安全随机化。是时候回到我们的自定义NFT质押应用了。我们将利用我们在代币程序和糖果机上的经验来构建我们的应用
现在我们已经铸造了一个NFT,接下来我们要学习如何铸造一系列的NFT。为了完成这个任务,我们将使用Candy Machine——一个Solana程序,它允许创作者将他们的资产上链。虽然这不是创建系列的唯一方式,但在Solana上它被广泛采用,因为它具备诸如机器人防护和安全随机化等有用功能。是时候回到我们的自定义NFT质押应用了。我们将借助我们在代币程序和糖果机上的经验来构建我们的应用

请继续,在您的根目录中创建一个名为 `tokens` 的新文件夹。在该文件夹内,我们需要创建2个名为 `bld``candy-machine` 的子文件夹。它应该看起来像这样
请继续操作,在您的根目录中创建一个名为 `tokens` 的新文件夹。在该文件夹内,我们需要创建2个名为 `bld``candy-machine` 的子文件夹。它们的结构应该如下所示

![](./img/tokens.png)

我们创建这个的原因是为了我们堆叠 Builder 时的奖励代币,以及与我们的 NFT 相关的东西
我们之所以这样做,是为了在建立 Builder 时的奖励代币,以及与我们的 NFT 相关的内容

现在让我们开始创建我们的资源文件夹。这将用于我们代币的图像。进入您的 `bld` 文件夹,并创建一个名为 `assets` 的新文件夹,并在您的 `bld` 文件夹内创建一个名为 `index.ts` 的新文件。它应该看起来像这样。
现在,让我们开始创建资源文件夹。这将用于存放代币的图像。请进入您的 `bld` 文件夹,并创建一个名为 `assets` 的新文件夹,并在您的 `bld` 文件夹内创建一个名为 `index.ts` 的新文件。目录结构应该如下所示:

```bash
├── styles
Expand All @@ -24,9 +26,9 @@ sidebar_class_name: green
| ├── index.ts
```

注意:确保你的`index.ts`文件在bld文件夹中,而不是在`assets`文件夹中。
注意:确保您的 `index.ts` 文件位于 `bld` 文件夹中,而不是在 `assets` 文件夹中。

你会注意到你的 `index.ts` 文件被标记为红色。这是因为我们目前还没有任何代码。让我们通过向你的 `index.ts` 中添加一些代码来解决这个问题。我们还需要将 `initializeKeypair` 文件移动到 `bld` 文件夹中。你还需要向 `bld/assets` 文件夹中添加一张图片,这将是你的令牌图片
您可能会注意到 `index.ts` 文件被标记为红色。这是因为我们目前还没有任何代码。让我们通过向您的 `index.ts` 文件中添加以下代码来解决这个问题。我们还需要将 `initializeKeypair` 文件移动到 `bld` 文件夹中,并向 `bld/assets` 文件夹中添加一张图片,作为您的代币图片

```ts
import * as web3 from "@solana/web3.js";
Expand All @@ -49,7 +51,7 @@ main()
});
```

太棒了!现在我们有了开始的代码,让我们把下一段代码粘贴到你的 `index.ts` 文件中。你可以把它放在你的 `main` 函数上方
太棒了!现在我们已经有了启动代码,可以继续将下一段代码粘贴到您的 `index.ts` 文件中。您可以将其放在 `main` 函数的上方

```ts
import * as fs from "fs";
Expand Down Expand Up @@ -137,17 +139,16 @@ async function createBldToken(

const transaction = new web3.Transaction()
transaction.add(instruction)

const transactionSignature = await web3.sendAndConfirmTransaction(
connection,
transaction,
[payer]
)
}

// The rest of your main function
connection,
transaction,
[payer])
```
这部分代码将创建一个代币,并将其所需的所有输入与其关联。它还读取图像文件,将文件上传,并完成其他必要的操作,为您的代币创建完整的元数据。
通过这样的操作,您将能够在 Solana 上成功创建并管理您的代币。
## 🥳 代码解析
好的,让我们把这一切都分解开来,就像制作柠檬水一样简单。
Expand Down

0 comments on commit c87e33a

Please sign in to comment.