Tài liệu SolanaPhát triển chương trình

Xác minh chương trình

Hướng dẫn này được thiết kế như một tài liệu tham khảo cho các nhà phát triển muốn triển khai bản dựng đã xác minh cho chương trình của họ trên Solana. Chúng ta sẽ tìm hiểu về bản dựng đã xác minh là gì, cách sử dụng chúng, những cân nhắc đặc biệt và các phương pháp tốt nhất để đảm bảo tính xác thực của chương trình của bạn trên chuỗi.

Bản dựng đã xác minh là gì?

Bản dựng đã xác minh đảm bảo rằng chương trình thực thi mà bạn triển khai lên mạng Solana khớp với mã nguồn trong kho lưu trữ của bạn. Bằng cách này, các nhà phát triển và người dùng có thể tin tưởng rằng chương trình đang chạy trên chuỗi tương ứng chính xác với cơ sở mã công khai, thúc đẩy tính minh bạch và bảo mật.

Quá trình xác minh bao gồm việc so sánh mã băm của chương trình trên chuỗi với mã băm của chương trình được xây dựng cục bộ từ mã nguồn. Điều này đảm bảo không có sự khác biệt giữa hai phiên bản.

Mặc dù một bản dựng đã xác minh không nên được coi là an toàn hơn một bản dựng chưa xác minh, bản dựng cho phép các nhà phát triển tự xác minh rằng mã nguồn khớp với những gì được triển khai trên chuỗi. Sử dụng mã nguồn, nhà phát triển có thể xác nhận những gì mã thực thi khi gửi một giao dịch.

Quy trình bản dựng đã xác minh được phát triển và duy trì bởi Ellipsis LabsOtterSec. Để biết thêm chi tiết, hãy làm theo hướng dẫn trong kho lưu trữ bản dựng đã xác minh gốc cũng như quy trình xác minh bản dựng trực tiếp vào bộ công cụ Anza, khi được hỗ trợ.

Nó hoạt động như thế nào?

Quá trình xác minh được thực hiện bằng cách so sánh mã băm của chương trình trên chuỗi với mã băm của chương trình được xây dựng cục bộ từ mã nguồn. Bạn xây dựng chương trình trong môi trường được kiểm soát bằng cách sử dụng Solana Verify CLI và Docker. Điều này đảm bảo quá trình xây dựng có tính xác định và nhất quán trên các hệ thống khác nhau. Khi đã có tệp thực thi, bạn có thể triển khai nó lên mạng Solana. Trong quá trình xây dựng, một PDA của chương trình xác minh sẽ được tạo ra. PDA này chứa tất cả dữ liệu cần thiết để xác minh chương trình. PDA chứa địa chỉ chương trình, url git, mã băm commit và các đối số được sử dụng để xây dựng chương trình.

Sử dụng dữ liệu trong PDA, mọi người có thể chạy lệnh chương trình xác minh cục bộ và kiểm tra xem chương trình có được xây dựng từ mã nguồn đã cung cấp hay không. Sau đó, mọi người có thể tự xác minh hoàn toàn không cần tin tưởng hoặc có thể chạy API xác minh riêng của họ được duy trì bởi OtterSec để cung cấp điểm truy cập dễ dàng cho người dùng kiểm tra việc xác minh. Bạn đã có thể thấy các cuộc gọi API này được sử dụng trong Solana ExplorerSolanaFM, cùng nhiều nơi khác.

Tại sao tôi nên sử dụng bản dựng đã xác minh?

Sử dụng bản dựng đã xác minh mang lại những lợi ích sau:

  • Bảo mật: Đảm bảo rằng chương trình đang chạy trên chuỗi khớp với mã nguồn, ngăn chặn các thay đổi độc hại.

  • Minh bạch: Cho phép người dùng và nhà phát triển khác xác nhận rằng chương trình trên chuỗi là đáng tin cậy bằng cách so sánh với cơ sở mã công khai.

  • Tin cậy: Tăng sự tin tưởng của người dùng, vì bản dựng đã xác minh chứng minh rằng hành vi trên chuỗi của chương trình của bạn phù hợp với mã công khai của bạn. Khi xây dựng các chương trình có thể xác minh, bạn giảm thiểu rủi ro liên quan đến việc chạy mã không được ủy quyền hoặc độc hại. Nó cũng đảm bảo bạn tuân thủ các phương pháp tốt nhất và cung cấp cho các nhà nghiên cứu bảo mật cách dễ dàng để liên hệ với bạn. Ngoài ra, các ví và công cụ khác có thể cho phép giao dịch từ chương trình của bạn dễ dàng hơn miễn là nó đã được xác minh.

  • Khả năng khám phá: Khi bạn cung cấp bản build đã được xác minh của chương trình, mọi người có thể tìm thấy mã nguồn, tài liệu, SDK hoặc IDL của chương trình và họ cũng có thể dễ dàng liên hệ với bạn qua github trong trường hợp có vấn đề.

Làm thế nào để tạo các bản build đã xác minh?

Để tạo các bản build đã xác minh, bạn cần thực hiện các bước sau:

Tóm tắt:

  • Commit mã của bạn vào kho lưu trữ công khai
  • Xây dựng bản build đã xác minh trong docker
  • Triển khai bản build đã xác minh
  • Xác minh chương trình đã triển khai với API công khai

Nếu bạn xác minh chương trình không được xây dựng trong container docker, nó sẽ rất có thể thất bại vì các bản build chương trình Solana không mang tính xác định trên các hệ thống khác nhau.

Cài đặt Docker và Cargo

