您当前的位置:首页 > 互联网百科 > 区块链

Solana区块链NFT开发教程

时间:2022-08-03 13:55:56  来源:  作者:新缸中之脑

在这个教程中,我们将学习如何编写 Rust 智能合约并使用 Metaplex 在 Solana 上铸造 NFT

 

用熟悉的语言学习 Web3.0 开发 : JAVA | php | Python/ target=_blank class=infotextkey>Python | .NET / C# | Golang | Node.JS | Flutter / Dart

在 Solana 开发中,我们回面临许多奇怪的自定义错误和错误,并且由于 Solana 开发生态系统没有 Eth 开发生态系统那么大,因此修复它们 可能非常困难和令人沮丧。但不用担心。当遇到困难时,只需在正确的地方寻找解决方案。

在我的开发过程中,我不断地在Anchor discord 服务器、Metaplex和Superteam服务器上提出疑问,并查看 Github 上的其他代码仓库和 Metaplex 程序库本身。

1、项目概况

在这个教程中,我们将使用的工具包括:

  • Solana CLI 工具— 官方 Solana CLI 工具集
  • Anchor Framework — 用于开发 Solana 程序的高级框架。这是必须的,除非你是大神级开发人员,不过在这种情况下你应该不会阅读此博客。哈哈。
  • Solana/web3.js — web3.js的 Solana 版本
  • Solana/spl-token — 使用 spl 通证的包
  • Mocha — 一个 JS 测试工具

2、准备工作

在命令行使用以下命令将你的网络设置为 devnet:

1
solana config set --url devnet

要确认它是否有效,请在执行上述命令后检查输出:

1
2
3
4
5
Config File: /Users/anoushkkharangate/.config/solana/cli/config.yml
RPC URL: https://api.devnet.solana.com
WebSocket URL: wss://api.devnet.solana.com/ (computed)
KeypAIr Path: /Users/anoushkkharangate/.config/solana/id.json
Commitment: confirmed

接下来,请参考Solana wallet docs设置 文件系统钱包,并使用命令solana airdrop 1添加一些devnet的 sol通证。

最后,使用另一个anchor CLI终端 通过以下命令创建一个anchor项目:

1
anchor init <name-of-your-project>

确保Anchor.toml也设置为 devnet。

1
2
3
4
5
6
7
8
9
10
11
[features]
seeds = false
[programs.devnet]
metaplex_anchor_nft = "Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS"
[registry]
url = "https://anchor.projectserum.com"
[provider]
cluster = "devnet"
wallet = "/Users/<user-name>/.config/solana/id.json"
[scripts]
test = "yarn run ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts"

3、导入依赖项

在项目中,必须有一个名为程序的文件夹。转到programs/<your-project-name>/Cargo.toml并添加这些依赖项。确保使用版本0.24.2, 可以使用avm来更改它:

1
2
3
4
[dependencies]
anchor-lang = "0.24.2"
anchor-spl = "0.24.2"
mpl-token-metadata = {version = "1.2.7", features = ["no-entrypoint"]}

由于安全漏洞,Anchor 已删除 0.24.2 之前的所有版本,因此请确保使用该版本

然后转到src 中的lib.rs文件并导入这些:

1
2
3
4
5
use anchor_lang::prelude::*;
use anchor_lang::solana_program::program::invoke;
use anchor_spl::token;
use anchor_spl::token::{MintTo, Token};
use mpl_token_metadata::instruction::{create_master_edition_v3, create_metadata_accounts_v2};

现在我们可以编写 mint 函数了!

4、NFT账户结构实现

首先,让我们mint为函数创建账户结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#[derive(Accounts)]
pub struct MintNFT<'info> {
    #[account(mut)]
    pub mint_authority: Signer<'info>,
