幾百元做網(wǎng)站百度推廣圖片
Solana CLI 基礎(chǔ)知識(shí)
Solana CLI 是一個(gè)命令行界面工具,提供了一系列用于與 Solana Cluster 交互的命令。
我們將介紹一些最常見的命令,但你始終可以通過運(yùn)行?solana --help
?查看所有可能的 Solana CLI 命令列表。
Solana CLI 配置
Solana CLI 存儲(chǔ)了一些配置設(shè)置,這些設(shè)置會(huì)影響某些命令的行為。你可以使用以下命令查看當(dāng)前的配置:
solana config get
solana config get
?命令將返回以下信息:
Config File
?- Solana CLI 文件在計(jì)算機(jī)上的位置RPC URL
?- 你使用的節(jié)點(diǎn),將你連接到 localhost、Devnet 或 MainnetWebSocket URL
?- 用于監(jiān)聽你所針對(duì)的 Cluster 事件的 WebSocket(在設(shè)置?RPC URL
?時(shí)計(jì)算)Keypair Path
?- 運(yùn)行 Solana CLI 子命令時(shí)使用的密鑰對(duì)路徑Commitment
?- 提供網(wǎng)絡(luò)確認(rèn)(confirmation)的度量,并描述區(qū)塊在某一時(shí)刻已最終確認(rèn)(finalized)的程度
你可以隨時(shí)使用?solana config set
?命令,后跟你想要更新的設(shè)置,更改 Solana CLI 的配置。
最常見的更改將是針對(duì)的 Cluster。使用?solana config set --url
?命令更改?RPC URL
。
solana config set --url localhost
solana config set --url devnet
solana config set --url mainnet-beta
類似地,你可以使用?solana config set --keypair
?命令更改?Keypair Path
。然后,當(dāng)運(yùn)行命令時(shí),Solana CLI 將使用指定路徑上的密鑰對(duì)。
solana config set --keypair ~/<FILE_PATH>
測(cè)試驗(yàn)證節(jié)點(diǎn)
通常,為了進(jìn)行測(cè)試和調(diào)試,你會(huì)發(fā)現(xiàn)運(yùn)行本地驗(yàn)證節(jié)點(diǎn)比部署到 Devnet 更有幫助。
你可以使用?solana-test-validator
?命令運(yùn)行本地測(cè)試驗(yàn)證器。此命令創(chuàng)建一個(gè)持續(xù)運(yùn)行的進(jìn)程,需要在其自己的命令行窗口中運(yùn)行。
流式程序日志
通常,同時(shí)打開一個(gè)新控制臺(tái)并運(yùn)行?solana logs
?命令,可以幫助你觀察測(cè)試驗(yàn)證節(jié)點(diǎn)相關(guān)的日志。這將創(chuàng)建另一個(gè)持續(xù)運(yùn)行的進(jìn)程,會(huì)流式傳輸與你配置的 Cluster 相關(guān)的日志。
如果 CLI 配置指向?localhost
,則日志將始終與你創(chuàng)建的測(cè)試驗(yàn)證器相關(guān)聯(lián),但你也可以從其他 Cluster(如 Devnet 和 Mainnet Beta)中流式傳輸日志。當(dāng)從其他 Cluster 流式傳輸日志時(shí),你需要在命令中包含一個(gè)程序 ID,以限制你看到的日志僅為特定程序的日志。
密鑰對(duì)
你可以使用?solana-keygen new --outfile
?命令生成新的密鑰對(duì),后跟存儲(chǔ)密鑰對(duì)的文件路徑。
solana-keygen new --outfile \~/\<FILE_PATH>
有時(shí),你可能需要檢查配置指向的是哪個(gè)密鑰對(duì)。要查看在?solana config
?中設(shè)置的當(dāng)前密鑰對(duì)的?publickey
,請(qǐng)使用?solana address
?命令。
solana address
要查看在?solana config
?中設(shè)置的當(dāng)前密鑰對(duì)的 SOL 余額,請(qǐng)使用?solana balance
?命令。
solana balance
要在 Devnet 或 localhost 上空投 SOL,請(qǐng)使用?solana airdrop
?命令。請(qǐng)注意,在 Devnet 上,每次空投限制為 5 SOL。
solana airdrop 5
在本地環(huán)境中開發(fā)和測(cè)試程序時(shí),你可能會(huì)遇到以下原因?qū)е碌腻e(cuò)誤:
- 使用錯(cuò)誤的密鑰對(duì)
- 沒有足夠的 SOL 來部署程序或執(zhí)行交易
- 指向錯(cuò)誤的 Cluster
到目前為止,我們介紹的 CLI 命令應(yīng)該可以幫助你迅速解決這些問題。
在本地環(huán)境中開發(fā) Solana 程序
盡管 Solana Playground 非常有幫助,但很難超越你自己的本地開發(fā)環(huán)境的靈活性。隨著你構(gòu)建更復(fù)雜的程序,你可能最終會(huì)將它們與在本地環(huán)境中同樣在開發(fā)中的一個(gè)或多個(gè)客戶端集成。當(dāng)你在本地編寫、構(gòu)建和部署程序時(shí),程序和客戶端之間的測(cè)試通常更簡單。
創(chuàng)建新項(xiàng)目
要?jiǎng)?chuàng)建一個(gè)用于編寫 Solana 程序的新 Rust 包,你可以使用?cargo new --lib
?命令,后跟你想要?jiǎng)?chuàng)建的新目錄的名稱。
cargo new --lib <PROJECT_DIRECTORY_NAME>
此命令將創(chuàng)建一個(gè)新目錄,其名稱為你在命令末尾指定的名稱。這個(gè)新目錄將包含一個(gè)描述該包的?Cargo.toml
?清單文件(manifest file)。
清單文件包含元數(shù)據(jù),如名稱、版本和依賴項(xiàng)(crates)。要編寫 Solana 程序,你需要更新?Cargo.toml
?文件,將?solana-program
?添加為依賴項(xiàng)。你可能還需要添加下面顯示的?[lib]
?和?crate-type
?行。
[package]
name = "<PROJECT_DIRECTORY_NAME>"
version = "0.1.0"
edition = "2021"
[features]
no-entrypoint = []
[dependencies] solana-program = "~1.8.14"
[lib]
crate-type = ["cdylib", "lib"]
在這一點(diǎn)上,你可以開始在?src
?文件夾中編寫程序。
構(gòu)建和部署
當(dāng)需要構(gòu)建 Solana 程序時(shí),可以使用?cargo build-bpf
?命令。
cargo build-bpf
該命令的輸出將包含部署程序的說明,看起來類似于:
To deploy this program: $ solana program deploy /Users/James/Dev/Work/solana-hello-world-local/target/deploy/solana_hello_world_local.so The program address will default to this keypair (override with --program-id): /Users/James/Dev/Work/solana-hello-world-local/target/deploy/solana_hello_world_local-keypair.json
當(dāng)你準(zhǔn)備部署程序時(shí),使用?cargo build-bpf
?輸出的?solana program deploy
?命令。這將把你的程序部署到你 CLI 配置中指定的 Cluster。
solana program deploy <PATH>
實(shí)驗(yàn)
讓我們通過構(gòu)建和部署我們?cè)赱Hello World 課程]中創(chuàng)建的 "Hello World!" 程序來進(jìn)行實(shí)踐。
我們將全部在本地進(jìn)行,包括部署到本地測(cè)試驗(yàn)證節(jié)點(diǎn)。在開始之前,請(qǐng)確保你已安裝了 Rust 和 Solana CLI。如果尚未設(shè)置,請(qǐng)參考概述中的說明。
1. 創(chuàng)建一個(gè)新的 Rust 項(xiàng)目
讓我們從創(chuàng)建一個(gè)新的 Rust 項(xiàng)目開始。運(yùn)行下面的?cargo new --lib
?命令。隨意用你自己的目錄名稱替換。
cargo new --lib solana-hello-world-local
記得更新?Cargo.toml
?文件,將?solana-program
?添加為依賴項(xiàng),并確保?crate-type
?行已經(jīng)存在。
[package]
name = "solana-hello-world-local"
version = "0.1.0"
edition = "2021"[dependencies]
solana-program = "~1.8.14"[lib]
crate-type = ["cdylib", "lib"]
2. 編寫程序
接下來,使用下面的“Hello World!”程序更新?lib.rs
。當(dāng)調(diào)用程序時(shí),該程序?qū)⒑唵蔚卮蛴 癏ello, world!”到程序日志。
use solana_program::{account_info::AccountInfo,entrypoint,entrypoint::ProgramResult,pubkey::Pubkey,msg
};entrypoint!(process_instruction);pub fn process_instruction(program_id: &Pubkey,accounts: &[AccountInfo],instruction_data: &[u8]
) -> ProgramResult{msg!("Hello, world!");Ok(())
}
- 運(yùn)行本地測(cè)試驗(yàn)證節(jié)點(diǎn)
在編寫好程序之后,讓我們確保我們的 Solana CLI 配置指向 localhost,使用 solana config set --url 命令。
solana config set --url localhost
接下來,使用?solana config get
?命令檢查 Solana CLI 配置是否已更新。
solana config get
最后,在一個(gè)單獨(dú)的終端窗口中運(yùn)行本地測(cè)試驗(yàn)證器。運(yùn)行?solana-test-validator
?命令。只有當(dāng)我們的?RPC URL
?設(shè)置為 localhost 時(shí),才需要執(zhí)行此操作。
solana-test-validator
4. 構(gòu)建和部署
現(xiàn)在我們準(zhǔn)備好構(gòu)建和部署我們的程序了。通過運(yùn)行?cargo build-bpf
?命令來構(gòu)建程序。
cargo build-bpf
現(xiàn)在讓我們部署程序。運(yùn)行?cargo build-bpf
?輸出的?solana program deploy
?命令。
solana program deploy <PATH>
solana program deploy
?將輸出程序的?Program ID
。你現(xiàn)在可以在[Solana Explorer]上查找已部署的程序(對(duì)于 localhost,請(qǐng)選擇“Custom RPC URL”作為 Cluster)。
5. 查看程序日志
在調(diào)用我們的程序之前,打開一個(gè)單獨(dú)的終端,并運(yùn)行?solana logs
?命令。這將允許我們?cè)诮K端中查看程序的日志。
solana logs <PROGRAM_ID>
在測(cè)試驗(yàn)證節(jié)點(diǎn)仍在運(yùn)行的情況下,嘗試使用此客戶端腳本調(diào)用程序。
在?index.ts
?中用剛剛部署的程序的程序 ID 替換原有的程序 ID,然后運(yùn)行?npm install
,接著運(yùn)行?npm start
。這將返回一個(gè) Solana Explorer URL。將該 URL 復(fù)制到瀏覽器中以在 Solana Explorer 上查找交易,并檢查是否將“Hello, world!”打印到程序日志中?;蛘?#xff0c;你也可以在運(yùn)行?solana logs
?命令的終端中查看程序日志。
恭喜!你剛剛從本地開發(fā)環(huán)境中創(chuàng)建并部署了你的第一個(gè) Solana 程序。
挑戰(zhàn)
嘗試創(chuàng)建一個(gè)新程序,將自己的消息打印到程序日志中。這次將程序部署到 Devnet,而不是 localhost。
記得使用?solana config set --url
?命令將?RPC URL
?更新到 Devnet。
你可以使用與實(shí)驗(yàn)相同的客戶端腳本調(diào)用程序,只要將?connection
?和 Solana Explorer URL 都更新為指向 Devnet 而不是 localhost。
let connection = new web3.Connection(web3.clusterApiUrl("devnet"));
console.log(`Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
);
你還可以打開一個(gè)單獨(dú)的命令行窗口,并使用?solana logs | grep "<PROGRAM_ID> invoke" -A <NUMBER_OF_LINES_TO_RETURN>
。在 Devnet 上使用?solana logs
?時(shí),必須指定程序 ID。否則,solana logs
?命令將從 Devnet 返回一系列恒定的日志流。例如,你可以執(zhí)行以下操作來監(jiān)視對(duì) Token 程序的調(diào)用,并顯示每次調(diào)用的前 5 行日志:
solana logs | grep "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke" -A 5
還可以使用像GTokenTool這樣子的一鍵發(fā)幣平臺(tái),只需簡單填寫相關(guān)信息就可以實(shí)現(xiàn)發(fā)幣。