Skip to content

Latest commit

 

History

History
213 lines (147 loc) · 9.05 KB

File metadata and controls

213 lines (147 loc) · 9.05 KB

Solana

Build status Gitpod Ready-to-Code

Hello world on Solana

此專案將展示如何使用 Solana Javascript API 在 Solana 區塊鏈上構建、部署和程式交互。

此專案包含:

  • 鏈上的 Hello World 程式
  • 可以向帳戶發送 hello 並獲取 hello 的發送次數。

翻譯

目錄

快速開始

Open in Gitpod

如果您決定在 Gitpod 中打開,請參考 README-gitpod.md,否則請繼續閱讀。

要創建和運行此範例,請確認並安裝以下套件

如果這是您第一次使用 Docker 或 Rust,這些 安裝筆記 可能對您有幫助。

啟動本地 Solana 集群

默認情況下,此範例連接到本地Solana集群。

啟動鏈上程式日誌:

$ export RUST_LOG=solana_runtime::system_instruction_processor=trace,solana_runtime::message_processor=debug,solana_bpf_loader=debug,solana_rbpf=debug

啟動本地 Solana 集群:

$ solana-test-validator --log

安裝 npm 套件

$ npm install

部署鏈上程式

鏈上程式有 Rust 版本和 C 版本,最新的版本是運行範例時使用的版本。

$ npm run build:program-rust
$ npm run build:program-c

啟動客戶端

$ npm run start

期望產出

公鑰將會有所不同:

Lets say hello to a Solana account...
Connection to cluster established: http://localhost:8899 { solana-core: 1.1.2 }
Loading hello world program...
Program loaded to account 47bZX1D1tdmw3KWTo5MfBrAwwHBJQQzQL4VnNGT7HtyQ
Creating account Eys1jdLHdZ2AE56QAKpfadbjziMZ6NAvpL7qsdtM6sbk to say hello to
Saying hello to Eys1jdLHdZ2AE56QAKpfadbjziMZ6NAvpL7qsdtM6sbk
Eys1jdLHdZ2AE56QAKpfadbjziMZ6NAvpL7qsdtM6sbk has been greeted 1 times
Success

沒有達到期望產出?

  • 確保您已經 啟動本地 Solana 集群佈建鏈上程式.
  • 集群的輸出日誌應包括程序日誌消息以及程式失敗的原因
    • program log: <message>
  • 檢查 Solana 集群日誌以尋找任何失敗的交易或失敗的鏈上程式
    • 擴展日誌過濾器並重啟集群以查看更多細節
      • $ export RUST_LOG=solana_runtime::native_loader=trace,solana_runtime::system_instruction_processor=trace,solana_runtime::bank=debug,solana_bpf_loader=debug,solana_rbpf=debug
        $ solana-test-validator --log

自定義程式

要自定義示例,請更改 /src 下的文件。如果您更改 /src/program-rust/src/program-c 下的任何文件,你將需要重新部署鏈上程式

現在,當您重新運行 npm run start 時,您應該看到更改的結果。

學習 Solana

Solana 文件提供了有關 Solana 的更多消息並且所有的源代碼都在 github 上。

更多的問題?在 Discord 告訴我們。

學習 Client

此範例中的客戶端使用 JavaScript 語言撰寫:

進入點

客戶端入口點做了四件事

建立與集群的連接

客戶端通過調用 establishConnection 與客戶端建立連接.

載入鏈上程式 Hello World(如果尚未加載)

在群集上載入程式的過程包括將共享對象的位元組儲存在 Solana 帳戶的數據向量中,並標記帳戶為可實行的。

客戶端通過調用 載入程式載入程式。並將第一次的 loadProgram 稱為客戶端:

  • 從檔案系統中讀取共享對象
  • 計算載入程式相關的手續費
  • 空投時間戳記到付款人帳戶以支付費用
  • 通過 Solana web3.js 函式載入 BPFLoader.load 程式
  • 創建一個新的 greeter 帳戶,該帳戶將創建 Hello 交易
  • 在配置文件中記錄已載入 helloworld 程式和 greeter 帳戶的 公鑰。重複調用客戶端將載入相同的程式和 greeter 帳戶。(要強制重新加載程式,請執行 npm clean:store

發送 Hello 交易至鏈上

客戶端將通過調用 sayHello 並向程式發送 Hello 交易。此交易包含一條非常簡單的指令,此指令主要呼叫 helloworld 程式的帳戶公鑰希望向 greeter 帳戶說 Hello

查詢使用過 Hello 交易的 Solana 帳戶

客戶端每次對帳戶說 Hello 時,程式都會在 greeter 帳戶的數據中增加一個計數。客戶端查詢 greeter 帳戶的數據,並透過 reportHellos 查詢此帳戶當前被訪問的次數。

學習鏈上程式

鏈上 HelloWorld 程式 是一個 Rust 程式編譯成 Berkley Packet Format (BPF) 並儲存為可執行和可鏈接格式(ELF)共享對象.

此程式是使用以下程式編寫:

在 Solana 上編寫程式

要了解有關 Solana 程式設計模型的更多訊息,請參閱程式設計模型概述

要了解有關在 Solana 上開發程式的更多訊息,請參閱已部署程式概述

指向公開的 Solana 集群

Solana 有三個公開集群:

  • devnet - 啟用空投的開發者集群
  • testnet - Tour De Sol 沒有空投的測試集群
  • mainnet-beta - 主網集群

使用 npm 指令去選擇集群

選擇 devnet 集群:

$ npm run cluster:devnet

選擇 local 集群:

$ npm run cluster:localnet

透過高級的範例擴展你的技能

還有更多的東西要學習。以下範例展示了更多高級功能,例如自定義錯誤、高級帳戶處理、數據序列化建議、基準測試...等。