11个版本
0.2.11 | 2024年4月16日 |
---|---|
0.2.10 | 2024年4月16日 |
0.2.8 | 2024年2月21日 |
0.2.7 | 2023年12月5日 |
0.2.3 | 2023年7月10日 |
在 #verifiable 中排名第39
每月下载量106次
76KB
1.5K SLoC
Solana Verify CLI
一个用于构建和验证solana程序的命令行工具。用户可以确保链上程序的哈希值与给定代码库中程序的哈希值匹配。
安装
为了使此CLI正常运行,您必须在计算机上安装docker
。按照以下步骤操作:[安装Docker](https://docs.docker.net.cn/engine/install/)(根据您的平台)
安装完成后,请确保服务器已启动:([启动Docker服务](https://docs.docker.net.cn/config/daemon/start/))
如果您还没有安装,您还需要安装Cargo。
在您的shell中运行以下命令以安装它(或访问[https://rustup.rs/](https://rustup.rs/))
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
最后,要安装Solana Verify CLI,请在您的shell中运行以下命令
# Pulls the latest version from crates.io
cargo install solana-verify
如果您想锁定版本
# Pulls the latest version from crates.io
cargo install solana-verify --version $VERSION
如果您非常小心,并想安装与特定提交一一对应的二进制版本,请运行以下命令。此示例安装了版本0.2.6,版本号为13a1db2
# Pulls the source from git. Change the argument to --rev to the desired commit
cargo install solana-verify --git https://github.com/Ellipsis-Labs/solana-verifiable-build --rev 13a1db2
构建可验证程序
要可验证地构建您的Solana程序,请转到包含Cargo.toml文件的工作区目录,并运行以下命令
solana-verify build
如果您在包含多个程序的仓库中工作,要构建特定程序,请运行以下命令$PROGRAM_LIB_NAME
solana-verify build --library-name $PROGRAM_LIB_NAME
传入的字符串必须是lib名称,而不是package名称。这些通常是相同的,但区分很重要。(![图片](https://img.gs/czjpqfbdkz/full/https://github.com/Ellipsis-Labs/solana-verifiable-build/assets/61092285/0427e88f-cc0f-465f-b2e9-747ea1b8d3af))
(注意:如果您在M1 Macbook Pro上运行,这些命令可能需要长达30分钟。这与确保构建确定性所需的架构仿真有关。为了最佳性能,建议在运行x86的Linux机器上运行构建。)
现在,您可以通过运行以下命令打印程序的可执行文件哈希值
solana-verify get-executable-hash target/deploy/$PROGRAM_LIB_NAME.so
部署可验证程序
当构建完成后,位于 target/deploy/$PROGRAM_LIB_NAME.so
的可执行文件将包含上传到网络中的缓冲区。
为了直接将程序上传到链(不推荐),请运行以下命令
solana program deploy -u $NETWORK_URL target/deploy/$PROGRAM_LIB_NAME.so --program-id $PROGRAM_ID --upgrade-authority $UPGRADE_AUTHORITY
与任何正常部署相同的注意事项适用。有关更多详细信息,请参阅 Solana 文档。
上传完成后,您可以验证程序哈希与上一步计算的执行文件哈希匹配
solana-verify get-program-hash -u $NETWORK_URL $PROGRAM_ID
部署程序的推荐方法是使用 Squads V3。
要升级可验证构建,运行以下命令上传程序缓冲区
solana program write-buffer -u $NETWORK_URL target/deploy/$PROGRAM_LIB_NAME.so
该命令将输出一个 $BUFFER_ADDRESS. 在投票升级程序之前,请验证以下命令生成的哈希与执行文件哈希相同(由上一步构建而来)
solana-verify get-buffer-hash -u $NETWORK_URL $BUFFER_ADDRESS
主网验证程序
凤凰
solana-verify verify-from-repo -um --program-id PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY https://github.com/Ellipsis-Labs/phoenix-v1
最终输出
Executable Program Hash from repo: 7c76ba11f8742d040b1a874d943c2096f1b3a48db14d2a5b411fd5dad5d1bc2d
On-chain Program Hash: 7c76ba11f8742d040b1a874d943c2096f1b3a48db14d2a5b411fd5dad5d1bc2d
Program hash matches ✅
Squads V3
solana-verify verify-from-repo https://github.com/Squads-Protocol/squads-mpl --commit-hash c95b7673d616c377a349ca424261872dfcf8b19d --program-id SMPLecH534NA9acpos4G6x7uf3LWbCAwZQE9e8ZekMu -um --library-name squads_mpl --bpf
(注意:我们需要指定 library-name
,因为 Squads 存储库包含多个程序。我们使用 --bpf
标志,因为 squads_mpl
之前已通过 Anchor 验证。)
最终输出
Executable Program Hash from repo: 72da599d9ee14b2a03a23ccfa6f06d53eea4a00825ad2191929cbd78fb69205c
On-chain Program Hash: 72da599d9ee14b2a03a23ccfa6f06d53eea4a00825ad2191929cbd78fb69205c
Program hash matches ✅
Drift V2
solana-verify verify-from-repo -um --program-id dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH https://github.com/drift-labs/protocol-v2 --commit-hash 110d3ff4f8ba07c178d69f9bfc7b30194fac56d6 --library-name drift
最终输出
Executable Program Hash from repo: e31d58edeabc3c30bf6f2aa60bfaa5e492b41ec203e9006404b463e5adee5828
On-chain Program Hash: e31d58edeabc3c30bf6f2aa60bfaa5e492b41ec203e9006404b463e5adee5828
Program hash matches ✅
Marginfi V2
solana-verify verify-from-repo -um --program-id MFv2hWf31Z9kbCa1snEPYctwafyhdvnV7FZnsebVacA https://github.com/mrgnlabs/marginfi-v2 --library-name marginfi -- --features mainnet-beta
最终输出
Executable Program Hash from repo: 7b37482dd6b2159932b5c2595bc6ce62cf6e587ae67f237c8152b802bf7d7bb8
On-chain Program Hash: 7b37482dd6b2159932b5c2595bc6ce62cf6e587ae67f237c8152b802bf7d7bb8
Program hash matches ✅
Solend
solana-verify verify-from-repo -um --program-id So1endDq2YkqhipRh3WViPa8hdiSpxWy6z3Z6tMCpAo https://github.com/solendprotocol/solana-program-library --library-name solend_program -b ellipsislabs/solana:1.14.10 --bpf
最终输出
Executable Program Hash from repo: f89a43677ab106d2e50d3c41b656d067b6142c02a2508caca1c11c0a963d3b17
On-chain Program Hash: f89a43677ab106d2e50d3c41b656d067b6142c02a2508caca1c11c0a963d3b17
Program hash matches ✅
示例说明
安装 CLI 后,我们可以测试程序验证,针对以下不可变主网程序: 2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn
查看这里: https://solana.fm/address/2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn?cluster=mainnet-qn1
使用 Docker 进行验证
运行以下命令
solana-verify verify-from-image -e examples/hello_world/target/deploy/hello_world.so -i ellipsislabs/hello_world_verifiable_build:latest -p 2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn
该命令加载存储在 ellipsislabs/hello_world_verifiable_build:latest 的镜像,并验证容器中执行路径的哈希与命令提供的链上程序哈希相同。因为构建已经上传到镜像中,所以不需要重新构建执行文件,这将花费非常长的时间。
创建镜像的 Dockerfile 可以在该存储库的 ./examples/hello_world 下找到。
以下是预期的输出
Verifying image: "ellipsislabs/hello_world_verifiable_build:latest", on network "https://api.mainnet-beta.solana.com" against program ID 2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn
Executable path in container: "examples/hello_world/target/deploy/hello_world.so"
Executable hash: 08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760
Program hash: 08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760
Executable matches on-chain program data ✅
手动验证
要获取链上程序的哈希,我们可以使用以下命令并给定程序 ID
solana-verify get-program-hash 2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn
它将返回以下哈希
08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760
默认情况下,此命令将从程序执行文件中移除任何尾随零,并对其实施 sha256 算法以计算哈希。
要手动验证此程序,可以从该存储库的根目录运行以下命令,该命令从源代码构建程序并计算哈希。 此命令需要很长时间,因为它在 Docker 容器中构建二进制文件
solana-verify build $PWD/examples/hello_world
现在我们可以检查构建的结果哈希。
solana-verify get-executable-hash ./examples/hello_world/target/deploy/hello_world.so
它将返回剥离的执行文件哈希,该哈希应与从区块链检索到的程序数据哈希匹配。
08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760
将验证发送到 OtterSec API
solana-verify verify-from-repo --remote -um --program-id PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY https://github.com/Ellipsis-Labs/phoenix-v1
- 此验证将发送到 OtterSec API,可在 https://verify.osec.io/status 查找
注意:需要
--remote
标志才能将验证发送到 OtterSec API。对于本地验证,不需要--remote
标志。这需要 5-10 分钟才能完成。
依赖项
~76MB
~1.5M SLoC