标签: anchor-solana

我无法使用锚点将程序部署到开发网络

我在运行时收到此错误anchor deploy

Deploying workspace: http://127.0.0.1:8899
Upgrade authority: /home/<user>/.config/solana/id.json
Deploying program "faucet"...
Program path: /home/<user>/Workspace/<project_path>/target/deploy/xxx.so...
Error: RPC request error: cluster version query failed: error sending request for url (http://127.0.0.1:8899/): error trying to connect: tcp connect error: Connection refused (os error 111)
There was a problem deploying: Output { status: ExitStatus(ExitStatus(256)), stdout: "", stderr: "" }.

Run Code Online (Sandbox Code Playgroud)

在部署之前,我已经运行以下命令来更改本地的集群配置:

Deploying workspace: http://127.0.0.1:8899
Upgrade authority: /home/<user>/.config/solana/id.json
Deploying program "faucet"...
Program path: /home/<user>/Workspace/<project_path>/target/deploy/xxx.so...
Error: RPC request error: cluster version query failed: error sending request …
Run Code Online (Sandbox Code Playgroud)

blockchain smartcontracts solana anchor-solana

10
推荐指数
2
解决办法
1万
查看次数

加载 Solana 锚点测试的工作区 IDL 时出错

由于某种原因,我的摩卡测试无法找到我的 IDL。我收到以下错误:

name@Mabels-MacBook-Pro solana-anchor-reactjs-payment % anchor test
BPF SDK: /Users/name/.local/share/solana/install/releases/1.9.2/solana-release/bin/sdk/bpf
cargo-build-bpf child: rustup toolchain list -v
cargo-build-bpf child: cargo +bpf build --target bpfel-unknown-unknown --release
    Finished release [optimized] target(s) in 0.84s
cargo-build-bpf child: /Users/name/.local/share/solana/install/releases/1.9.2/solana-release/bin/sdk/bpf/dependencies/bpf-tools/llvm/bin/llvm-readelf --dyn-symbols /Users/name/Solana/solana-anchor-reactjs-payment/target/deploy/solana_anchor_reactjs_payment.so

To deploy this program:
  $ solana program deploy /Users/name/Solana/solana-anchor-reactjs-payment/target/deploy/solana_anchor_reactjs_payment.so
The program address will default to this keypair (override with --program-id):
  /Users/name/Solana/solana-anchor-reactjs-payment/target/deploy/solana_anchor_reactjs_payment-keypair.json

Error: Error loading workspace IDL for solana_anchor_reactjs_payment
    at /Users/name/Solana/solana-anchor-reactjs-payment/node_modules/@project-serum/anchor/src/workspace.ts:101:13
    at Array.forEach (<anonymous>)
    at attachWorkspaceOverride (/Users/name/Solana/solana-anchor-reactjs-payment/node_modules/@project-serum/anchor/src/workspace.ts:90:31)
    at Object.get (/Users/name/Solana/solana-anchor-reactjs-payment/node_modules/@project-serum/anchor/src/workspace.ts:71:9)
    at Suite.<anonymous> (/Users/name/Solana/solana-anchor-reactjs-payment/tests/payment-test.ts:12:38)
    at Object.create (/Users/name/Solana/solana-anchor-reactjs-payment/node_modules/mocha/lib/interfaces/common.js:148:19) …
Run Code Online (Sandbox Code Playgroud)

typescript solana solana-web3js anchor-solana

10
推荐指数
1
解决办法
3837
查看次数

Anchor 中的“无效帐户鉴别符”是什么意思?

我正在尝试从公钥获取帐户:

await program.account.myAccountType.fetch(somePubkey);
Run Code Online (Sandbox Code Playgroud)

但随后 Anchor 抛出一个错误:

Invalid account discriminator
Run Code Online (Sandbox Code Playgroud)

什么是账户鉴别器?

solana anchor-solana

8
推荐指数
1
解决办法
3335
查看次数

使用 Anchor 进行 Solana 代币传输

我在进行我认为简单的代币转移时遇到了问题。

首先是一些代码:

#[derive(Accounts)]
#[instruction(amount: u64)]
pub struct TransferTokens<'info> {
    #[account(mut)]
    pub sender: Signer<'info>,
    #[account(mut)]
    pub sender_tokens: Account<'info, TokenAccount>,
    pub recipient_tokens: Account<'info, TokenAccount>,
    pub mint: Account<'info, Mint>,
    #[account(address = SYSTEM_PROGRAM_ID)]
    pub system_program: Program<'info, System>,
    #[account(address = TOKEN_PROGRAM_ID)]
    pub token_program: Program<'info, Token>,
}