/// CHECK: This is not dangerous because we don't read or write from this account
    #[account(mut)]
    pub mint: UncheckedAccount<'info>,
    // #[account(mut)]
    pub token_program: Program<'info, Token>,
    /// CHECK: This is not dangerous because we don't read or write from this account
    #[account(mut)]
    pub metadata: UncheckedAccount<'info>,
    /// CHECK: This is not dangerous because we don't read or write from this account
    #[account(mut)]
    pub token_account: UncheckedAccount<'info>,
    /// CHECK: This is not dangerous because we don't read or write from this account
    pub token_metadata_program: UncheckedAccount<'info>,
    /// CHECK: This is not dangerous because we don't read or write from this account
    #[account(mut)]
    pub payer: AccountInfo<'info>,
    pub system_program: Program<'info, System>,
    /// CHECK: This is not dangerous because we don't read or write from this account
    pub rent: AccountInfo<'info>,
    /// CHECK: This is not dangerous because we don't read or write from this account
    #[account(mut)]
    pub master_edition: UncheckedAccount<'info>,
}

不要担心未检查的帐户,因为我们会将其传递给 Metaplex 程序,它会为我们检查。

为了在 Anchor 中使用 Unchecked 帐户,我们需要在每个帐户上方添加此注释:

1
/// CHECK: This is not dangerous because we don't read or write from this account

5、NFT合约Mint函数实现

让我们创建一个函数,使用刚刚创建的结构来铸造通证:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
pub fn mint_nft(
        ctx: Context<MintNFT>,
        creator_key: Pubkey,
        uri: String,
        title: String,
    ) -> Result<()> {
        msg!("Initializing Mint NFT");
        let cpi_accounts = MintTo {
            mint: ctx.accounts.mint.to_account_info(),
            to: ctx.accounts.token_account.to_account_info(),
            authority: ctx.accounts.payer.to_account_info(),
        };
 msg!("CPI Accounts Assigned");
        let cpi_program = ctx.accounts.token_program.to_account_info();
        msg!("CPI Program Assigned");
        let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts);
        msg!("CPI Context Assigned");
        token::mint_to(cpi_ctx, 1)?;
        msg!("Token Minted !!!");
        let account_info = vec![Solana NFT
            ctx.accounts.metadata.to_account_info(),
            ctx.accounts.mint.to_account_info(),
            ctx.accounts.mint_authority.to_account_info(),
            ctx.accounts.payer.to_account_info(),
            ctx.accounts.token_metadata_program.to_account_info(),
            ctx.accounts.token_program.to_account_info(),
            ctx.accounts.system_program.to_account_info(),
            ctx.accounts.rent.to_account_info(),
        ];
        msg!("Account Info Assigned");
        let creator = vec![Solana NFT
            mpl_token_metadata::state::Creator {
                address: creator_key,
                verified: false,
                share: 100,
            },
            mpl_token_metadata::state::Creator {
                address: ctx.accounts.mint_authority.key(),
                verified: false,
                share: 0,
            },
        ];
        msg!("Creator Assigned");
        let symbol = std::string::ToString::to_string("symb");
        invoke(
            &create_metadata_accounts_v2(
                ctx.accounts.token_metadata_program.key(),
                ctx.accounts.metadata.key(),
                ctx.accounts.mint.key(),
                ctx.accounts.mint_authority.key(),
                ctx.accounts.payer.key(),
                ctx.accounts.payer.key(),
                title,
                symbol,
                uri,
                Some(creator),
                1,
                true,
                false,
                None,
                None,
            ),
            account_info.as_slice(),
        )?;
        msg!("Metadata Account Created !!!");
        let master_edition_infos = vec![Solana NFT
            ctx.accounts.master_edition.to_account_info(),
            ctx.accounts.mint.to_account_info(),
            ctx.accounts.mint_authority.to_account_info(),
            ctx.accounts.payer.to_account_info(),
            ctx.accounts.metadata.to_account_info(),
            ctx.accounts.token_metadata_program.to_account_info(),
            ctx.accounts.token_program.to_account_info(),
            ctx.accounts.system_program.to_account_info(),
            ctx.accounts.rent.to_account_info(),
        ];
        msg!("Master Edition Account Infos Assigned");
        invoke(
            &create_master_edition_v3(
                ctx.accounts.token_metadata_program.key(),
                ctx.accounts.master_edition.key(),
                ctx.accounts.mint.key(),
                ctx.accounts.payer.key(),
                ctx.accounts.mint_authority.key(),
                ctx.accounts.metadata.key(),
                ctx.accounts.payer.key(),
                Some(0),
            ),
            master_edition_infos.as_slice(),
        )?;
        msg!("Master Edition Nft Minted !!!");
        Ok(())
    }

