前言
本文為「Solana 開發者的入門指南」影片的學習筆記。
建立專案
使用 cargo
指令,初始化一個 solana-escrow
專案。
1 | cargo new solana-escrow --lib |
進到專案。
1 | cd solana-escrow |
實作後端
更新 Cargo.toml
檔。
1 | [package] |
新增主要模組如下:
1 | touch src/entrypoint.rs \ |
更新 lib.rs
檔如下:
1 | pub mod entrypoint; |
更新 instruction.rs
檔,新增 InitEscrow
到列舉中。
1 | use std::convert::TryInto; |
更新 error.rs
檔。
1 | use thiserror::Error; |
更新 processor.rs
檔,尚未實作完全:
1 | use solana_program::{ |
更新 state.rs
檔。
1 | use solana_program::{ |
更新 processor.rs
檔,完成實作:
1 | use solana_program::{ |
更新 entrypoint.rs
檔。
1 | use solana_program::{ |
試著使用 cargo
指令進行編譯。
1 | cargo build-bpf |
更新 instruction.rs
檔,新增 Exchange
到列舉中。
1 | use crate::error::EscrowError::InvalidInstruction; |
更新 processor.rs
檔。
1 | use solana_program::{ |
更新 error.rs
檔。
1 | use solana_program::program_error::ProgramError; |
試著使用 cargo
指令進行編譯。
1 | cargo build-bpf |
啟動節點
開啟一個新的終端視窗,使用 solana-test-validator
指令,啟動一個本地的 Solana 節點。
1 | solana-test-validator |
更新 .gitignore
檔。
1 | /target |
建立公私鑰
新增 keys
資料夾及相關檔案。
1 | mkdir keys && |
使用 solana-keygen
指令為程式建立一組公私鑰。
1 | solana-keygen new -o keys/id.json |
使用以下指令印出公鑰。
1 | solana address -k keys/id.json |
將公鑰手動複製到 id_pub.json
檔:
1 | "9rRRFELbLfWuxSeCsDeqSd9Lv6Bhv7xhGoKyBkfMU74Z" |
使用 solana-keygen
指令使用者 Alice 建立一組公私鑰。
1 | solana-keygen new -o keys/alice.json |
使用以下指令印出公鑰。
1 | solana address -k keys/alice.json |
將公鑰手動複製到 alice_pub.json
檔:
1 | "HTt2B7bWXfiTAY2z2TLvKPyRJMM7BTZ5yZcHAXf6Dmnk" |
使用 solana-keygen
指令使用者 Bob 建立一組公私鑰。
1 | solana-keygen new -o keys/bob.json |
使用以下指令印出公鑰。
1 | solana address -k keys/bob.json |
將公鑰手動複製到 bob_pub.json
檔:
1 | "CYHvpgywtnbwzdSGYX29fPnMG46EijQbSXrit6wXqfR6" |
實作前端
使用 npm
指令初始化專案。
1 | npm init -y |
安裝依賴套件。
1 | npm install --save @solana/[email protected] @solana/web3.js @types/bn.js |
安裝 TypeScript。
1 | npm install -g typescript |
使用 tsc
指令初始化專案。
1 | tsc --init |
更新 .gitignore
檔。
1 | /target |
新增 ts
資料夾及相關檔案。
1 | mkdir ts && |
修改 utils.ts
檔。
1 | import { |
修改 setup.ts
檔。
1 | import { Connection, Keypair, PublicKey } from "@solana/web3.js"; |
修改 alice.ts
檔。
1 | import { AccountLayout, Token, TOKEN_PROGRAM_ID } from "@solana/spl-token"; |
修改 bob.ts
檔。
1 | import { TOKEN_PROGRAM_ID } from "@solana/spl-token"; |
設置參數
新增 terms.json
檔。
1 | touch terms.json |
更新 terms.json
檔,設定使用者 Alice 與 Bob 各自期望的金額。
1 | { |
充值
使用以下指令為程式充值,以程式的公鑰做為目標。
1 | solana transfer 9rRRFELbLfWuxSeCsDeqSd9Lv6Bhv7xhGoKyBkfMU74Z 100 --allow-unfunded-recipient |
輸出結果如下:
1 | Signature: mhqm5AA5v8a5KABCR9Poj68Ranzms8ahq47zhdN3uQetYck68H42N1NNyxLpAQbU8pBWziPEN1nZqbY6GeP3Ldc |
部署
部署 solana_escrow
鏈上程式。
1 | solana program deploy target/deploy/solana_escrow.so |
輸出結果如下:
1 | Program Id: FWwUWeewacUBg3tU6mT8xSCbkeLhTLves6VGJtFXaatj |
將 Program ID 更新到 program_pub.json
檔:
1 | "FWwUWeewacUBg3tU6mT8xSCbkeLhTLves6VGJtFXaatj" |
執行腳本
使用 ts-node
指令執行 setup.ts
腳本。
1 | ts-node ts/setup.ts |
輸出結果如下:
1 | Requesting SOL for Alice... |
使用 ts-node
指令執行 alice.ts
腳本。
1 | ts-node ts/alice.ts |
輸出結果如下:
1 | Sending Alice's transaction... |
使用 ts-node
指令執行 bob.ts
腳本。
1 | ts-node ts/bob.ts |
輸出結果如下:
1 | Sending Bob's transaction... |