Cài đặt các công cụ cần thiết, đảm bảo bạn đã cài đặt Docker và Cargo. Docker cung cấp môi trường xây dựng có kiểm soát để đảm bảo tính nhất quán, và Cargo được sử dụng để quản lý các gói Rust.

  • Docker: Làm theo các bước trên trang web Docker để cài đặt Docker cho nền tảng của bạn. Sau khi cài đặt, đảm bảo dịch vụ Docker đang chạy theo hướng dẫn tiếp theo.
  • Cargo: Nếu bạn chưa cài đặt Cargo, bạn có thể cài đặt bằng cách chạy lệnh sau:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Cài đặt Solana Verify CLI

Solana Verify CLI là công cụ chính được sử dụng để xác minh các bản build. Solana Verify CLI hiện đang được duy trì bởi Ellipsis Labs và có thể được cài đặt bằng Cargo.

Bạn có thể cài đặt bằng cách chạy:

cargo install solana-verify

Nếu bạn cần một phiên bản cụ thể của CLI, bạn có thể ghim phiên bản với:

cargo install solana-verify --version $VERSION

Nếu muốn, bạn có thể cài đặt phiên bản trực tiếp từ một commit cụ thể:

cargo install solana-verify --git https://github.com/Ellipsis-Labs/solana-verifiable-build --rev 13a1db2

Chuẩn bị dự án

Để xác minh với một repository, nó cần có file Cargo.lock trong thư mục gốc của repository. Nếu bạn chỉ có một chương trình trong repository và có file cargo.lock ở thư mục gốc, bạn có thể chuyển trực tiếp sang bước tiếp theo và build chương trình.

Nếu chương trình của bạn nằm trong thư mục con và bạn có rust workspace, bạn cần tạo file Cargo.toml workspace trong thư mục gốc của repository.

Bạn có thể sử dụng ví dụ Cargo.toml này làm mẫu:

Cargo.toml
[workspace]
members = ["program/programs/*"]
resolver = "2"
[profile.release]
overflow-checks = true
lto = "fat"
codegen-units = 1
[profile.release.build-override]
opt-level = 3
incremental = false
codegen-units = 1

Đảm bảo rằng chương trình của bạn nằm trong mảng workspace/membersCargo.toml của chương trình có tên lib được cấu hình đúng.

Quan trọng là lib name chứ không phải tên package!

Một cái gì đó như thế này:

waffle/Cargo.toml
[package]
name = "waffle"
version = "0.1.0"
edition = "2021"
[lib]
name = "waffle"
crate-type = ["cdylib", "lib"]
[dependencies]
solana-program = "2.1.0"

Trong repository này, bạn có thể xem ví dụ về workspace với chương trình trong thư mục con. Lưu ý rằng khi chương trình nằm trong thư mục con, sau này bạn cần thêm thư mục này làm --mount-path vào lệnh verify-from-repo.

Trong kho lưu trữ này, bạn có thể tìm thấy một ví dụ về Anchor. Trong kho lưu trữ này, bạn có thể tìm thấy một ví dụ về Rust gốc.

Với file Cargo.toml này, bạn có thể chạy cargo generate-lockfile để tạo lock file và tiếp tục build chương trình.

Xây dựng chương trình có thể xác minh

Để build chương trình Solana có thể xác minh được, điều hướng đến thư mục chứa file Cargo.toml của workspace và chạy:

solana-verify build

Điều này sẽ sao chép môi trường của bạn vào một container docker và xây dựng nó theo cách xác định.

Đảm bảo rằng bạn thực sự deploy bản build đã xác minh và không vô tình ghi đè nó bằng anchor build hoặc cargo build-sbf vì những lệnh này rất có thể sẽ không tạo ra cùng hash và do đó việc xác minh của bạn sẽ thất bại.

Đối với các dự án có nhiều chương trình, bạn có thể xây dựng một chương trình cụ thể bằng cách sử dụng tên thư viện (không phải tên gói):

solana-verify build --library-name $PROGRAM_LIB_NAME

Quá trình này đảm bảo các bản dựng xác định và có thể mất một khoảng thời gian, đặc biệt là trên các hệ thống nhất định (ví dụ: MacBook M1) vì nó đang chạy trong một container docker. Để xây dựng nhanh hơn, việc sử dụng máy Linux chạy kiến trúc x86 được khuyến nghị.

Khi quá trình xây dựng hoàn tất, bạn có thể lấy mã băm của tệp thực thi bằng lệnh sau:

solana-verify get-executable-hash target/deploy/$PROGRAM_LIB_NAME.so

Triển khai các chương trình có thể xác minh

Sau khi bạn đã xây dựng chương trình và lấy mã băm của nó, bạn có thể triển khai nó lên mạng Solana. Khuyến nghị sử dụng giải pháp đa chữ ký hoặc quản trị như Squads Protocol để triển khai an toàn, nhưng bạn cũng có thể triển khai trực tiếp với:

solana program deploy -u $NETWORK_URL target/deploy/$PROGRAM_LIB_NAME.so --program-id $PROGRAM_ID --with-compute-unit-price 50000 --max-sign-attempts 100 --use-rpc

Một mức phí ưu tiên thấp phù hợp hiện tại mà bạn có thể yêu cầu từ nhà cung cấp rpc của mình, ví dụ như Quicknode.

Để xác minh rằng chương trình đã triển khai khớp với tệp thực thi đã xây dựng, hãy chạy:

solana-verify get-program-hash -u $NETWORK_URL $PROGRAM_ID

Bạn có thể có các phiên bản khác nhau được triển khai trên các cụm Solana khác nhau (tức là devnet, testnet, mainnet). Đảm bảo bạn sử dụng URL mạng chính xác cho cụm Solana mong muốn mà bạn muốn xác minh chương trình. Xác minh từ xa sẽ chỉ hoạt động trên mainnet.

Xác minh đối với các kho lưu trữ

Để xác minh một chương trình đối với kho lưu trữ công khai của nó, hãy sử dụng:

