#hash #solana #verify #programs #verifiable #building #command-line-tool

app solana-verify

构建可验证Solana程序的CLI工具

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

Download history 38/week @ 2024-04-29 31/week @ 2024-05-06 38/week @ 2024-05-13 62/week @ 2024-05-20 72/week @ 2024-05-27 66/week @ 2024-06-03 86/week @ 2024-06-10 87/week @ 2024-06-17 79/week @ 2024-06-24 41/week @ 2024-07-01 19/week @ 2024-07-08 40/week @ 2024-07-15 25/week @ 2024-07-22 40/week @ 2024-07-29 21/week @ 2024-08-05 20/week @ 2024-08-12

每月下载量106

MIT许可协议

76KB
1.5K SLoC

Rust 1K SLoC // 0.0% comments Python 161 SLoC // 0.2% comments Shell 122 SLoC // 0.2% comments

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

注意:需要 --remote 标志才能将验证发送到 OtterSec API。对于本地验证,不需要 --remote 标志。这需要 5-10 分钟才能完成。

依赖项

~76MB
~1.5M SLoC