如果想调试你的程序,最好使用msg!()记录想要检查的任何值。它接受字符串,因此必须使用std::string::ToString来转换。 你的日志将出现在终端或.anchor/program-logs/<program-id>

 

有几点需要说明一下。

creator数组需要包含铸造 NFT 的人,但你可以将份额设置为 0,所以这并不重要。这是代码:

1
2
3
4
5
6
7
8
9
10
11
12
let creator = vec![Solana NFT
            mpl_token_metadata::state::Creator {
                address: creator_key,
                verified: false,
                share: 100,
            },
            mpl_token_metadata::state::Creator {
                address: ctx.accounts.mint_authority.key(),
                verified: false,
                share: 0,
            },
        ];

我还没有实现集合,因为它不在本指南的范围内,但你可以使用以下方法来实现:

1
mpl_token_metadata::instruction::set_and_verify_collection

为什么我在这里将 Max supply 设置为 0?在 Metaplex 中,如果是一种通证,那么你必须将其最大供应量设置为零,因为总供应量 - 声称的供应量 (1-1) 等于 0。

1
2
3
4
5
6
7
8
9
10
&create_master_edition_v3(
                ctx.accounts.token_metadata_program.key(),
                ctx.accounts.master_edition.key(),
                ctx.accounts.mint.key(),
                ctx.accounts.payer.key(),
                ctx.accounts.mint_authority.key(),
                ctx.accounts.metadata.key(),
                ctx.accounts.payer.key(),
                Some(0), // max supply 0
            ),

编写函数后,运行anchor build && anchor deploy,应该会看到已部署的程序 ID

 

将此程序 ID 粘贴到Anchor.toml和lib.rs文件中,替换全部的默认ID即
Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS。

6、调用 Mint 函数

在做任何事情之前,请确保已导入@solana/web3.js和@solana/spl-token。 在tests/<test-file>.ts里面添加这些导入和常量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import {
  TOKEN_PROGRAM_ID,
  createAssociatedTokenAccountInstruction,
  getAssociatedTokenAddress,
  createInitializeMintInstruction,
  MINT_SIZE,
} from "@solana/spl-token";
import { LAMPORTS_PER_SOL } from "@solana/web3.js";
const { PublicKey, SystemProgram } = anchor.web3; q
const TOKEN_METADATA_PROGRAM_ID = new anchor.web3.PublicKey(
      "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"
    );
    const lamports: number =
      await program.provider.connection.getMinimumBalanceForRentExemption(
        MINT_SIZE
      );
    const getMetadata = async (
      mint: anchor.web3.PublicKey
    ): Promise<anchor.web3.PublicKey> => {
      return (
        await anchor.web3.PublicKey.findProgramAddress(
          [
            Buffer.from("metadata"),
            TOKEN_METADATA_PROGRAM_ID.toBuffer(),
            mint.toBuffer(),
          ],
          TOKEN_METADATA_PROGRAM_ID
        )
      )[0];
    };
    const getMasterEdition = async (
      mint: anchor.web3.PublicKey
    ): Promise<anchor.web3.PublicKey> => {
      return (
        await anchor.web3.PublicKey.findProgramAddress(
          [
            Buffer.from("metadata"),
            TOKEN_METADATA_PROGRAM_ID.toBuffer(),
            mint.toBuffer(),
            Buffer.from("edition"),
          ],
          TOKEN_METADATA_PROGRAM_ID
        )
      )[0];
    };
    const mintKey: anchor.web3.Keypair = anchor.web3.Keypair.generate();