solana-verify verify-from-repo -u $NETWORK_URL --program-id $PROGRAM_ID https://github.com/$REPO_PATH --commit-hash $COMMIT_HASH --library-name $PROGRAM_LIB_NAME --mount-path $MOUNT_PATH

Trong khi bạn chạy bản build đã xác minh trong thư mục chương trình của mình, khi chạy verify-from-repo bạn cần thêm cờ --mount-path. Đây sẽ là đường dẫn đến thư mục chứa Cargo.toml có tên thư viện của chương trình của bạn.

Lệnh này so sánh mã băm chương trình trên chuỗi với mã băm thực thi được xây dựng từ mã nguồn tại mã băm commit được chỉ định.

Cuối cùng, lệnh sẽ hỏi bạn có muốn tải dữ liệu xác minh của mình lên chuỗi hay không. Nếu bạn làm điều đó, Solana Explorer sẽ ngay lập tức hiển thị dữ liệu xác minh chương trình của bạn. Cho đến khi được xác minh bởi một bản dựng từ xa, nó sẽ hiển thị là chưa được xác minh. Tìm hiểu cách bạn có thể xác minh chương trình của mình thông qua API công khai trong bước tiếp theo.

Nếu bạn muốn khóa việc xác minh vào một phiên bản phát hành nhất định, bạn có thể thêm cờ --commit-hash vào lệnh.

Xác minh thông qua API công khai

Cuối cùng, bạn cũng có thể trực tiếp xác minh chương trình thông qua bất kỳ ai đang chạy API xác minh:

solana-verify verify-from-repo --remote -um --program-id PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY https://github.com/Ellipsis-Labs/phoenix-v1

Khuyến nghị sử dụng URL RPC trả phí vì nếu không bạn có thể gặp phải giới hạn tốc độ của các RPC miễn phí. Vì vậy thay vì -um bạn nên sử dụng --url yourRpcUrl để có quá trình xác minh đáng tin cậy hơn.

Cờ --remote gửi yêu cầu xây dựng đến API OtterSec, kích hoạt việc xây dựng từ xa cho chương trình của bạn. Khi quá trình xây dựng hoàn tất, hệ thống sẽ xác minh rằng mã băm trên chuỗi của chương trình của bạn khớp với mã băm của sản phẩm xây dựng được tạo ra từ kho lưu trữ của bạn.

Mặc định là API OtterSec.

Hãy chắc chắn chọn có khi bạn được hỏi về việc tải dữ liệu xác minh lên chuỗi. Điều này được API sử dụng để xác minh rằng bạn đã tải lên dữ liệu xác minh.

Bạn cũng có thể kích hoạt công việc từ xa thủ công bằng cách sử dụng:

solana-verify remote submit-job --program-id <program-id> --uploader <address>

Trong đó người tải lên là địa chỉ có quyền ghi vào PDA. Đó nên là quyền của chương trình trong hầu hết các trường hợp. Nếu chương trình của bạn được kiểm soát bởi một multisig, vui lòng tiếp tục ở phần xác minh multisig của hướng dẫn này bên dưới.

Điều này sẽ gửi một công việc đến API của OtterSec và sau đó bạn có thể xác minh trạng thái công việc bằng:

solana-verify remote get-job-status --job-id <job-id>

Khi quá trình xác minh hoàn tất thành công, có thể mất một lúc, bạn sẽ có thể thấy chương trình của mình được xác minh trong API OtterSec cho các chương trình đơn lẻ và trong Solana Explorer, SolanaFM, SolScan và cuối cùng cũng trên trang web do cộng đồng điều hành SolanaVerify.org được duy trì bởi 0xDeepAPI chương trình đã xác minh của OtterSec và cuối cùng là trong Bảng điều khiển Dune cho Chương trình đã Xác minh đóng góp vào một hệ sinh thái Solana lành mạnh hơn.

Cách xác minh chương trình của bạn khi nó được kiểm soát bởi Multisig như Squads

Để xác minh từ xa hoạt động, bạn cần ghi dữ liệu xác minh vào một PDA được ký bởi quyền của chương trình. Nếu chương trình của bạn được kiểm soát bởi một multisig, bạn có thể xuất giao dịch ghi PDA này và gửi nó thông qua Squads Protocol hoặc một giải pháp multisig khác theo lựa chọn của bạn.

1. Xây dựng chương trình có thể xác minh

Đầu tiên xây dựng chương trình:

solana-verify build

Điều này sẽ xây dựng một bản build có thể xác minh được bằng cách sử dụng container docker với phiên bản solana được chỉ định trong tệp Cargo.lock.

2. Triển khai chương trình

solana config set --url "PayedMainnetRPCAddress" // the public endpoint will be rate limited too much
solana program deploy target/deploy/verify_squads.so

Trong phần còn lại của hướng dẫn multisig này, chúng ta sẽ sử dụng ID chương trình ví dụ là 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD.

3. Commit và xác minh với repository

Sau khi hoàn thành, chúng ta commit dự án lên github. Đây là một ví dụ: https://github.com/solana-developers/verify-squads

Tùy chọn: Xem liệu bạn có thể xác minh cục bộ trước không (lệnh này sử dụng ID chương trình ví dụ 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD):

solana-verify verify-from-repo https://github.com/solana-developers/verify-squads --program-id 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD

Chỉ để đảm bảo các tham số của bạn là chính xác.

4. Chuyển quyền quản lý chương trình cho multisig

Nếu bạn chưa chuyển quyền quản lý chương trình của mình cho multisig và sao chép quyền quản lý multisig. Bạn sẽ cần nó trong bước tiếp theo.

5. Xuất giao dịch PDA

Khi bạn có quyền quản lý chương trình ở cục bộ, bạn sẽ được nhắc tải dữ liệu build lên chuỗi khi sử dụng lệnh solana-verify verify-from-repo.

