这是一篇 Solana hello world 教程。我们将引导你完成安装 Solana 的步骤,并对可能出现的问题进行故障排除。
如果你遇到问题,请查看本文末尾的故障排除(Troubleshooting)部分。
安装步骤
安装 Rust
如果你已经安装了 Rust,请跳过此步骤。
# install rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
安装 Yarn
你需要使用它来运行单元测试。如果你已经安装了 yarn,请跳过此步骤。
# install yarn -- assumes node js is installed
corepack enable # corepack comes with node js
安装 Solana cli 和 Anchor
# install solana
curl --proto '=https' --tlsv1.2 -sSfL https://solana-install.solana.workers.dev | bash
安装 Anchor
Anchor 是一个用于 Solana 开发的框架。在许多方面,它与 hardhat 非常相似。
# install anchor
cargo install --git https://github.com/solana-foundation/anchor avm --force
avm install latest
avm use latest
测试安装
初始化并构建 Anchor Program(用于 hello world)
Mac 用户: 我们建议将你的程序命名为 day_1 而不是 day1,因为 Anchor 有时似乎会在 Mac 机器上静默插入下划线。
anchor init day1 # use day_1 if you have a mac
cd day1
anchor build
根据你的机器和网络连接情况,此步骤可能需要一些时间。这也是你很可能遇到安装问题的地方,因此如有必要,请参阅故障排除部分。
配置 Solana 在 localhost 上运行
# shell 1
solana config set --url localhost
运行测试验证节点
在一个新的 shell 中运行以下命令,而不是在 Anchor 项目中运行。但请不要关闭运行了 anchor build 的 shell。这将在你的机器上运行一个本地(测试)Solana 节点实例:
# shell 2
solana-test-validator
确保 program_id 与 Anchor 密钥同步
回到带有 Anchor 项目的 shell,并运行以下命令:
# shell 1
anchor keys sync
运行测试
在 Anchor 项目中运行此命令
# shell 1
anchor test --skip-local-validator
上面的命令会为我们的程序运行测试。如果你还没有创建测试钱包,Anchor 会给出如何创建的说明。我们在此不提供这些说明,因为这将取决于你的操作系统和文件结构。你可能还需要在终端中运行 solana airdrop 100 {YOUR_WALLET_ADDRESS} 来为自己空投一些本地 Sol。你可以通过在命令行中运行 solana address 来获取你的钱包地址。
预期输出如下:

Hello World
现在让我们让程序输出 “Hello, world!”。将标记有 ****NEW LINE HERE**** 的以下代码行添加到 programs/day_1/src/lib.rs 中。
use anchor_lang::prelude::*;
declare_id!("...");
#[program]
pub mod day_1 {
use super::*;
pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
msg!("Hello, world!"); // **** NEW LINE HERE ****
Ok(())
}
}
#[derive(Accounts)]
pub struct Initialize {}
在再次运行测试之前,终止本地验证器进程并使用以下命令重启它:
solana-test-validator --reset
再次运行测试
anchor test --skip-local-validator
通过运行以下命令找到日志文件
ls .anchor/program-logs/
打开该文件以查看记录的 “Hello world”

实时 Solana 日志
或者,你可以打开第三个 shell 并运行以下命令来实时查看日志:
# shell 3
solana logs
现在再次运行测试,你应该会在运行了 solana logs 的终端中看到相同的消息。
问答
为什么 declare_id! 和 msg! 后面有感叹号?
在 Rust 中,感叹号表示这些是宏(macros)。我们将在后面的教程中重新探讨宏。
我需要一个 initialize 函数吗?
不需要,那是 Anchor 框架自动生成的。你可以把它命名为任何你喜欢的名字。
在当前上下文中,名称 initialize 并没有什么特别之处,因此我们可以将其更改为任何我们喜欢的名称。这与一些其他关键字和语言不同,例如 main 在某些语言中是一个特殊的名称,或者 constructor 在 Solidity 中是一个特殊的名称。
练习:尝试将 programs/day_1/src/lib.rs 中的 initialize 和 tests/day_1.ts 中的 initialize 重命名为 initialize2,然后再次运行测试。查看下方橙色圆圈中标记的更改。

