# learn-solana **Repository Path**: nextuser/learn-solana ## Basic Information - **Project Name**: learn-solana - **Description**: solana 学习 - **Primary Language**: JavaScript - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-05 - **Last Updated**: 2025-11-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 概述 这个例子提供了调用solana 上部署的一个Counter, 以及通过typescript 客户端调用Solana合约Counter ## 1. RUST 工程开发和部署 ### 1.1 配置cargo 输出路径, 方便管理target, - 原因:因为target往往占用空间比较大,每个项目都有target目录,导致占用空间的目录太分散,不好清理 - 方法: - 修改文件 ~/.bashrc ```shell export CARGO_TARGET_DIR=~/.target export PATH=$PATH:~/.target/release:~/.target/debug ``` - 验证, 清理.target之后,重新编译,查看.target目录 ```bash cargo clean ls -al ~/.target cargo build ls -al ~/.target ``` ### 1.2 构建项目 ```bash cargo build-sbf ls ~/.target/deploy ``` ### 1.3 部署项目 rust 提供了一个rust counter程序,可以部署到solana网络 ```bash solana program deploy ~/.target/deploy/counter_program.so ``` ## 2 client nodejs 模块,调用counter程序测试 ### 2.1 npm 版本说明 - 构造用户账号first,second, 并且获得airdrop ```bash nvm use 18.20.8 npm run build ``` ### 2.2 配置当前solana环境 #### 2.2.1 env配置 可以配置到client/.env下面 需要配置成localnet或devnet ```bash ljl@ljl-lenovo:learn-solana$ cat client/.env export SOLANA_ENV=localnet ``` #### 2.2.2 localnet测试 需要运行一个节点 ```bash solana-test-validator ``` #### 2.2.3 devnet配置 devent可以从helius注册一个apikey, 可以把这个环境变量配置到client/.env 里面 ```bash export HELIUS_API_KEY=${yourKey} ``` ### 2.3 代码说明 #### 2.3.1 [地址生成](./client/src/0.create_data.ts) - 命令创建目录.key - 生成两个用户first,second ,保存secretkey 在~/.key/first.json 和 ~/.key/second.json - 创建counter程序需要的输入输入数据地址key ~/.key/pda.json - 调用Counter, #### 2.3.2 [分配空间并且调用Counter](./client/src/1.create_and_call.ts) - 计算租用空间需要的lamports - 创建pda地址对应的空间, 使用first 和 pda 调用counter #### 2.3.3 [first用户 再次调用Counter](./client/src/2.call.ts) - 使用first 和 pda 调用counter #### 2.3.4 [second用户 调用Counter](./client/src/3.call_by_other_account.ts) ## 3 使用其他程序访问PDA地址,修改数据 ### 3.1 新程序说明 ### 3.2部署新的的程序 ```bash ljl@ljl-lenovo:update$ solana program deploy ~/.target/deploy/counter_program.so Program Id: BTNheJyGqcb8cMNcEx2GF1zLNRHigHYMGZ9VdWPWh7kE Signature: 3pPzt7YDjFHR9Kf9Q3DXWdHu5sX6qCNd9bNCi32SbRmwPW6dg5dubMVGS6BHmUfgRGWWKvkw5by2F5cPnXqExAZZ ljl@ljl-lenovo:update$ solana program deploy ~/.target/deploy/update_account.so Program Id: 6JhVJe6sWG6LqfzpfB9Q4LD5CTAiPBTFSSk6YssKzzBy Signature: 2fZen3h1SQBaVHt73MqxFksdeUMLxa3ApMctqJHRJjdUGFEEA4cKYBt7yxf9vtK3UFYtirnAwT4MfZoUZFaV88vN ``` ### 3.3 测试用新程序 ### 新程序说明 因为新程序update 需要访问counter 相同的数据结构,因此增加一个公共数据结构data项目,GreetingAccount 定义在data/src/lib.rs ```bash ljl@ljl-lenovo:learn-solana$ tree -L 3 ./rust ./rust ├── Cargo.lock ├── Cargo.toml └── programs ├── counter │ ├── Cargo.lock │ ├── Cargo.toml │ ├── src │ └── tests ├── data │ ├── Cargo.toml │ └── src └── update ├── Cargo.toml └── src ``` ### 3.4 新程序执行结果 ```shell call program data: 2gPtMYTMsZupoQUGfQaN7sfjaJ4pd8ScTgRL2xEGCpvA /mnt/d/work/rust/solana/learn-solana/client/node_modules/@solana/web3.js/src/connection.ts:6053 throw new SendTransactionError({ ^ SendTransactionError: Simulation failed. Message: Transaction simulation failed: Error processing Instruction 0: instruction modified data of an account it does not own. Logs: [ "Program 6JhVJe6sWG6LqfzpfB9Q4LD5CTAiPBTFSSk6YssKzzBy invoke [1]", "Program log: Hello World Rust program entrypoint", "Program 6JhVJe6sWG6LqfzpfB9Q4LD5CTAiPBTFSSk6YssKzzBy consumed 432 of 200000 compute units", "Program 6JhVJe6sWG6LqfzpfB9Q4LD5CTAiPBTFSSk6YssKzzBy failed: instruction modified data of an account it does not own" ]. Catch the `SendTransactionError` and call `getLogs()` on it for full details. at Connection.sendEncodedTransaction (/mnt/d/work/rust/solana/learn-solana/client/node_modules/@solana/web3.js/src/connection.ts:6053:13) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at Connection.sendRawTransaction (/mnt/d/work/rust/solana/learn-solana/client/node_modules/@solana/web3.js/src/connection.ts:6009:20) at Connection.sendTransaction (/mnt/d/work/rust/solana/learn-solana/client/node_modules/@solana/web3.js/src/connection.ts:5997:12) at Object.sendAndConfirmTransaction (/mnt/d/work/rust/solana/learn-solana/client/node_modules/@solana/web3.js/src/utils/send-and-confirm-transaction.ts:36:21) at call_nextime (/mnt/d/work/rust/solana/learn-solana/client/src/client.ts:154:20) { signature: '', transactionMessage: 'Transaction simulation failed: Error processing Instruction 0: instruction modified data of an account it does not own', transactionLogs: [ 'Program 6JhVJe6sWG6LqfzpfB9Q4LD5CTAiPBTFSSk6YssKzzBy invoke [1]', 'Program log: Hello World Rust program entrypoint', 'Program 6JhVJe6sWG6LqfzpfB9Q4LD5CTAiPBTFSSk6YssKzzBy consumed 432 of 200000 compute units', 'Program 6JhVJe6sWG6LqfzpfB9Q4LD5CTAiPBTFSSk6YssKzzBy failed: instruction modified data of an account it does not own' ] } ```