Vì bạn không thể làm điều đó khi đang sử dụng multisig, bạn cần xuất giao dịch PDA theo cách thủ công và sau đó kích hoạt giao dịch thông qua Squads.

solana-verify export-pda-tx https://github.com/solana-developers/verify-squads --program-id 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD --uploader <your program authority> --encoding base58 --compute-unit-price 0

Lệnh này sẽ trả về cho bạn một giao dịch được mã hóa base58. Nếu bạn muốn một giao dịch được mã hóa base64 để sử dụng trong trình kiểm tra giao dịch, bạn có thể sử dụng --encoding base64.

P6vBfcPaaXb8fZoT3NBAYEcdtEj7tubA1k2gBxmFKZ3UWF5YyrmDMFTvLKALCJoUuRsPAjMckudYruCu3eeWQtuDrFbEMLxLFutnKXac974fnkMivcwUdY66VLjbxQT6ATmcy7F4hBtz1G4P1h6iBJLhb8WtrtgY3i4qq45MUEb7RjuMEfUFXKrNgPdGxkz5xvMHq3dxKRcpmEK5k2DkeW6SUQYBVe19Ga3B9GyhTX8k3CMt9JCEah13WyRnQd8GjoK6sTEvGJym6xDNvmd8yiJYSNcaYwEJsjHEUf4Yh6kAC7ki2KRvVAr3NVe1gjqK9McrwSQjtUatvydTG8Zovcr7PPUEMf3yPMgKXjZLB2QpkH63yTTYdNAnWFuv9E6b6nYRqye5XcNi436yKw5U14fXh65yK34bgYLi9328UT1huJELsJU9BRGnGUmb6GWp6c2WL5BhnzgNTSnt9TXFfEgUMzhvKzpVBxLP44hwqqBdyUhHFysCF37531PnmiESq8x1xou23xJ6FcQbc199754MkqQd7tX9CUznGzAEqHGkzn3VBoJnojsKtgYmiTYbdRsT1CU18MbYEE7WvGAvXyxxbpNzbAcc94HrnM6cqRGmwhEBroPfFghTdmzg9D

6. Gửi giao dịch thông qua Squads

Truy cập trình tạo giao dịch Squads và nhập giao dịch mã hóa base58. Đảm bảo rằng trong mô phỏng, giao dịch chỉ có một lệnh gọi đến chương trình xác minh osec và chương trình ngân sách máy tính và không có gì khác!

7. Gửi công việc xác minh từ xa

Sau khi giao dịch đến Squads thành công, bạn có thể gửi công việc từ xa:

solana-verify remote submit-job --program-id 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD
--uploader <your program authority>

Vậy là xong! Bạn đã xác minh chương trình của mình với một repository công khai và gửi một công việc từ xa đến API của OtterSec. Bây giờ bạn sẽ có thể thấy nó hiển thị trong trình khám phá Solana và các nơi khác.

8. Cập nhật chương trình (Tùy chọn)

Khi bạn cập nhật chương trình, bạn cần xuất một giao dịch PDA mới và gửi nó thông qua Squads một lần nữa.

Thực hiện cập nhật chương trình:

solana-verify build
solana program write-buffer target/deploy/verify_squads.so --with-compute-unit-price 50000 --max-sign-attempts 50

Sau đó chuyển quyền quản lý buffer đó cho multisig hoặc trực tiếp tạo buffer với quyền quản lý của multisig.

solana program set-buffer-authority Fu3k79g53ZozAj47uq1tXrFy4QbQYh7y745DDsxjtyLR --new-buffer-authority 3JG6ULvZVCrkKtSSskKNJGe8RNZGFe8Ruev9KUhxzK5K

9. Xuất và gửi giao dịch PDA mới

Đừng quên commit các thay đổi của bạn lên github. Xuất giao dịch nâng cấp PDA một lần nữa:

solana-verify export-pda-tx https://github.com/solana-developers/verify-squads --program-id 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD --uploader 3JG6ULvZVCrkKtSSskKNJGe8RNZGFe8Ruev9KUhxzK5K

Gửi giao dịch thông qua Squads một lần nữa.

Bạn có thể xem một ví dụ về giao dịch tại đây.

Sau đó gửi yêu cầu build từ xa một lần nữa:

solana-verify remote submit-job --program-id 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD --uploader 3JG6ULvZVCrkKtSSskKNJGe8RNZGFe8Ruev9KUhxzK5K

Kết quả sẽ trông như thế này:

Verification request sent with request id: b63339d2-163e-49ac-b55d-3454c1c2b5b3
Verification in progress... ⏳ [00:18:02] ✅ Process completed. (Done in 18
minutes) Program 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD has been verified.
The provided GitHub build matches the on-chain hash. On Chain Hash:
96f8c3d9400258f7759408d1f6f8435b4a24d9b52f5a0340d97907e567cb8773 Executable
Hash: 96f8c3d9400258f7759408d1f6f8435b4a24d9b52f5a0340d97907e567cb8773 Repo URL:
https://github.com/Woody4618/verify-squads/tree/0fb0a2e30c15c51732c0ad5e837975a6f7bbc7ed
Check the verification status at:
https://verify.osec.io/status/6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD Job
url: https://verify.osec.io/job/b63339d2-163e-49ac-b55d-3454c1c2b5b3

Chúc mừng, bạn đã xác minh chương trình của mình sau khi nâng cấp bằng multisig!

Xác minh từ docker image

Bạn cũng có thể xác minh chương trình của mình bằng docker image bằng cách chạy lệnh sau:

solana-verify verify-from-image -e
examples/hello_world/target/deploy/hello_world.so -i
ellipsislabs/hello_world_verifiable_build:latest -p
2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn

