Pagde-debug ng Mga Programang Solana
Mayroong ilang mga opsyon at pansuportang tool para sa pagsubok at pag-debug ng isang Solana program.
Mga Katotohanan
Fact Sheet
- Ang crate
solana-program-test
ay nagbibigay-daan sa paggamit ng mga walang laman na buto local runtime kung saan maaari mong subukan at i-debug interactive ang iyong programa (hal. sa vscode). - Ang crate
solana-validator
ay nagbibigay-daan sa paggamit ngsolana-test-validator
na pagpapatupad para sa mas matatag pagsubok na nangyayari sa isang local validator node. Maaari kang tumakbo mula sa editor ngunit breakpoints sa hindi pinapansin ang programa. - Ang CLI tool na
solana-test-validator
ay nagpapatakbo at naglo-load ng iyong programa at nagpoproseso ng pagpapatupad ng transaksyon mula sa command line Rust application o Javascript/Typescript application gamit ang web3. - Para sa lahat ng nasa itaas, ang liberal na paggamit ng
msg!
na macro sa iyong programa ay inirerekomenda sa simula at pagkatapos inaalis ang mga ito habang sinusubok mo at tinitiyak ang solidong gawi. Tandaan na angmsg!
ay gumagamit ng Compute Units na maaaring tuluyang mabigo ang iyong programa sa pamamagitan ng pagpindot sa mga limitasyon ng badyet ng Compute Unit.
Ang mga hakbang sa mga sumusunod na seksyon ay gumagamit ng solana-program-bpf-template. I-clone iyon sa iyo makina:
git clone git@github.com:mvines/solana-bpf-program-template.git
cd solana-bpf-program-template
code .
Runtime Testing at Debugging sa editor
Buksan ang file na src/lib.rs
Makikita mo na ang programa ay medyo simple at karaniwang nag-log lamang ng nilalaman na natanggap ni ang function ng entrypoint ng programa: process_instruction
- Pumunta sa seksyong
#[cfg(test)]
at i-click angRun Tests
. Ito ang bubuo ng programa at pagkatapos isagawa angasync fn test_transaction()
na pagsubok. Makikita mo ang mga log message (pinasimple) sa vscode terminal sa ibaba ang pinagmulan.
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
- Magtakda ng breakpoint sa mga programang
msg!
na linya (11) - Bumalik sa test module, i-click ang
Debug
at sa loob ng ilang segundo ay titigil ang debugger sa breakpoint at ngayon ay maaari mong suriin ang data, hakbang sa pamamagitan ng mga function, atbp.
Ang mga pagsubok na ito ay pinapatakbo din mula sa command line na may: cargo test
o cargo test-bpf
. Siyempre, ang anumang mga breakpoint ay hindi papansinin.
Gaano ka ka-groovy!
Tandaan
Tandaan na hindi ka gumagamit ng validator node kaya ang mga default na programa, blockhashes, atbp. ay hindi kinakatawan o ay hindi kikilos tulad ng gagawin nila kapag tumatakbo sa validator node. Ito ang dahilan kung bakit kami binigyan ng gang sa Solana Pagsubok sa Lokal na Validator Node!
Lokal na Validator Node Testing sa editor
Ang integration testing gamit ang programmatic loading ng isang lokal na validator node ay tinukoy sa tests/integration.rs
file.
Bilang default, ang mga pagsubok sa pagsasama ng template repo ay maipapatakbo lamang mula sa command line gamit ang cargo test-bpf
. Ang mga sumusunod na hakbang ay magbibigay-daan sa iyo na tumakbo sa loob ng editor din bilang pagpapakita ng mga log ng validator ng program at mga output ng msg!
mula sa iyong programa:
- Sa repo directory patakbuhin ang
cargo build-bpf
para buuin ang sample program - Sa editor, buksan ang
tests/integration.rs
- Magkomento sa linya 1 ->
// #![cfg(feature = "test-bpf")]
- Sa linya 19 baguhin ito upang mabasa:
.add_program("target/deploy/bpf_program_template", program_id)
- Ipasok ang sumusunod sa linya 22
solana_logger::setup_with_default("solana_runtime::message=debug");
- I-click ang
Run Test
sa itaas ngtest_validator_transaction()
function
Ilo-load nito ang validator node pagkatapos ay papayagan kang bumuo ng isang transaksyon (ang Rust na paraan) at isumite sa node gamit ang RcpClient
.
Ang output ng programa ay magpi-print din sa terminal ng editor. Halimbawa (pinasimple):
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
Ang pag-debug dito ay magbibigay-daan sa iyong i-debug ang mga function at pamamaraan na ginamit sa test body ngunit gagawin hindi breakpoint sa iyong programa.
The bee's knees eh?
Lokal na Validator Node Testing mula sa Client Apps
Panghuli, maaari kang magsimula ng isang lokal na validating node at i-load ang iyong program at anumang mga account gamit ang solana-test-validator
mula sa command line.
Sa diskarteng ito, kakailanganin mo ng client application gamit ang Rust RcpClient o sa JavaScript o Typescript client
Tingnan ang solana-test-validator --help
para sa higit pang mga detalye at opsyon. Para sa halimbawang programa narito ang pag-setup ng vanilla:
- Magbukas ng terminal sa repo folder
- Patakbuhin ang
solana config set -ul
upang itakda ang configuration upang tumuro sa lokal - Patakbuhin ang
solana-test-validator --bpf-program target/deploy/bpf_program_template-keypair.json target/deploy/bpf_program_template.so
- Magbukas ng isa pang terminal at patakbuhin ang
solana logs
upang simulan ang log streamer - Pagkatapos ay maaari mong patakbuhin ang iyong programa ng kliyente at obserbahan ang output ng programa sa terminal kung saan mo sinimulan ang log streamer
Now that is the cat's pajamas YO!