Debugging Solana Programs
มีทางเลือก และเครื่องมือสนับสนุนมากมายสำหรับทดสอบ และ debugging Solana BPF program.
เรื่องน่ารู้
Fact Sheet
- crate
solana-program-test
จะทำให้ local runtime ของเราสามารถ test และ debug program ได้ (ด้วย vscode). - crate
solana-validator
จะทำให้solana-test-validator
การ test บน local validator node ทำได้ดีขึ้น เราสามารถ run จาก editor ได้ แต่ breakpoints ใน program จะถูกมองข้ามไป. - เครื่องมือ CLI
solana-test-validator
runs, loads program และประมวลผล transaction โดยทำงานผ่าน command line กับ Rust applications หรือ Javascript/Typescript app โดยใช้ web3. - ทั้งหมดที่ว่ามา เราแนะนำให้ใช้ macro
msg!
ใน program ในตอนเริ่ม และเอาอออกเมื่อ test และมั่นใจว่าทำงานถูกแล้วแล้ว จำไว้ว่าmsg!
ใช้ Compute Units ที่ทำให้ program ล้มเหลวได้ถ้าใช้ Compute Unit เกินค่าที่กำหนดไว้.
ขั้นตอนต่อไปเราจะใช้ solana-program-bpf-template. Clone ไปที่เครื่องของเรา:
git clone git@github.com:mvines/solana-bpf-program-template.git
cd solana-bpf-program-template
code .
Runtime Testing และ Debugging ใน editor
เปิด file src/lib.rs
เราจะเห็นว่า program นั้นง่ายและ แค่ logs ตัว content ที่ได้รับมาจาก program entrypoint function: process_instruction
- ไปตรงที่
#[cfg(test)]
และกดRun Tests
มันก็จะ build program และทำการ testasync fn test_transaction()
เราจะเห็น log messages (แบบย่อ)ใน vscode terminal ตามข้างล่างนี้:
running 1 test
"bpf_program_template" program loaded as native code
Program 4uQeVj5tqViQh7yWWGStvkEG1Zmhx6uasJtWCJziofM invoke [1]
Program log: process_instruction: 4uQeVj5tqViQh7yWWGStvkEG1Zmhx6uasJtWCJziofM: 1 accounts, data=[1, 2, 3]
Program 4uQeVj5tqViQh7yWWGStvkEG1Zmhx6uasJtWCJziofM success
test test::test_transaction ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 33.41s
- ตั้ง breakpoint ใน programs ตรง
msg!
ที่บรรทัด (11) - กลับไปที่ test module, กด
Debug
และไม่กี่วินาที debugger จะวิ่งไปหยุดที่ breakpoint และเราก็จะสามารถดู data, หยุดทำ functions ไปทีละขั้น และอื่นๆ..
tests เหล่านี้ยังสามารถ run จาก command line ด้วย: cargo test
หรือ cargo test-bpf
แต่ breakpoints จะถูกข้ามไป
ลองดูว่าเราจะสนุกกับมันได้ถึงไหน!
Note
จำไว้ว่าเราไม่ได้ใช้ validator node ดังนั้น default programs, blockhashes, และอื่นๆ จะไม่มี และมันจะทำตัวไม่เหมือนตอนที่มันทำงานใน validator node. นี่คือสาเหตุว่าทำไมชาว Solana ถึงทำ Local Validator Node testing มาให้เราด้วย!
ทดสอบด้วย Local Validator Node ใน editor
ทดสอบการ integration โดยใช้ local validator node จะถูกประกาศไว้ใน tests/integration.rs
file.
ตามปกติแล้ว template repo integration tests จะ run ได้เฉพาะบน command line ด้วยคำสั่ง cargo test-bpf
ขั้นตอนต่อไปนี้จะทำให้เรา run มันใน editor ได้ด้วย เหมือนที่เราแสดง program validator logs และ msg!
outputs จาก program ของเรา:
- ใน repo directory run
cargo build-bpf
เพื่อ build program ตัวอย่าง - ใน editor, เปิด
tests/integration.rs
- Comment บรรทัดที่ 1 ออก ->
// #![cfg(feature = "test-bpf")]
- ที่บรรทัดที่ 19 เปลี่ยนเป็น:
.add_program("target/deploy/bpf_program_template", program_id)
- แทรก code นี้ลงไปที่บรรทัดที่ 22
solana_logger::setup_with_default("solana_runtime::message=debug");
- กด
Run Test
เหนือtest_validator_transaction()
function
ขั้นตอนดังกล่าวจะ load validator node ให้แล้วจะทำให้เราสร้าง transaction (ด้วย Rust) และส่งไปที่ node โดยใช้ RcpClient
เราจะเห็น program output แสดงอยู่ใน editor terminal ตัวอย่างเช่น (แบบย่อ):
running 1 test
Waiting for fees to stabilize 1...
Waiting for fees to stabilize 2...
Program 4uQeVj5tqViQh7yWWGStvkEG1Zmhx6uasJtWCJziofM invoke [1]
Program log: process_instruction: 4uQeVj5tqViQh7yWWGStvkEG1Zmhx6uasJtWCJziofM: 1 accounts, data=[1, 2, 3]
Program 4uQeVj5tqViQh7yWWGStvkEG1Zmhx6uasJtWCJziofM consumed 13027 of 200000 compute units
Program 4uQeVj5tqViQh7yWWGStvkEG1Zmhx6uasJtWCJziofM success
test test_validator_transaction ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 6.40s
การ Debugging แบบนี้จะทำให้เราสามารถ debug functions และ methods ใน test body ได้แต่จะไม่มี breakpoint ใน program.
มันเจ๋งมากใช่มั้ยล่ะ?
Local Validator Node Testing from Client Apps
และสุดท้ายเราสามารถเปิด local validating node และ load program ของเรา และ accounts ใดๆ เข้าไปโดยใช้ solana-test-validator
จาก command line.
จะทำวิธีนี้ได้เราจะต้องใช้ client application โดยใช้ Rust RcpClient หรือใช้ JavaScript or Typescript clients
ลอง solana-test-validator --help
สำหรับรายละเอียดเพิ่มเติม และตัวเลือกอื่นๆ สำหรับ program ตัวอย่างด้านล่างนี่คือขั้นตอนติดตั้ง:
- เปิด terminal ใน repo folder
- Run
solana config set -ul
เพื่อตั้งค่าตัวเลือกให้ชี้ไปที่ local - Run
solana-test-validator --bpf-program target/deploy/bpf_program_template-keypair.json target/deploy/bpf_program_template.so
- เปิด terminal และ run
solana logs
เพื่อเปิด log streamer - เราสามารถ run client program ของเรา และดู program output ใน terminal ที่เราเปิด log streamer ไว้
นี่มันดีมากเลยนะ!