Lệnh này tải image được lưu trữ tại ellipsislabs/hello_world_verifiable_build:latest, và xác minh rằng hash của đường dẫn thực thi trong container giống với hash của chương trình onchain được cung cấp cho lệnh. Vì bản build đã được tải lên image, nên không cần phải build lại hoàn toàn file thực thi, điều này có thể mất nhiều thời gian.

Dockerfile tạo ra image ellipsislabs/hello_world_verifiable_build:latest có thể được tìm thấy trong kho lưu trữ ellipsis labs /examples/hello_world.

Dưới đây là kết quả đầu ra dự kiến:

Verifying image: "ellipsislabs/hello_world_verifiable_build:latest", on network
"https://api.mainnet.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 ✅

Ví dụ về xác minh build

Đây là ví dụ về việc xác minh một chương trình mẫu với ID FWEYpBAf9WsemQiNbAewhyESfR38GBBHLrCaU3MpEKWv sử dụng mã nguồn từ kho lưu trữ này:

solana-verify verify-from-repo https://github.com/solana-developers/verified-program --url YOUR-RPC-URL --program-id FWEYpBAf9WsemQiNbAewhyESfR38GBBHLrCaU3MpEKWv --mount-path waffle --library-name waffle --commit-hash 5b82b86f02afbde330dff3e1847bed2d42069f4e

Theo mặc định, lệnh verify-from-repo lấy commit cuối cùng trên nhánh main. Bạn cũng có thể chỉ định một commit cụ thể trong trường hợp bạn muốn tiếp tục làm việc trên kho lưu trữ bằng cách sử dụng tham số commit-hash: --commit-hash 5b82b86f02afbde330dff3e1847bed2d42069f4e

Cuối cùng, bạn cũng có thể trực tiếp xác minh chương trình thông qua API của OtterSec:

solana-verify verify-from-repo https://github.com/solana-developers/verified-program --url YOUR-RPC-URL --remote --program-id FWEYpBAf9WsemQiNbAewhyESfR38GBBHLrCaU3MpEKWv --mount-path waffle --library-name waffle --commit-hash 5b82b86f02afbde330dff3e1847bed2d42069f4e

Lệnh --remote gửi yêu cầu build đến API của OtterSec, điều này kích hoạt quá trình build từ xa cho chương trình của bạn. Khi quá trình build hoàn tất, hệ thống sẽ xác minh rằng hash onchain của chương trình của bạn khớp với hash của sản phẩm build được tạo ra từ kho lưu trữ của bạn.

Các chương trình phổ biến đã được xác minh

Phoenix

solana-verify verify-from-repo -um --program-id PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY https://github.com/Ellipsis-Labs/phoenix-v1

Kết quả cuối cùng:

Executable Program Hash from repo: 6877a5b732b3494b828a324ec846d526d962223959534dbaf4209e0da3b2d6a9
On-chain Program Hash: 6877a5b732b3494b828a324ec846d526d962223959534dbaf4209e0da3b2d6a9
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

Lưu ý rằng chúng ta cần chỉ định library-name vì repo Squads bao gồm nhiều chương trình. Chúng ta sử dụng cờ --bpfsquads_mpl trước đó đã được xác minh với Anchor.

Kết quả cuối cùng:

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

Kết quả cuối cùng:

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 --commit-hash d33e649e415c354cc2a1e3c49131725552d69ba0 --library-name marginfi -- --features mainnet-beta

Kết quả cuối cùng:

Executable Program Hash from repo: 890d68f48f96991016222b1fcbc2cc81b8ef2dcbf280c44fe378c523c108fad5
On-chain Program Hash: 890d68f48f96991016222b1fcbc2cc81b8ef2dcbf280c44fe378c523c108fad5
Program hash matches ✅

Các câu hỏi thường gặp

Quá trình xác minh của tôi bị lỗi. Tôi nên làm gì?

Kiểm tra các vấn đề phổ biến sau:

  • Sai người ký: Xác nhận người ký của bạn là upgrade authority của chương trình bằng cách chạy solana program show YourProgramId
  • Không có PDA on-chain: Chạy solana-verify verify-from-repo -umchọn YES khi được nhắc. Nếu không tải PDA lên, API không thể truy xuất metadata xác minh của bạn.
  • Dữ liệu PDA không khớp: Cập nhật PDA của bạn nếu bạn đã triển khai lại chương trình. Dữ liệu PDA của bạn phải khớp với chương trình đã triển khai.
  • Commit hash không chính xác: Tạo PDA của bạn bằng commit hash chính xác mà bạn đã triển khai
  • Sự khác biệt về môi trường build: Sử dụng Docker với solana-verify khi tạo PDA của bạn

Hash build cục bộ của tôi không khớp với hash on-chain. Tại sao?

Điều này thường có nghĩa là:

  • Bạn đang sử dụng các phiên bản toolchain Rust/Solana khác nhau
  • Các dependency của bạn đã được cập nhật giữa các lần build
  • Bạn không build trong container Docker
  • Bạn đã checkout sai commit

Khắc phục điều này bằng cách build với solana-verify build trong Docker sử dụng commit chính xác mà bạn đã triển khai.

Quá trình xác minh của tôi sẽ mất bao lâu?

Dự kiến các khung thời gian sau dựa trên kích thước chương trình của bạn:

  • Chương trình đơn giản: 1-5 phút
  • Chương trình phức tạp: 5-15 phút
  • Chương trình rất lớn: Lên đến 30 phút

Theo dõi tiến trình của bạn bằng cách sử dụng endpoint trạng thái công việc.

Chương trình của tôi là bất biến (không có upgrade authority). Làm thế nào tôi có thể xác minh nó?

