Solana 核心概念:快速构建简单的dApp应用(一)

Web3 概念

什么是 Web3?

Web2 的局限性

  • 账户由平台(如微信、淘宝)托管
  • 数据隐私可能被泄露或滥用

Web3 的核心组成

  • 钱包:用户直接管理的账户工具
  • 代币:基于区块链的资产形式
  • 常用服务:在线商品交易、全球支付、跨境支付等

Web3 的特点

  • 用户直接拥有账户,无需中间商
  • 支持去中心化交易和互动

什么是 Solana?

Solana 是新一代的区块链,与比特币、以太坊相比具有创新性。

Solana 的三大优势

  • 交易速度快:1-2秒内完成
  • 交易费用低:约 <math xmlns="http://www.w3.org/1998/Math/MathML"> 0.00025 0.00025~ </math>0.00025 0.0005每笔交易
  • 高度去中心化:增加安全性与可靠性

应用场景

  • 实时性高的 Web3 应用,比如支付、交易所等

学习 Solana 开发需要的环境

我们在学习 Solana 不需要掌握区块链相关的很多知识,或者是具备 Rust 等编程语言。你只需要有一台电脑并且可以安装 Nodejs 以及掌握基础的 Nodejs、TypeScript就可以了。

  • 所需技能:基础的 Nodejs 和 TypeScript 知识
  • 工具安装
    • 安装 Nodejs v20.18.2
    • 下载相关依赖库(如:@solana/web3.js)

密钥对与账户管理

密钥对的基本概念

  • 组成:私钥 + 公钥
  • 作用:
    • 公钥用于共享和接收交易
    • 私钥用于验证账户权限,需妥善保管

创建密钥,代码如下所示:

js 复制代码
import { Keypair } from "@solana/web3.js"

const keypair = Keypair.generate()
const publicKey = keypair.publicKey.toBase58()
const secretKey = keypair.secretKey
console.log(`公钥1:${publicKey}`)
console.log(`私钥1:${secretKey}`)
js 复制代码
import { Keypair } from "@solana/web3.js"

const secretKey = keypair.secretKey
const keypair = Keypair.fromSecretKey(Uint8Array.from(secretKey))
console.log(`公钥2:${keypair.publicKey.toBase58()}`)
console.log(`私钥2:${keypair.secretKey}`)

Sol 代币与网络交互

Sol 的作用

  • Solana 网络的原生代币,用于支付交易费用
  • 1 sol = 10亿 lamport(solana里面最小的计量单位lamport)

连接网络

js 复制代码
import { Connection, clusterApiUrl } from '@solana/web3.js'

// devnet,testnet,mainnet
const connection = new Connection(clusterApiUrl('devnet'))

领取测试代币

通过代码领取测试代币

js 复制代码
import { airdropIfRequired } from '@solana-developers/helpers'

await airdropIfRequired(connection, publicKey, amount, minBalance)

Solana 区块浏览器

用途

  • 查询链上交易信息
  • 查看交易时间、区块号、交易费等

常用 Solana 浏览器

Solana 钱包与适配器

钱包概念

  • 查询链上资产交易信息
  • 查看交易时间、区块号、交易费等

常用钱包

  • Phantom(幻影钱包)
  • Solflare(太阳耀斑)
  • Backpack(背包)
  • Okx(欧易)

钱包适配器

  • @solana/wallet-adapter-base
  • @solana/wallet-adapter-wallets
  • @solana/wallet-adapter-react
  • @solana/wallet-adapter-react-ui

构建dApp并连接钱包

创建项目

bash 复制代码
npx create-next-app solana-wallet-connect

集成钱包

js 复制代码
import { ConnectionProvider, WalletProvider } from '@solana/wallet-adapter-react'
import { WalletAdapterNetwork } from '@solana/wallet-adapter-base'
// import { WalletMultiButton, WalletDisconnectButton, WalletModalProvider } from '@solana/wallet-adapter-react-ui'
import { clusterApiUrl } from '@solana/web3.js'
import dynamic from "next/dynamic"
import '@solana/wallet-adapter-react-ui/styles.css'