pub fn transfer_tokens(ctx: Context<TransferTokens>, amount: u64) -> ProgramResult {
    let sender = &ctx.accounts.sender;
    let sender_tokens = &ctx.accounts.sender_tokens;
    let recipient_tokens = &ctx.accounts.recipient_tokens;
    let token_program = &ctx.accounts.token_program;

    transfer(
        CpiContext::new(
            token_program.to_account_info(),
            Transfer {
                from: sender_tokens.to_account_info(),
                to: recipient_tokens.to_account_info(),
                authority: sender.to_account_info(),
            },
        ),
        amount, …
Run Code Online (Sandbox Code Playgroud)

solana anchor-solana

6
推荐指数
1
解决办法
3025
查看次数

如何将 SOL 从创建令牌关联帐户的 PDA 转移到 Anchor 中的普通帐户?

如果一旦将 PDA 创建为关联代币地址,就无法将 SOL 从 PDA 转移到另一个帐户?

我想使用单个 PDA 帐户转移 SOL 和 SPL 令牌。

我尝试了solana_program::program::invoke_signedsystem_instruction::transfertry_borrow_mut_lamports()但是,它不起作用。

每当使用 system_program 进行传输时,我都是Transfer: must not carry data,另一种方式是instruction spent from the balance of an account it does not own

我缺少什么?

我可以得到一些建议吗?

谢谢。

Struct 中的关联令牌帐户

#[account(init, 
    seeds = [authority.to_account_info().key.as_ref()], 
    bump, 
    payer = authority, 
    token::mint = mint, 
    token::authority = authority)
]    
pub vault: Account<'info, TokenAccount>,
Run Code Online (Sandbox Code Playgroud)

创建另一个 PDA,用于从保管库帐户转移 spl 令牌时的权限

let (vault_authority, vault_authority_bump) = Pubkey::find_program_address(
    &[ctx.accounts.vault.to_account_info().key.as_ref()], ctx.program_id
); …
Run Code Online (Sandbox Code Playgroud)

rust solana anchor-solana

5
推荐指数
1
解决办法
2208
查看次数

将 Solana 空投到特定账户

我想将sol 空投到特定帐户中,以使我的智能合约触发锚定测试。每当我运行测试时,我都会遇到错误Error: Account BdFchxtKbEaWtsbuFX2nbKyZCjhz5LN8vyPukQzJQrME has insufficient funds for spend (1.30250136 SOL) + fee (0.000945 SOL) There was a problem deploying: Output { status: ExitStatus(ExitStatus(256)), stdout: "", stderr: "" }.

该错误是不言自明的,但如何将代币空投到该特定帐户,我可以运行solana airdrop 5,但随后它将其空投到另一个帐户 GgRbD2AdibdAtBrQMJJEooco9gKt48Sd98Gn7vZQ1nJK。

我什至尝试使用将代币从一个帐户转移到另一个帐户solana transfer BdFchxtKbEaWtsbuFX2nbKyZCjhz5LN8vyPukQzJQrME 5 --allow-unfunded-recipient,但交易只是挂起。

下面是我使用 Anchor 在 Rust 中编写的智能合约:

use anchor_lang::prelude::*;
use anchor_lang::solana_program::system_program;

declare_id!("BNDCEb5uXCuWDxJW9BGmbfvR1JBMAKckfhYrEKW2Bv1W");