Nếu chương trình của bạn không có upgrade authority hoặc đã được đặt thành bất biến trước khi bạn có thể tạo PDA, chúng tôi có một địa chỉ trong danh sách cho phép cho trường hợp này. Liên hệ với chúng tôi tại contact@osec.io, và chúng tôi sẽ giúp bạn xác minh chương trình của bạn.

PDA là gì và tại sao nó quan trọng?

PDA (Program Derived Account) của bạn cho phép xác minh không cần tin cậy:

  • Lưu trữ On-Chain: Lưu trữ siêu dữ liệu xác minh của bạn (URL repo, commit hash, tham số build) trên chuỗi trong PDA thuộc sở hữu của chương trình Otter Verify (verifycLy8mB96wd9wqq3WDXQwM4oU6r42Th37Db9fC)
  • Liên kết Mật mã: PDA của bạn được tạo ra từ địa chỉ chương trình, tạo một liên kết bất biến đến dữ liệu xác minh của bạn
  • Tin cậy Phi tập trung: Bất kỳ ai cũng có thể đọc PDA của bạn và xác minh chương trình của bạn một cách độc lập

Tại sao tôi phải tạo PDA trước khi sử dụng API?

API chỉ hoạt động với các PDA on-chain vì:

  • Không cần tin cậy: API từ chối dữ liệu tùy ý - nó chỉ sử dụng những gì quyền nâng cấp của bạn đã lưu trữ trên chuỗi
  • Đơn giản hơn: Chỉ cần cung cấp signer + program_id; API sẽ lấy mọi thứ khác từ PDA của bạn
  • Chống giả mạo: PDA của bạn tạo ra một bản ghi bất biến mà bất kỳ ai cũng có thể xác minh một cách độc lập
  • Chứng minh quyền sở hữu: Signer của bạn phải là quyền nâng cấp, chứng minh bằng mật mã rằng bạn kiểm soát chương trình

Tôi nên xác minh chương trình của mình bao lâu một lần?

Xác minh chương trình của bạn:

  • Sau mỗi lần triển khai hoặc nâng cấp
  • Khi bạn cập nhật kho lưu trữ nguồn của mình
  • Đừng lo lắng về việc xác minh lại ngoài ra - API tự động xác minh lại tất cả các chương trình mỗi 24 giờ

Điều gì xảy ra khi tôi nâng cấp chương trình của mình?

Thực hiện các bước sau sau khi nâng cấp:

  1. API phát hiện nâng cấp của bạn và hủy xác minh chương trình của bạn.
  2. Cập nhật PDA của bạn với siêu dữ liệu xác minh mới:
solana-verify verify-from-repo -um \
--program-id YourProgramId... \
https://github.com/your-org/your-program
  1. Gửi yêu cầu xác minh mới bằng quyền nâng cấp của bạn
  2. API sẽ xác minh phiên bản mới của bạn so với PDA đã cập nhật

Quan trọng: Luôn cập nhật PDA của bạn bằng quyền nâng cấp với commit hash mới cho chương trình đã nâng cấp.

Tôi có thể tin tưởng kết quả xác minh không?

Có - hệ thống được thiết kế để hoạt động không cần tin cậy và có thể xác minh độc lập:

Điều Gì Làm Cho Nó Đáng Tin Cậy:

  • PDA Trên Chuỗi: Metadata xác minh của bạn tồn tại trên chuỗi, không bị kiểm soát bởi bất kỳ cơ quan trung tâm nào
  • Chứng Minh Quyền Nâng Cấp: Chỉ quyền nâng cấp chương trình của bạn mới có thể tạo/cập nhật PDA
  • Xác Minh Độc Lập: Bất kỳ ai cũng có thể xác minh bằng cách đọc PDA của bạn và chạy solana-verify cục bộ
  • Xác Minh Lại Liên Tục: API tự động xác minh lại tất cả các chương trình mỗi 24 giờ

Hiểu Rõ Những Hạn Chế Này:

  • Xác minh chỉ xác nhận mã nguồn khớp với triển khai - KHÔNG PHẢI rằng mã của bạn an toàn
  • Luôn xem xét mã trước khi tương tác với các chương trình
  • Đã xác minh ≠ đã kiểm toán, hoặc an toàn
  • Kiểm tra kho lưu trữ và commit trong PDA để xác nhận nó đến từ nguồn đáng tin cậy

Làm thế nào tôi có thể xác minh độc lập một chương trình?

Tự xác minh bất kỳ chương trình nào bằng cách đọc PDA trên chuỗi của nó và chạy xác minh cục bộ:

Bước 1: Đọc PDA Trên Chuỗi

# Install solana-verify if you haven't
cargo install solana-verify
# Get the PDA data
solana-verify list-program-pdas --program-id YourProgramId...

Bước 2: Xác Minh Cục Bộ

# Verify using the repository and commit & other arguments from the PDA
solana-verify verify-from-repo \
--program-id YourProgramId... \
https://github.com/your-org/your-program
--commit-hash <commit-hash>
... (other arguments from the PDA)
# Confirm the hash output matches the on-chain program hash

Điều này chứng minh:

  1. Metadata PDA là xác thực (được lưu trữ trên chuỗi)
  2. Mã nguồn trong kho lưu trữ của PDA khớp với chương trình đã triển khai
  3. Bạn không cần tin tưởng API - tự xác minh mọi thứ trên chuỗi

Người khác có thể xác minh chương trình của tôi mà không cần sự cho phép không?

Có, đó là lý do tại sao chúng tôi yêu cầu người ký phải là quyền nâng cấp. Chúng tôi chỉ coi việc xác minh là hợp lệ nếu người ký là quyền nâng cấp.

Tôi cần gì để tạo các bản dựng có thể xác minh được?

Cài đặt các công cụ sau:

  • Docker (để tạo bản dựng xác định)
  • Cargo (trình quản lý gói Rust)
  • Solana Verify CLI: cargo install solana-verify
  • Một kho lưu trữ Git công khai với mã nguồn của bạn