现在让我们制作通证和关联的通证账户,如下面代码所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
const NftTokenAccount = await getAssociatedTokenAddress(
      mintKey.publicKey,
      program.provider.wallet.publicKey
    );
    console.log("NFT Account: ", NftTokenAccount.toBase58());
    const mint_tx = new anchor.web3.Transaction().add(
      anchor.web3.SystemProgram.createAccount({
        fromPubkey: program.provider.wallet.publicKey,
        newAccountPubkey: mintKey.publicKey,
        space: MINT_SIZE,
        programId: TOKEN_PROGRAM_ID,
        lamports,
      }),
      createInitializeMintInstruction(
        mintKey.publicKey,
        0,
        program.provider.wallet.publicKey,
        program.provider.wallet.publicKey
      ),
      createAssociatedTokenAccountInstruction(
        program.provider.wallet.publicKey,
        NftTokenAccount,
        program.provider.wallet.publicKey,
        mintKey.publicKey
      )
    );
    const res = await program.provider.send(mint_tx, [mintKey]);
    console.log(
      await program.provider.connection.getParsedAccountInfo(mintKey.publicKey)
    );
    console.log("Account: ", res);
    console.log("Mint key: ", mintKey.publicKey.toString());
    console.log("User: ", program.provider.wallet.publicKey.toString());
    const metadataAddress = await getMetadata(mintKey.publicKey);
    const masterEdition = await getMasterEdition(mintKey.publicKey);
    console.log("Metadata address: ", metadataAddress.toBase58());
    console.log("MasterEdition: ", masterEdition.toBase58());

注意:mint 和 freeze 权限必须相同,否则不起作用。


createInitializeMintInstruction( mintKey.publicKey, 0,
program.provider.wallet.publicKey,// mint auth
program.provider.wallet.publicKey // freeze auth
),

现在,调用 mint 函数并传递数据和帐户:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const tx = await program.rpc.mintNft(
      mintKey.publicKey,
      "https://arweave.net/y5e5DJsiwH0s_ayfMwYk-SnrZtVZzHLQDSTZ5dNRUHA",
      "NFT Title",
      {
        accounts: {
          mintAuthority: program.provider.wallet.publicKey,
          mint: mintKey.publicKey,
          tokenAccount: NftTokenAccount,
          tokenProgram: TOKEN_PROGRAM_ID,
          metadata: metadataAddress,
          tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID,
          payer: program.provider.wallet.publicKey,
          systemProgram: SystemProgram.programId,
          rent: anchor.web3.SYSVAR_RENT_PUBKEY,
          masterEdition: masterEdition,
        },
      }
    );
    console.log("Your transaction signature", tx);

好了!现在只需运行anchor test,就应该能够铸造你的 NFT:

1
2
3
4
5
6
7
8
9
Account:  4swRFMNovHCkXY3gDgAGBXZwpfFuVyxWpWsgXqbYvoZG1M63nZHxyPRm7KTqAjSdTpHn2ivyPr6jQfxeLsB6a1nX
Mint key:  DehGx61vZPYNaMWm9KYdP91UYXXLu1XKoc2CCu3NZFNb
User:  7CtWnYdTNBb3P9eViqSZKUekjcKnMcaasSMC7NbTVKuE
Metadata address:  7ut8YMzGqZAXvRDro8jLKkPnUccdeQxsfzNv1hjzc3Bo
MasterEdition:  Au76v2ZDnWSLj23TCu9NRVEYWrbVUq6DAGNnCuALaN6o
Your transaction signature KwEst87H3dZ5GwQ5CDL1JtiRKwcXJKNzyvQShaTLiGxz4HQGsDA7EW6rrhqwbJ2TqQFRWzZFvhfBU1CpyYH7WhH
    ✔ Is initialized! (6950ms)
  1 passing (7s)
✨  Done in 9.22s.

