我是一个Ethereum,最近开始了solana的开发,因为我以前的Eth概念,它有点混乱。我正在solana上开发一个NFT市场,它是一种P2E模型。在Ethereum,您的造币厂,nfts和批准智能合同,以便任何人都可以购买。由于Solana不使用代码存储数据,所以它将数据存储在帐户(如PDA )中。我希望能够在solana程序中拥有相同的功能,例如:所有者、铸币厂、PDA令牌,这样购买者就可以直接从市场上购买。因为PDA是特殊的帐户,程序可以为他们签名。
PS:我编写了代码,用于在同一事务中先创建nft,然后将nft传输到PDA,但它不起作用。它给出了这个错误:错误:发送事务失败:事务模拟失败:错误处理指令1:带有未经授权的签名者或可写帐户的跨程序调用。
如果我删除了传输的nft代码,那么造币可以正常工作。任何帮助都将不胜感激。
发布于 2022-12-02 12:53:07
好的,在研发的日子之后,给它我的时间和精力,我找到了解决这个问题的方法。这可以用锚为mint创建一个D1,您可以像这样在帐户验证结构中创建ata (顺便说一句,锚确实是救生器)
#[account(mut)]
mint_authority: Signer<'info>,
#[account(
init,
payer = mint_authority,
mint::decimals = 0,
mint::authority = mint_authority,
mint::freeze_authority = mint_authority,
)]
pub mint: Account<'info, Mint>,
#[account(
init,
payer = mint_authority,
space = 400,
seeds = [b"nftDetails".as_ref(),
mint.key().as_ref()],
bump
)]
nft_details: Account<'info, NftDetails>,
#[account(
init,
payer = mint_authority, // minter, the one who is minting
associated_token::mint = mint, // mint of the token
associated_token::authority = nft_details //authority that should be a PDA account
)]
token_account: Account<'info, TokenAccount>,这样从mint_to调用spl_token_program指令,
token::mint_to(
CpiContext::new(
ctx.accounts.token_program.to_account_info(),
MintTo{
mint:ctx.accounts.mint.to_account_info(),
to: ctx.accounts.token_account.to_account_info(),
authority: ctx.accounts.mint_authority.to_account_info(),
},
),
1
)?;上面的代码是onchain代码,当我们从客户端传递帐户时,您将需要使用种子和凸起找到权限PDA帐户(在本例中是nft_details)。对于token_account来说,你需要得到阿塔。这就是它看起来离链的样子,
const [nftDetails, nftDetailsBump] = await
anchor.web3.PublicKey.findProgramAddress(
[Buffer.from(`nftDetails`), mintKey.publicKey.toBuffer()],
new anchor.web3.PublicKey(program.programId
));
const nftTokenAccount = await getAssociatedTokenAddress(
mintKey.publicKey,
nftDetails,
true
);唉,这就是我们把船上岸的方法。
https://ethereum.stackexchange.com/questions/139067
复制相似问题