为什么我们在运行测试时使用 --skip-local-validator?
当测试针对节点运行时,我们将能够查询节点的状态更改。如果你无法使节点运行,不使用 --skip-local-validator 标志来运行 anchor test 也是可以的。然而,这会让你的开发和测试变得更加困难,因此我们建议让本地验证器正常工作。
故障排除
Solana 是一个快速发展的软件,你可能会遇到安装问题。我们在以下小节中记录了你最可能遇到的问题。
本系列教程是基于以下版本编写的:
- Anchor = version 0.29.0
- Solana = version 1.16.25
- Rustc = 1.77.0-nightly
你可以通过运行以下命令来更改 Anchor 版本:
avm install 0.29.0
avm use 0.29.0
error: package solana-program v1.18.0 cannot be built
error: package `solana-program v1.18.0` cannot be built because it requires rustc 1.72.0 or newer, while the currently active rustc version is 1.68.0-dev
Either upgrade to rustc 1.72.0 or newer, or use
cargo update -p solana-program@1.18.0 --precise ver
使用 solana --version 检查你正在运行的 Solana 版本。然后将该版本代入上方的 ver 中。下面展示了一个示例解决方案:

error[E0658]: use of unstable library feature ‘build_hasher_simple_hash_one’
如果你遇到以下错误:
error[E0658]: use of unstable library feature 'build_hasher_simple_hash_one'
--> src/random_state.rs:463:5
|
463 | / fn hash_one<T: Hash>(&self, x: T) -> u64 {
464 | | RandomState::hash_one(self, x)
465 | | }
| |_____^
|
= note: see issue #86161 https://github.com/rust-lang/rust/issues/86161 for more information
= help: add #![feature(build_hasher_simple_hash_one)] to the crate attributes to enable
运行以下命令:cargo update -p ahash@0.8.7 --precise 0.8.6。
Credit:https://solana.stackexchange.com/questions/8800/cant-build-hello-world
Error: Deploying program failed: Error processing Instruction 1: custom program error: 0x1
Error: Deploying program failed: Error processing Instruction 1: custom program error: 0x1
There was a problem deploying: Output { status: ExitStatus(unix_wait_status(256)), stdout: "", stderr: "" }.
如果你遇到此错误,说明你的密钥未同步。请运行 anchor keys sync。
Error: failed to send transaction: Transaction simulation failed: Attempt to load a program that does not exist
你的密钥未同步。请运行 anchor keys sync。
Error: Your configured rpc port: 8899 is already in use
你在验证器于后台运行的同时,运行了没有带有 --skip-local-validator 的 anchor test。你要么关闭验证器并运行 anchor test,要么在验证器运行的情况下运行 anchor test --skip-local-validator。跳过本地验证器是指跳过它为项目创建的临时验证器,而不是跳过后台运行的那个。
Error: Account J7t…zjK has insufficient funds for spend
运行以下命令将 100 SOL 空投到你的开发地址:
solana airdrop 100 J7t...zjK
Error: RPC request error: cluster version query failed
Error: RPC request error: cluster version query failed: error sending request for url (http://localhost:8899/): error trying to connect: tcp connect error: Connection refused (os error 61)
There was a problem deploying: Output { status: ExitStatus(unix_wait_status(256)), stdout: "", stderr: "" }.
这意味着 solana-test-validator 没有在后台运行。请在另一个 shell 中运行 solana-test-validator。
thread ‘main’ panicked at ‘called Option::unwrap() on a None value’
thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', /Users/username/.cargo/git/checkouts/anchor-50c4b9c8b5e0501f/347c225/lang/syn/src/idl/file.rs:214:73
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
很可能你还没有运行 anchor build。
我使用的是 Mac 并且遇到错误:Error: failed to start validator: Failed to create ledger at test-ledger: blockstore error
请遵循此 Stack Exchange 帖子 中的说明。
尽管有 node.js,但我的 Mac 上没有 corepack
运行以下命令:
brew install corepack
brew link --overwrite corepack
error: not a directory:
BPF SDK: /Users/rareskills/.local/share/solana/install/releases/stable-43daa37937907c10099e30af10a5a0b43e2dd2fe/solana-release/bin/sdk/bpf
cargo-build-bpf child: rustup toolchain list -v
cargo-build-bpf child: rustup toolchain link bpf /Users/rareskills/.local/share/solana/install/releases/stable-43daa37937907c10099e30af10a5a0b43e2dd2fe/solana-release/bin/sdk/bpf/dependencies/bpf-tools/rust
error: not a directory:
清除缓存:运行 rm -rf ~/.cache/solana/*。
Error: target/idl/day_1.json doesn’t exist. Did you run anchor build?
创建一个新项目并将其命名为 day_1 而不是 day1。Anchor 似乎会在某些机器上静默插入下划线。
在 RareSkills 上学习更多
本教程是我们免费 Solana Course 中的第一课。
首发于 2024 年 2 月 8 日