如果提示任何带有 0x1 等十六进制值的自定义程序错误,请将十六进制值转换为纯文本,然后前往metaplex github 并使用你的浏览器搜索“error(”

可以在这里查看 NFT:solscan

7、结束语

我希望本指南对所有 Solana 极客有用。当我第一次尝试铸造 NFT 时感到非常困难,希望这篇文章对你有所帮助。 可以从这里下载教程里的代码。


原文链接:
http://blog.hubwiz.com/2022/08/03/mint-nft-on-solana/



Tags:NFT   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
NFT市场回暖 巨鲸和KOL们都在买什么?
最近一周,比特币生态相关市场行情持续火热。但或许有人还没注意到,NFT 市场也在逐渐走出上涨行情。据 BlockBeats 观察,11 月以来,巨鲸陆续买入 Weirdo Ghost Gang(小幽灵)、Yuga...【详细内容】
2023-11-14  Search: NFT  点击:(96)  评论:(0)  加入收藏
供应链NFT及其工作原理指南
编辑丨lee@Web3CN.Pro供应链是商业中的一股隐藏力量,负责将食物运送到杂货店、将 T 恤运送到服装店、将汽车运送到经销商。这些人员和企业网络旨在尽可能快速、廉价地生产并...【详细内容】
2023-10-24  Search: NFT  点击:(80)  评论:(0)  加入收藏
黑客盗窃NFT数字藏品 该当何罪
近日,接连有国内数藏平台遭受黑客技术攻击,导致大量数字藏品失窃,随后被迅速挂售,提现走人,用户或平台损失巨大。据悉,平台目前已报警,警方已冻结大部分涉案资金,犯罪嫌疑人也已被控...【详细内容】
2023-08-29  Search: NFT  点击:(116)  评论:(0)  加入收藏
虚拟化身是数字资产的画布 但NFT是可选项
作者: Ready Player Me;翻译:MetaCatReady Player Me 面向所有人Ready Player Me(RPM)面向所有人,RPM 的目标是建立一个人人都可在元宇宙中使用的化身平台,创建 RPM 化身永远免费。...【详细内容】
2023-08-25  Search: NFT  点击:(115)  评论:(0)  加入收藏
NFT已死?过去两年的实际交易数据分析
作者:OVERPRICED JPEGS ;编译:火火/白话区块链1、NFT 的消亡NFT 已死。反驳这个观点现在变得越来越困难。本周仅有 46,139 个钱包购买或出售了 NFT。钱包参与度比去年本周下降了...【详细内容】
2023-08-23  Search: NFT  点击:(77)  评论:(0)  加入收藏
NFT成交量超12亿美元 Polygon会再演Solana上的NFT盛况吗?
作者:律动 BlockBeatsPolygon 似乎和当时的 Solana 一样,只欠 Okay Bears 这样的&lsquo;东风&rsquo;谈及 NFT,大家的目光毫无疑问都首先聚焦在 ETH 上,其次是 Solana,今年刚兴起...【详细内容】
2023-08-14  Search: NFT  点击:(112)  评论:(0)  加入收藏
元宇宙电商NFT在数字时代的发展前景和应用
摘要:元宇宙电商NFT是一种基于区块链技术和非同质化代币(NFT)的新型交易方式,它将数字商品与虚拟世界相结合,为用户提供全新的购物和交易体验。本文将介绍元宇宙电商NFT的概念和...【详细内容】
2023-08-09  Search: NFT  点击:(95)  评论:(0)  加入收藏
谷歌调整政策:允许开发者将NFT交易引入游戏
新浪科技讯 北京时间7月13日早间消息,据报道,谷歌 调整NFT政策,允许游戏开发者探索各种新方式,将NFT用于Play Store游戏。过去几个月NFT投资者遭受打击,他们的藏品价值下跌,大家对...【详细内容】
2023-07-13  Search: NFT  点击:(90)  评论:(0)  加入收藏
如何通过链下NFT实现零成本无需许可的福利
金色财经撰文:Starzq和Ruby Wang围绕个人所有权与数据建立下一代互联网的关键之一就是无需许可。最近的市场,让不少 builder 和 VC 发问&lsquo;Web3 除了投机,还能做什么?&rsquo...【详细内容】
2023-05-22  Search: NFT  点击:(110)  评论:(0)  加入收藏
NFT和数字藏品的区别,你了解多少?
在介绍nft数字藏品之前,先跟大家说说什么是NFT。NFT是指非同质化通证,实质是区块链网络里具有唯一性特点的可信数字权益凭证,是一种可在区块链上记录和处理多维、复杂属性的数...【详细内容】
2023-03-20  Search: NFT  点击:(134)  评论:(0)  加入收藏
▌简易百科推荐
区块链在网络安全领域的十大应用案例
在网络安全的动态格局中,威胁与防御一样快速发展,区块链作为坚定的守护者出现,彻底改变了数字安全的范式。除了加密货币的起源之外,区块链技术还因其对加强网络防御的变革性影响...【详细内容】
2023-12-12    千家网  Tags:区块链   点击:(50)  评论:(0)  加入收藏
区块链dapp开发模式
区块链Dapp开发的模式有三种:1.点对点交易模式:这种模式是指两个用户之间直接进行交易,无需通过中间方进行撮合。在Dapp系统中,点对点交易模式可以大大降低交易成本和时间,同时也...【详细内容】
2023-12-06  天晟区块链开发    Tags:区块链   点击:(61)  评论:(0)  加入收藏
2024年最热门的区块链趋势
在快速发展的区块链技术世界中,每年都会带来重塑行业的新创新和趋势。步入 2024 年,我们正处于一些令人兴奋的发展的风口浪尖,这些发展将彻底改变区块链格局。本文将作为您了解...【详细内容】
2023-12-06  李留白  微信公众号  Tags:区块链   点击:(83)  评论:(0)  加入收藏
每个人都应该做好准备的 2024 年区块链十大趋势
作为一名未来学家,我认为展望未来是我的工作,因此今年我想介绍将在未来 12 个月内塑造数字世界的新兴区块链趋势。哪些技术最受关注?企业领导者需要做好准备的最大趋势是什么?本...【详细内容】
2023-11-27  李留白  微信公众号  Tags:区块链   点击:(81)  评论:(0)  加入收藏
区块链你接触了么?
最近什么概念最火?毫无疑问是“区块链”。吃个饭,五桌有四桌都在跟你聊区块链。然而大部分人对“区块链”好奇,甚至眼馋,大都处于不求甚解的懵逼阶段。小编最近集中进行了研究,了...【详细内容】
2023-11-13  叮当天使    Tags:区块链   点击:(49)  评论:(0)  加入收藏
DAPP 区块链去中心化应用
DAPP是基于P2P对等网络而运行在智能合约之上的分布式应用程序,区块链则为其提供可信的数据记录。DAPP必须是开源、自治的。可以由用户自由打包生成,签名标记所属权,它的发布不...【详细内容】
2023-10-28  软件开发阿辉    Tags:DAPP   点击:(66)  评论:(0)  加入收藏
花旗、摩根大通纷纷入局 区块链将如何改变金融服务?
金色财经 作者:Stephen Gandel前摩根大通高管、华尔街最著名的金融家之一Blythe Masters于2015年被任命为区块链公司Digital Asset Holdings的首席执行官,许多人认为这是一种...【详细内容】
2023-10-26    金色财经  Tags:区块链   点击:(63)  评论:(0)  加入收藏
供应链NFT及其工作原理指南
编辑丨lee@Web3CN.Pro供应链是商业中的一股隐藏力量,负责将食物运送到杂货店、将 T 恤运送到服装店、将汽车运送到经销商。这些人员和企业网络旨在尽可能快速、廉价地生产并...【详细内容】
2023-10-24    市场资讯  Tags:NFT   点击:(80)  评论:(0)  加入收藏
“过气”的区块链,行业寒冬中的矿工
作者|陈默编辑|江岳炒币和挖矿已经过时了,至少在中国是如此。“现在没人提什么区块链了,玩的是AI。”当10月初比特大陆有关欠薪风波的消息传出后,有网友在weibo上表示。在社交...【详细内容】
2023-10-23  首席人物观    Tags:区块链   点击:(58)  评论:(0)  加入收藏
数字酒证是什么,高端白酒收藏投资价值如何?
随着经济的不断发展,高端白酒市场也在不断的增长。高端白酒收藏投资价值逐渐受到关注,吸引了大部分投资者的目光。并且随着数字时代的到来,白酒行业作为一个传统的行业正在朝着...【详细内容】
2023-10-10  执棋参禅    Tags:   点击:(86)  评论:(0)  加入收藏
站内最新
站内热门
站内头条