我在运行时收到此错误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) 由于某种原因,我的摩卡测试无法找到我的 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) 我正在尝试从公钥获取帐户:
await program.account.myAccountType.fetch(somePubkey);
Run Code Online (Sandbox Code Playgroud)
但随后 Anchor 抛出一个错误:
Invalid account discriminator
Run Code Online (Sandbox Code Playgroud)
什么是账户鉴别器?
我在进行我认为简单的代币转移时遇到了问题。
首先是一些代码:
#[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) 如果一旦将 PDA 创建为关联代币地址,就无法将 SOL 从 PDA 转移到另一个帐户?
我想使用单个 PDA 帐户转移 SOL 和 SPL 令牌。
我尝试了solana_program::program::invoke_signed
和system_instruction::transfer
。try_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) 我想将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) 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)
有什么建议吗?
使用锚点
我使用 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) 我来自以太坊环境,Solana 概念有点令人困惑。我找到了各种指导代码步骤的教程,但并没有真正解释逻辑背后的概念。
据我了解,在 Solana 中,我们有程序,它们不包含数据,只是逻辑 - 网络中的可执行实体。然后我们有帐户,它实际上包含数据。
我已经阅读了 Solana 文档和程序库(例如Token Program),但我仍然有一些理解上的空白。
我必须建立一个自动化的 NFT 铸造管道,但我对代币、账户和关联账户的概念有点迷失。
现在,如果我按照令牌计划教程(上面链接)进行操作,它将引导我完成:
所以,我想知道
mintTo
函数,在上面来自 Solana 文档的链接教程中使用。这是将代币转移到另一个钱包的操作吗?该示例实际上将其转移(铸造)到关联帐户。这里的逻辑是什么?我正在创建一个 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)
提前致谢!