BuBu

Zwj`Blog

My decentralized blog
github
email

Solana學習

Solana 學習#

2. 從 Solana 網路讀取資料#

(1) Summary 概括#

SOL 是 Solana 原生代幣的名稱。每個 SOL 由 10 億個 Lamports 組成。

帳戶存儲代幣、NFT、程序和資料。

地址指向 Solana 網路上的帳戶。任何人都可以讀取給定地址的資料。大多數地址也是公鑰。

(2) Accounts 账户#

Solana 上存儲的所有資料都存儲在帳戶中。帳戶可以存儲:

  • SOL
  • 其他代幣,例如 USDC
  • NFT
  • 程序
  • 程序資料

(3) SOL 介紹#

SOL 是 Solana 的原生代幣 - SOL 用於支付交易費用、支付帳戶租金等。 SOL 有時用 ◎ 符號顯示。每個 SOL 由 10 億個 Lamports 組成。

與金融應用程序通常以美分(美元)和便士(英鎊)進行數學計算的方式相同,Solana 應用程序通常將 SOL 作為 Lamport 進行傳輸、支出、存儲和處理,僅轉換為完整的 SOL 來顯示給使用者。

(4) Addresses 地址#

地址唯一標識帳戶。地址通常顯示為 base-58 編碼字串,例如 dDCQNnDmNbFVi8cQhKAgXhyhXeJ625tvwsunRyRc7c8。 Solana 上的大多數地址也是公鑰。誰控制了地址的匹配密鑰,誰就控制了該帳戶 —— 例如,擁有密鑰的人可以從該帳戶發送代幣。

(5) 代碼#

import { PublicKey,LAMPORTS_PER_SOL,Keypair,Connection, clusterApiUrl } from "@solana/web3.js";
console.log("生成公私鑰對");
const keypair = Keypair.generate();
console.log(`The public key is: `, keypair.publicKey.toBase58());
console.log(`The secret key is: `, keypair.secretKey);
console.log('----------------------');
console.log("創建連接");
const connection = new Connection(clusterApiUrl("devnet"));
// console.log(connection)
console.log(`✅ Connected!`)
console.log("----------------------");
console.log("獲取帳戶餘額");
const address = new PublicKey('4pa3H5FwfPPSYH8JGKiKb91mgjx6iVbt4X3XJAdV7s5g');
const balance = await connection.getBalance(address);
const balanceInSol = balance / LAMPORTS_PER_SOL;
console.log(`The balance of the account at ${address} is ${balanceInSol} SOL`); 
console.log(`✅ Finished!`)

3. 在 Solana 網路上創建交易 \#

(1) Summary 概括#

對鏈上資料的所有修改都是通過交易發生的。事務主要是一組調用 Solana 程序的指令。事務是原子的,這意味著它們要麼成功(如果所有指令都已正確執行),要麼失敗,就像事務根本沒有運行一樣。

(2) Transactions are atomic 交易是原子的#

對鏈上資料的任何修改都是通過發送到程序的交易發生的。

Solana 上的交易與其他地方的交易類似:它是原子的。原子性意味著整個事務運行或失敗。

想想網上支付的東西:

  • 您的帳戶餘額已被扣除
  • 銀行將資金轉給商戶

這兩件事都需要發生才能使交易成功。如果其中任何一個失敗,則任何一個都不會發生,而不是向商家付款但不從您的帳戶中扣除,或者從帳戶中扣除但不向商家付款。

原子意味著事務要麼發生(意味著所有單獨步驟都成功),要麼整個事務失敗。

(3) Transactions contain instructions 交易包含指令#

Solana 上的事務中的步驟稱為指令。

每條指令包含:

  • 將讀取和 / 或寫入的帳戶陣列。這就是 Solana 快速的原因 - 影響不同帳戶的交易同時處理
  • 要調用的程序的公鑰
  • 傳遞給正在調用的程序的資料,結構為位元組陣列

運行事務時,將使用事務中包含的指令調用一個或多個 Solana 程序。

(4) 代碼#

import { Transaction,SystemProgram,sendAndConfirmTransaction,Connection,LAMPORTS_PER_SOL,clusterApiUrl,Keypair, PublicKey } from "@solana/web3.js"
const connection = new Connection(clusterApiUrl("devnet"), "confirmed")
//生成一個新的密鑰對
const senderKeypair = Keypair.generate()
//空投
await connection.requestAirdrop(senderKeypair.publicKey, LAMPORTS_PER_SOL)//1SOL=1000000000LAMPORTS
//接受者
const receiverPubkey = new PublicKey("4pa3H5FwfPPSYH8JGKiKb91mgjx6iVbt4X3XJAdV7s5g")
//獲取接收者的餘額
const receiverBalance = await connection.getBalance(receiverPubkey)
//獲取發送者的餘額
const senderBalance = await connection.getBalance(senderKeypair.publicKey)
console.log("sender balance:", senderBalance)
console.log("receiver balance:", receiverBalance)
const transaction = new Transaction()
const sendSolInstruction = SystemProgram.transfer({
  fromPubkey: senderKeypair.publicKey,//與發送者帳戶對應的公鑰
  toPubkey: receiverPubkey,//與接收者帳戶對應的公鑰 
  lamports: LAMPORTS_PER_SOL/2//發送到 Lamps 的 SOL 數量。 
})

transaction.add(sendSolInstruction)

const signature =await sendAndConfirmTransaction(
    connection,//集群連接
    transaction,//一筆交易 
    [senderKeypair]//一組密鑰對,將充當交易的簽名者 - 在本例中,我們只有一個簽名者:發送者。
  )
//獲取接收者的餘額
const receiverBalance01 =await connection.getBalance(receiverPubkey)
//獲取發送者的餘額
const senderBalance01 =await connection.getBalance(senderKeypair.publicKey)
console.log("sendered balance:", senderBalance01)
console.log("receivered balance:", receiverBalance01)
console.log("signature:", signature)

4. 使用令牌計劃創建令牌#

(1) Summary 概括#

SOL 是 Solana 的 “原生代幣”。所有其他代幣,可替代代幣和不可替代代幣(NFT),都稱為 SPL 代幣

令牌程序包含創建 SPL 代幣並與之互動的說明

代幣鑄幣廠是定義特定代幣的帳戶。這包括有關代幣本身的資訊(例如它有多少位小數)、允許鑄造更多代幣的帳戶(稱為造幣機構)以及在哪裡可以找到有關代幣的更多資訊(例如描述、圖像等)。造幣機構可以使用代幣鑄造來製造更多代幣!

代幣帳戶持有特定代幣鑄幣廠的代幣。對於大多數使用者來說,他們的每個代幣鑄幣廠的餘額都存儲在關聯的代幣帳戶中 - 其地址由其錢包地址和代幣鑄幣廠組成的帳戶。

創建代幣鑄幣廠和代幣帳戶需要在 SOL 中分配租金。 Token 帳戶的租金可以在帳戶關閉時退還,但 Token Mints 目前無法關閉。

(2) 代幣鑄造步驟#

  1. Creating a new Token Mint
    創建一個新的代幣鑄幣廠
  2. Creating Token Accounts 創建令牌帳戶
  3. Minting 鑄幣
  4. Transferring tokens from one holder to another
    將代幣從一個持有者轉移到另一個持有者
  5. Burning tokens 燃燒代幣

(3) Token Account 代幣帳戶#

在鑄造代幣(發行新供應)之前,需要一個代幣帳戶來保存新發行的代幣。

代幣帳戶持有特定 “鑄幣廠” 的代幣,並擁有指定的帳戶 “所有者”。只有所有者有權減少代幣帳戶餘額(轉帳、銷毀等),而任何人都可以向代幣帳戶發送代幣以增加其餘額。

在你給我的 Solana 代碼裡,這個新創建的帳戶用於持有代幣(mint)的狀態和元資料,而你作為付款人支付了創建這個帳戶所需的費用,同時你也擁有這個代幣的鑄造權(mint authority)。

5. 使用 Metaplex 創建 Solana NFT#

(1) Summary 概括#

不可替代代幣 (NFT) 在 Solana 上表示為 SPL 代幣,具有关联的元資料帳戶、0 位小數和最大供應量 1

Metaplex 提供了一系列工具,可簡化 Solana 區塊鏈上 NFT 的創建和分發

令牌元資料計劃標準化了將元資料附加到 SPL 代幣的過程

Metaplex SDK 是一個提供使用者友好的 API 的工具,可以幫助開發者使用 Metaplex 提供的鏈上工具

Candy Machine 程序是一種 NFT 分發工具,用於從集合中創建和鑄造 NFT

Sugar CLI 是一個工具,可以簡化上傳媒體 / 元資料檔案和為集合創建糖果機的過程

(2) Solana 上的 NFT#

6. 自定義鏈上程序#

7. 鏈上程序開發#

(1) Anchor 程序結構#

Anchor 使用宏和特徵為您生成樣板 Rust 代碼。它們為您的程序提供了清晰的結構,以便您可以更輕鬆地推理您的代碼。主要的高級宏和屬性是:

  • declare_id - 用於聲明程序的鏈上地址的宏
  • #[program] - 用於表示包含程序指令邏輯的模組的屬性宏
  • 帳戶 - 應用於表示指令所需帳戶列表的結構的特徵
  • #[account] - 用於定義程序的自定義帳戶類型的屬性宏
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。