// 动态导入钱包组件
const WalletMultiButton = dynamic(async () => (await import('@solana/wallet-adapter-react-ui')).WalletMultiButton, {
  ssr: false,
})

const WalletDisconnectButton = dynamic(
  async () => (await import('@solana/wallet-adapter-react-ui')).WalletDisconnectButton,
  { ssr: false }
)

const WalletModalProvider = dynamic(async () => (await import('@solana/wallet-adapter-react-ui')).WalletModalProvider, {
  ssr: false,
})

export default function Wallets() {
    // 定义网络
    const network = WalletAdapterNetwork.Devnet
    // 获取网络
    const endpoint = useMemo(() => clusterApiUrl(network), [network])
    // 钱包
    const wallets = useMemo(
        () => [], [])

    return (
        <ConnectProvider endpoint={endpoint}>
            <WalletProvider wallets={wallets} autoConnect>
                <WalletModalProvider>
                    <WalletMultiButton />
                    <WalletDisconnectButton />
                </WalletModalProvider>
            </Walletprovider>
        </ConnectProvider>
    )
}

访问账户信息

读取账户余额

js 复制代码
import { useWallet, useConnection } from '@solana/wallet-adapter-react'

const WalletBalance = () => {
    const { connection } = useConnection()
    const { publicKey } = useWallet()
    const [balance, setBalance] = useState(0)

    useEffect(() => {
      const getBalance = async () => {
        if (!publicKey) return
        const balance = await connection.getBalance(publicKey)
        setBalance(balance)
        console.log(`钱包余额:${balance / LAMPORTS_PER_SOL} SOL`)
        return balance
      };

      getBalance()
    }, [connection, publicKey])
    
    return (
      <div className="flex flex-col gap-2">
        <div>
          <b>地址:</b>
          {publicKey?.toBase58()}
        </div>
        <div>
          <b>余额:</b>
          {balance / LAMPORTS_PER_SOL} SOL
        </div>
      </div>
    )
 }

实时监听余额变化

js 复制代码
import { useConnection } from '@solana/wallet-adapter-react'
import { LAMPORTS_PER_SOL } from '@solana/web3.js'

const { connection } = useConnection()
connection.onAccountChange(publicKey, updatedAccountInfo => {
    setBalance(updatedAccountInfo.lamports / LAMPORTS_PER_SOL)
})

发送交易

创建交易

js 复制代码
const tx = new Transaction()
tx.add(SystemProgram.transfer({
    fromPubkey, 
    toPubkey, 
    lamports
}))

发送交易

js 复制代码
const signature = await sendTransaction(tx, connection)
console.log(`Transaction sent: ${signature}`)

具体代码实现

直接移步到github仓库下载查看:github.com/jackchen012...

总结

  • 理解 Web3 和 Solana 的核心概念
  • 掌握密钥对和账户的管理
  • 使用钱包工具进行安全交互
  • 构建简单的 dApp,并实现钱包连接和交易功能
相关推荐
yaoganjili4 分钟前
端智能来袭!前端工程师的GPU"偷电"指南
前端
袁煦丞16 分钟前
MQTT轻松远程访问——EMQX服务器 :cpolar内网穿透实验室第548个成功挑战
前端·程序员·远程工作
超级白的小白16 分钟前
0️⃣harmany OS:华为测试机根目录安装CA证书(升级后系统禁用直接写入文件操作解决方案)
前端·harmonyos
wordbaby17 分钟前
前端动态导入(import.meta.glob)
前端·vite
蒜香拿铁18 分钟前
【前端脚手架搭建】看完还学不会,你顺着网线来打我
前端·javascript
超级白的小白18 分钟前
React实现SSR及注意事项
前端
LanceJiang18 分钟前
Element-Plus 二次封装 el-table LeTable组件
前端·vue.js
歌呜啊瓜19 分钟前
所以,Hook 究竟是什么?
前端·react.js
超级白的小白20 分钟前
CSR、SSR、React同构概念的理解与梳理
前端
珹洺23 分钟前
从 HTML 到 CSS:开启网页样式之旅(八)—— 解决浮动产生的影响与浮动例题(CSS基础完结篇)
前端·javascript·css·servlet·html·html5