#[program]
pub mod solana_twitter {
    use super::*;
    pub fn send_tweet(ctx: Context<SendTweet>, topic: String, content: String) -> ProgramResult {
        let tweet: &mut Account<Tweet> = &mut ctx.accounts.tweet; …
Run Code Online (Sandbox Code Playgroud)

rust blockchain solana solana-cli anchor-solana

4
推荐指数
1
解决办法
2829
查看次数

错误[E0412]:在此范围内找不到类型“ProgramResult”

use anchor_lang::prelude::*;

declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");

#[program]
pub mod myepicproject {
  use super::*;
  pub fn start_stuff_off(ctx: Context<StartStuffOff>) -> ProgramResult {
    Ok(())
  }
}

#[derive(Accounts)]
pub struct StartStuffOff {}
Run Code Online (Sandbox Code Playgroud)

我有上面的源 Rust 代码和下面的错误。

error[E0412]: cannot find type `ProgramResult` in this scope
 --> programs/myepicproject/src/lib.rs:8:58
  |
8 |   pub fn start_stuff_off(ctx: Context<StartStuffOff>) -> ProgramResult {
  |                                                          ^^^^^^^^^^^^^ not found in this scope

For more information about this error, try `rustc --explain E0412`.
error: could not compile `myepicproject` due to previous error
Run Code Online (Sandbox Code Playgroud)

有什么建议吗?

使用锚点

rust blockchain smartcontracts solana anchor-solana

4
推荐指数
2
解决办法
5448
查看次数

将 Solana PDA 相互连接

我使用 Solana PDA 构建类似哈希图的结构,使用用户的钱包地址作为种子之一。PDA 称为 MyNodes,包含一些特定于用户的数据,包括应计奖励。

现在我正在尝试建立一个推荐系统。我有一个用户的 MyNodes PDA,并且我想将另一个用户的 PDA 的地址存储在第一个 PDA 中。因此,一个用户的 PDA 将指向另一用户的 PDA,即其“推荐人”或“附属机构”。我需要这种联系,以便为推荐者和被推荐者正确处理联属奖励。

但是,当尝试使用锚点构建帐户结构时,我遇到了问题。

#[account]
pub struct MyNodes {
    xyz: u32,
    abc: u32,
    etc: u64,
    aff_account: Account<MyNodes>,
}
Run Code Online (Sandbox Code Playgroud)

但它给出了我的编译错误:

BPF SDK: /Users/bb/solana/bin/sdk/bpf
cargo-build-bpf child: rustup toolchain list -v
cargo-build-bpf child: cargo +bpf build --target bpfel-unknown-unknown --release
warning: profiles for the non root package will be ignored, specify profiles at the workspace root:
package:   /Users/bb/app/nodestore/programs/nodeshop/Cargo.toml
workspace: /Users/bb/app/nodestore/Cargo.toml
   Compiling nodeshop v0.1.0 (/Users/bb/app/nodestore/programs/nodeshop)
error[E0106]: missing lifetime specifier
   --> programs/nodeshop/src/lib.rs:129:26
    | …
Run Code Online (Sandbox Code Playgroud)

rust solana anchor-solana

4
推荐指数
1
解决办法
219
查看次数

Solana 中令牌、账户和关联账户之间的概念差异

我来自以太坊环境,Solana 概念有点令人困惑。我找到了各种指导代码步骤的教程,但并没有真正解释逻辑背后的概念。

据我了解,在 Solana 中,我们有程序,它们不包含数据,只是逻辑 - 网络中的可执行实体。然后我们有帐户,它实际上包含数据。

我已经阅读了 Solana 文档和程序库(例如Token Program),但我仍然有一些理解上的空白。

我必须建立一个自动化的 NFT 铸造管道,但我对代币、账户和关联账户的概念有点迷失。

现在,如果我按照令牌计划教程(上面链接)进行操作,它将引导我完成:

  1. 创造一个薄荷糖
  2. 创建(或获取)关联帐户
  3. 为该帐户铸造代币

所以,我想知道

  • 一旦我创建了铸币厂并在 Solscan 中搜索它,它就会打开一个帐户实体。那么,铸币其实并不是一种代币,而只是一个保存数据的账户?(例如这里)。另一方面,我实际上可以在 Solscan 中找到Token实体。有什么不同?
  • 这个令牌(或帐户)没有任何元数据......实际上什么都没有。它就像一个数据占位符。它是已经铸造的代币还是半成品的代币?如果是后者,那么我之后是否必须附加元数据?
  • 关联账户有什么用?
  • SPL 库有一个mintTo函数,在上面来自 Solana 文档的链接教程中使用。这是将代币转移到另一个钱包的操作吗?该示例实际上将其转移(铸造)到关联帐户。这里的逻辑是什么?
  • 如果我使用公共 Metaplex 程序来铸造代币,并且部署自己的锚程序 - 该程序是否用于将元数据添加到铸造的代币中?这是什么概念啊,没明白。
  • 当我准备好 NFT(铸造+元数据)并且想将其转移到其他人的钱包时,我是否真的必须为该钱包创建一个关联帐户,然后将代币转移到该帐户?基本概念是什么?

solana solana-program-library solana-web3js anchor-solana

4
推荐指数
1
解决办法
1122
查看次数

如何在锚定智能合约指令中传输SOL

我正在创建一个 dapp,多个用户可以将 SOL 存入一个活动帐户,并且根据谁赢得了活动,他们可以将 SOL 兑换回他们的钱包。

如何在锚定智能合约指令中将本机 SOL(不是任何其他 spl 代币)直接转移到事件账户的金库地址?

以下锚定指令会起作用吗?PROGRAM_ACCOUNT如果是的话,下面应该是什么?据推测,它应该是处理本机SOL的帐户,但我在文档中找不到它。

token::transfer(
    CpiContext::new(
        PROGRAM_ACCOUNT,
        anchor_spl::token::Transfer {
            from: source_user_info,
            to: destination_user_info,
            authority: source_user_info,
        },
    ),
    1,
)?; 
Run Code Online (Sandbox Code Playgroud)

提前致谢!

rust solana anchor-solana

3
推荐指数
2
解决办法
6021
查看次数