Tôi có thể xác minh các kho lưu trữ riêng tư không?

Không - xác minh yêu cầu mã nguồn công khai:

  • PDA của bạn lưu trữ URL kho lưu trữ công khai mà bất kỳ ai cũng có thể truy cập
  • Xác minh phi tập trung phụ thuộc vào quyền truy cập mã công khai
  • Người dùng cần đọc mã nguồn của bạn để hiểu chương trình của bạn làm gì
  • Toàn bộ mục đích là cho phép người dùng xác minh độc lập rằng mã nguồn khớp với triển khai

Kho lưu trữ riêng tư phá vỡ mô hình tin cậy cốt lõi của hệ thống xác minh.

Làm cách nào để xác minh chương trình được kiểm soát bởi Squads Multisig?

Thực hiện các bước sau cho các chương trình được kiểm soát bởi multisig:

# 1. Build and deploy normally
solana-verify build
solana program deploy <your-program.so> --program-id YourProgramId...
# 2. Verify locally first - confirm the hash matches
solana-verify verify-from-repo -um \
--program-id YourProgramId... \
https://github.com/your-org/your-program
# 3. Export the PDA creation transaction
solana-verify export-pda-tx \
--program-id YourProgramId... \
https://github.com/your-org/your-program
# 4. Execute the PDA transaction through your Squads Multisig interface
# 5. After multisig execution, trigger remote verification
solana-verify remote submit-job \
--program-id YourProgramId... \
--uploader YourMultisigAddress...

Quan trọng: Luôn xác minh cục bộ (bước 2) để xác nhận hash bản dựng khớp trước khi xuất giao dịch PDA.

Kết luận

Sử dụng bản dựng đã xác minh trên Solana đảm bảo tính toàn vẹn và đáng tin cậy của các chương trình của bạn trên mạng và cho phép các nhà phát triển tìm SDK của bạn trực tiếp từ Solana Explorer. Bằng cách tận dụng các công cụ như Solana Verify CLI và Docker, bạn có thể duy trì các bản dựng có thể xác minh và an toàn phù hợp với mã nguồn của bạn. Luôn thực hiện các biện pháp phòng ngừa cần thiết để sử dụng môi trường nhất quán và xem xét các giải pháp quản trị để nâng cấp và triển khai an toàn.

Bảo mật + Tuyên bố miễn trừ trách nhiệm

Mặc dù bản dựng đã xác minh là một công cụ mạnh mẽ để đảm bảo tính toàn vẹn của các chương trình Solana của bạn nhưng nó không hoàn toàn phi tập trung trong thiết lập mặc định. Các docker image được xây dựng và lưu trữ bởi Solana Foundation.

Lưu ý rằng bạn đang xây dựng dự án của mình trong một docker image đã tải xuống và toàn bộ thiết lập của bạn được sao chép vào docker image đó để xây dựng bao gồm các thông tin có khả năng nhạy cảm.

Nếu bạn muốn có một thiết lập hoàn toàn phi tập trung, bạn có thể tự xây dựng các docker image và lưu trữ chúng trên cơ sở hạ tầng của riêng bạn. Bằng cách này, bạn có thể chắc chắn rằng các docker image không bị giả mạo. Bạn có thể tìm thấy các script để tạo docker image của riêng bạn trong kho lưu trữ Verified builds và bạn có thể fork nó và chạy các github actions của riêng bạn hoặc xác thực rằng chúng chính xác.

Hơn nữa, đối với việc xác minh từ xa, bạn đang tin tưởng API của OtterSec và Solana Explorer ở một mức độ nhất định.

API hoặc Solana Explorer có khả năng hiển thị thông tin không chính xác nếu bị xâm nhập.

Nếu bạn muốn có một cài đặt hoàn toàn không cần tin cậy, bạn có thể tự chạy Verify API hoặc tự thực hiện xác minh chương trình cục bộ bằng lệnh verify-from-repo sử dụng dữ liệu xác minh trên chuỗi được lưu trong một PDA được tạo ra từ quyền triển khai của chương trình và chương trình xác minh.

Chương trình xác minh được triển khai bởi nhóm OtterSec và chưa được đóng băng nên có thể được nâng cấp bất kỳ lúc nào.

Solana Foundation, OtterSec và nhóm Ellipsis Labs không chịu trách nhiệm đối với bất kỳ tổn thất hoặc thiệt hại nào có thể xảy ra từ việc sử dụng quy trình verified builds.

Security.txt cho các chương trình Solana

Ngoài verified builds, bạn cũng có thể thêm tệp security.txt vào chương trình của mình. Trong tương lai, khi được triển khai, security.txt sẽ chứa pubkey của người xác minh để dễ dàng truy cập dữ liệu xác minh được lưu trong PDA xác minh. PDA chứa tất cả thông tin cần thiết để xây dựng và xác minh một chương trình được tạo ra từ địa chỉ chương trình và pubkey của người xác minh. Theo mặc định, đây là cùng một pubkey đã xây dựng và triển khai chương trình. Nhưng nó cũng có thể là một pubkey khác có thể được chỉ định trong security.txt.

Tính năng security.txt cho phép các nhà phát triển nhúng thông tin liên hệ và bảo mật trực tiếp vào các hợp đồng thông minh Solana của họ. Lấy cảm hứng từ securitytxt.org, cách tiếp cận này cung cấp một phương thức chuẩn hóa để các nhà nghiên cứu bảo mật liên hệ với người bảo trì dự án, ngay cả khi họ chỉ biết địa chỉ của hợp đồng.

Tại sao nên sử dụng security.txt?

