首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将NFT直接存入Solana上的PDA帐户?

如何将NFT直接存入Solana上的PDA帐户?
EN

Ethereum用户
提问于 2022-11-09 07:44:30
回答 1查看 128关注 0票数 2

我是一个Ethereum,最近开始了solana的开发,因为我以前的Eth概念,它有点混乱。我正在solana上开发一个NFT市场,它是一种P2E模型。在Ethereum,您的造币厂,nfts和批准智能合同,以便任何人都可以购买。由于Solana不使用代码存储数据,所以它将数据存储在帐户(如PDA )中。我希望能够在solana程序中拥有相同的功能,例如:所有者、铸币厂、PDA令牌,这样购买者就可以直接从市场上购买。因为PDA是特殊的帐户,程序可以为他们签名。

PS:我编写了代码,用于在同一事务中先创建nft,然后将nft传输到PDA,但它不起作用。它给出了这个错误:错误:发送事务失败:事务模拟失败:错误处理指令1:带有未经授权的签名者或可写帐户的跨程序调用。

如果我删除了传输的nft代码,那么造币可以正常工作。任何帮助都将不胜感激。

EN

回答 1

Ethereum用户

发布于 2022-12-02 12:53:07

好的,在研发的日子之后,给它我的时间和精力,我找到了解决这个问题的方法。这可以用锚为mint创建一个D1,您可以像这样在帐户验证结构中创建ata (顺便说一句,锚确实是救生器)

代码语言:javascript
复制
 #[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指令,

代码语言:javascript
复制
        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来说,你需要得到阿塔。这就是它看起来离链的样子,

代码语言:javascript
复制
        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
      );

唉,这就是我们把船上岸的方法。

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/139067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档