Đối với nhiều dự án, đặc biệt là những dự án nhỏ hơn hoặc riêng tư, việc xác định các nhà phát triển chỉ từ địa chỉ hợp đồng có thể khó khăn và tốn thời gian. Nhúng tệp security.txt vào trong chương trình đảm bảo rằng các nhà nghiên cứu bảo mật có thể dễ dàng liên hệ với đúng người, có khả năng ngăn chặn các lỗ hổng và đảm bảo báo cáo lỗi kịp thời.

Cách triển khai security.txt

Để thêm security.txt vào chương trình Solana của bạn, hãy bao gồm các bước sau:

Thêm phụ thuộc solana-security-txt vào Cargo.toml của bạn:

Cargo.toml
[dependencies]
solana-security-txt = "1.1.1"

Sử dụng macro security_txt! trong hợp đồng của bạn để xác định thông tin bảo mật. Bạn có thể bao gồm thông tin liên hệ, URL dự án và thậm chí cả chính sách bảo mật. Đây là một ví dụ:

#[cfg(not(feature = "no-entrypoint"))]
use {default_env::default_env, solana_security_txt::security_txt};
#[cfg(not(feature = "no-entrypoint"))]
security_txt! {
name: "MyProject",
project_url: "https://myproject.com",
contacts: "email:security@myproject.com,discord:security#1234",
policy: "https://myproject.com/security-policy",
// Optional Fields
preferred_languages: "en,de",
source_code: "https://github.com/solana-developers/solana-game-preset",
source_revision: "5vJwnLeyjV8uNJSp1zn7VLW8GwiQbcsQbGaVSwRmkE4r",
source_release: "",
encryption: "",
auditors: "Verifier pubkey: 5vJwnLeyjV8uNJSp1zn7VLW8GwiQbcsQbGaVSwRmkE4r",
acknowledgements: "Thank you to our bug bounty hunters!"
}

Sau khi thông tin security.txt được nhúng vào chương trình của bạn, nó có thể dễ dàng được truy vấn thông qua các công cụ như Solana Explorer, đảm bảo rằng thông tin liên hệ và bảo mật của bạn có sẵn cho bất kỳ ai muốn báo cáo các vấn đề tiềm ẩn.

Thực hành tốt nhất

  • Sử dụng Liên kết: Đối với thông tin có khả năng thay đổi (ví dụ: thông tin liên hệ), nên liên kết đến một trang web thay vì mã hóa cứng chúng vào hợp đồng. Điều này tránh việc phải nâng cấp chương trình thường xuyên.

  • Xác minh: Trước khi triển khai, hãy xác minh định dạng và nội dung bằng công cụ query-security-txt, công cụ này có thể xác thực cả chương trình onchain và tệp nhị phân cục bộ:

query-security-txt target/bpfel-unknown-unknown/release/my_contract.so

Bằng cách nhúng thông tin liên hệ bảo mật trực tiếp vào hợp đồng của bạn, bạn giúp các nhà nghiên cứu dễ dàng liên hệ với bạn hơn, thúc đẩy bảo mật và giao tiếp tốt hơn trong hệ sinh thái Solana.

Đây là một ví dụ về cách security.txt hiển thị trong Solana Explorer

Dự án security.txt được duy trì bởi Neodyme Labs

Bạn có thể kiểm tra trạng thái xác minh và duyệt các chương trình đã được xác minh tại verify.osec.io.

Is this page helpful?

Mục lục

Bản dựng đã xác minh là gì?Nó hoạt động như thế nào?Tại sao tôi nên sử dụng bản dựng đã xác minh?Làm thế nào để tạo các bản build đã xác minh?Cài đặt Docker và CargoCài đặt Solana Verify CLIChuẩn bị dự ánXây dựng chương trình có thể xác minhTriển khai các chương trình có thể xác minhXác minh đối với các kho lưu trữXác minh thông qua API công khaiCách xác minh chương trình của bạn khi nó được kiểm soát bởi Multisig như Squads1. Xây dựng chương trình có thể xác minh2. Triển khai chương trình3. Commit và xác minh với repository4. Chuyển quyền quản lý chương trình cho multisig5. Xuất giao dịch PDA6. Gửi giao dịch thông qua Squads7. Gửi công việc xác minh từ xa8. Cập nhật chương trình (Tùy chọn)9. Xuất và gửi giao dịch PDA mớiXác minh từ docker imageVí dụ về xác minh buildCác chương trình phổ biến đã được xác minhPhoenixSquads V3Drift V2Marginfi V2Các câu hỏi thường gặpQuá trình xác minh của tôi bị lỗi. Tôi nên làm gì?Hash build cục bộ của tôi không khớp với hash on-chain. Tại sao?Quá trình xác minh của tôi sẽ mất bao lâu?Chương trình của tôi là bất biến (không có upgrade authority). Làm thế nào tôi có thể xác minh nó?PDA là gì và tại sao nó quan trọng?Tại sao tôi phải tạo PDA trước khi sử dụng API?Tôi nên xác minh chương trình của mình bao lâu một lần?Điều gì xảy ra khi tôi nâng cấp chương trình của mình?Tôi có thể tin tưởng kết quả xác minh không?Làm thế nào tôi có thể xác minh độc lập một chương trình?Người khác có thể xác minh chương trình của tôi mà không cần sự cho phép không?Tôi cần gì để tạo các bản dựng có thể xác minh được?Tôi có thể xác minh các kho lưu trữ riêng tư không?Làm cách nào để xác minh chương trình được kiểm soát bởi Squads Multisig?Kết luậnBảo mật + Tuyên bố miễn trừ trách nhiệmSecurity.txt cho các chương trình SolanaTại sao nên sử dụng security.txt?Cách triển khai security.txtThực hành tốt nhất
Chỉnh sửa trang

Quản lý bởi

© 2026 Solana Foundation.
Đã đăng ký bản quyền.
Kết nối