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

Sau khi bạn tải xác minh PDA onchain bằng verify-from-repo, hãy gửi một công việc xác minh từ xa tới OtterSec API:

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

--uploader là địa chỉ đã tải lên xác minh PDA, thường là quyền nâng cấp chương trình của bạn. Nếu chương trình của bạn được kiểm soát bởi multisig, hãy tiếp tục theo phần xác minh multisig bên dưới trong hướng dẫn này.

Cờ --remote cũ trên verify-from-repo đã bị ngừng sử dụng. Hãy tải PDA của bạn lên trước, sau đó chạy remote submit-job.

Lệnh này sẽ gửi một công việc tới OtterSec API. Bạn có thể kiểm tra trạng thái công việc bằng:

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

Sau khi xác minh hoàn tất thành công, quá trình này 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 OtterSec API dành cho 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 vận hành SolanaVerify.org được duy trì bởi 0xDeepOtterSec verified programs API cũng như trong Verified Programs Dune Dashboard đó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 hạn của chương trình. Nếu chương trình của bạn được kiểm soát bởi multisig, bạn có thể xuất giao dịch ghi PDA này và gửi nó qua Squads Protocol hoặc một giải pháp multisig khác theo lựa chọn của bạn.

1. Build chương trình có thể xác minh

Đầu tiên, build chương trình:

solana-verify build

Lệnh này sẽ tạo một bản build có thể xác minh bằng cách sử dụng docker container 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 mẫu là 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD.

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

Sau khi hoàn tất, chúng ta commit dự án lên github. Dưới đây là một ví dụ: https://github.com/solana-developers/verify-squads

Tùy chọn: Thử xác minh cục bộ trước (lệnh này sử dụng ID chương trình mẫu 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 sang multisig

Nếu bạn chưa chuyển quyền quản lý chương trình sang multisig, hãy sao chép địa chỉ authority của multisig. Bạn sẽ cần nó ở 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 onchain khi sử dụng lệnh solana-verify verify-from-repo.

Vì bạn không thể thực hiện đ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ề một giao dịch dạng base58. Nếu bạn muốn giao dịch được mã hóa base64 để sử dụng trong trình kiểm tra giao dịch, bạn có thể dùng --encoding base64.

P6vBfcPaaXb8fZoT3NBAYEcdtEj7tubA1k2gBxmFKZ3UWF5YyrmDMFTvLKALCJoUuRsPAjMckudYruCu3eeWQtuDrFbEMLxLFutnKXac974fnkMivcwUdY66VLjbxQT6ATmcy7F4hBtz1G4P1h6iBJLhb8WtrtgY3i4qq45MUEb7RjuMEfUFXKrNgPdGxkz5xvMHq3dxKRcpmEK5k2DkeW6SUQYBVe19Ga3B9GyhTX8k3CMt9JCEah13WyRnQd8GjoK6sTEvGJym6xDNvmd8yiJYSNcaYwEJsjHEUf4Yh6kAC7ki2KRvVAr3NVe1gjqK9McrwSQjtUatvydTG8Zovcr7PPUEMf3yPMgKXjZLB2QpkH63yTTYdNAnWFuv9E6b6nYRqye5XcNi436yKw5U14fXh65yK34bgYLi9328UT1huJELsJU9BRGnGUmb6GWp6c2WL5BhnzgNTSnt9TXFfEgUMzhvKzpVBxLP44hwqqBdyUhHFysCF37531PnmiESq8x1xou23xJ6FcQbc199754MkqQd7tX9CUznGzAEqHGkzn3VBoJnojsKtgYmiTYbdRsT1CU18MbYEE7WvGAvXyxxbpNzbAcc94HrnM6cqRGmwhEBroPfFghTdmzg9D

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

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

7. Gửi yêu cầu xác minh từ xa

Sau khi giao dịch lên Squads thành công, bạn có thể gửi yêu cầu xác minh từ xa:

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

Đây rồi! Bạn đã xác minh chương trình của mình với một kho lưu trữ công khai và đã gửi một công việc từ xa tới OtterSec API. Bây giờ bạn sẽ có thể thấy nó được phản ánh trong Solana Explorer 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 lại thông qua Squads.

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 truy cập buffer đó cho multisig hoặc trực tiếp tạo buffer với quyền 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 lại giao dịch nâng cấp PDA:

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 giao dịch mẫu tại đây.

Sau đó gửi để thực hiện một lần build từ xa khác:

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 onchain 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

Xin chúc mừng, bạn đã xác minh thành công chương trình sau khi nâng cấp multisig!

Xác minh từ Docker image

Bạn cũng có thể xác minh chương trình của mình với một 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 lên 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 một image, không cần phải build lại toàn bộ tệp thực thi — quá trình này có thể mất rấ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 mong đợi:

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 onchain program data ✅

Ví dụ build đã được xác minh

Dưới đâ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 sẽ lấy commit mới nhất trên nhánh main. Bạn cũng có thể chỉ định một commit cụ thể trong trường hợp 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

Khi được nhắc, hãy trả lời yes để tải PDA xác minh của bạn lên onchain. Sau đó gửi một yêu cầu xác minh từ xa đến OtterSec API:

solana-verify remote submit-job --program-id FWEYpBAf9WsemQiNbAewhyESfR38GBBHLrCaU3MpEKWv --uploader <your-upgrade-authority>

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
Onchain 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ì kho lưu trữ Squads bao gồm nhiều chương trình. Chúng ta sử dụng cờ --bpfsquads_mpl đã được xác minh trước đó bằng Anchor.

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

Executable Program Hash from repo: 72da599d9ee14b2a03a23ccfa6f06d53eea4a00825ad2191929cbd78fb69205c
Onchain 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
Onchain 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
Onchain Program Hash: 890d68f48f96991016222b1fcbc2cc81b8ef2dcbf280c44fe378c523c108fad5
Program hash matches ✅

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

Xác minh của tôi bị thất bại. Tôi phải làm gì?

Kiểm tra các vấn đề thường gặp sau:

  • Signer sai: Xác nhận rằng signer 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 onchain: Chạy solana-verify verify-from-repo -umchọn YES khi được nhắc. Nếu không tải PDA lên, API sẽ 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 phải khớp với chương trình đã triển khai.
  • Hash commit không chính xác: Tạo PDA của bạn bằng đúng commit hash mà bạn đã triển khai
  • Môi trường build khác nhau: Sử dụng Docker với solana-verify khi tạo PDA

Hash build cục bộ của tôi không khớp với hash onchain. 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 Rust/Solana toolchain 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 Docker container
  • Bạn đã checkout sai commit

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

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

Thời gian dự kiến 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: Tối đa 30 phút

Theo dõi tiến trình của bạn bằ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 sao 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ỉ được whitelist cho tình huống 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.

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 tưởng:

  • Lưu trữ On-Chain: Lưu trữ metadata xác minh của bạn (URL repo, commit hash, tham số build) trên chuỗi trong một 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 dẫn xuất từ địa chỉ program account của bạn, tạo ra một liên kết bất biến đến dữ liệu xác minh của bạn
  • Tin tưởng Phi tập trung: Bất kỳ ai cũng có thể đọc PDA của bạn và độc lập xác minh program account của bạn

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 trên chuỗi vì:

  • Không cần tin tưởng: API từ chối dữ liệu tùy ý - nó chỉ sử dụng những gì upgrade authority 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ứ còn lại 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 độc lập
  • Bằng chứng Quyền sở hữu: Signer của bạn phải là upgrade authority, chứng minh bằng mật mã rằng bạn kiểm soát program account

Tôi nên xác minh program account của mình bao lâu một lần?

Xác minh program account 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 trong các trường hợp khác - API tự động xác minh lại tất cả các program account mỗi 24 giờ

Điều gì xảy ra khi tôi nâng cấp program account 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 việc nâng cấp của bạn và hủy xác minh program account của bạn.
  2. Cập nhật PDA của bạn với metadata 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 upgrade authority của bạn
  2. API sẽ xác minh phiên bản mới của bạn dựa trên PDA đã được cập nhật

Quan trọng: Luôn cập nhật PDA của bạn bằng upgrade authority với commit hash mới cho program account đã được nâng cấp.

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

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

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

  • PDA On-Chain: Siêu dữ liệu xác minh của bạn được lưu trữ trên chuỗi, không bị kiểm soát bởi bất kỳ cơ quan trung ương nào
  • Bằng Chứng 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 Các Giới Hạn Này:

  • Xác minh xác nhận mã nguồn khớp với bản triển khai - KHÔNG phải là 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 đó là từ một nguồn đáng tin cậy

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

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 On-Chain

# 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 onchain program hash

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

  1. Siêu dữ liệu 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 vào 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 quyền 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 build có thể xác minh?

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

  • Docker (để xây dựng tất đị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 - việc 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 không cần tin tưởng phụ thuộc vào khả năng 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 hoạt động như thế nào
  • Mục đích cốt lõi là cho phép người dùng độc lập xác minh rằng mã nguồn khớp với bản triển khai

Các 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 thế nào để xác minh một 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 của bản build khớp trước khi xuất giao dịch PDA.

Kết luận

Sử dụng các bản build đã được xác minh trên Solana đảm bảo tính toàn vẹn và độ 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 thấy 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 build có thể xác minh và bảo mật 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ù các bản build đã được 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 không cần tin tưởng trong cài đặt mặc định. Các image Docker được xây dựng và lưu trữ bởi Solana Foundation.

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

Nếu bạn muốn có một thiết lập hoàn toàn không cần tin tưởng, bạn có thể tự xây dựng các image Docker 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 image Docker không bị giả mạo. Bạn có thể tìm thấy các script để tạo các image Docker của riêng mình trong Kho lưu trữ Verified builds và bạn có thể fork nó và tự chạy các github action hoặc xác nhận rằng chúng là chính xác.

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

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

Nếu bạn muốn có một thiết lập hoàn toàn không cần tin tưởng, bạn có thể tự chạy Verify API hoặc tự chạy 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 on-chain được lưu trong một PDA được dẫn xuất từ quyền triển khai 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 đội ngũ OtterSec và chưa được đóng băng nên có thể được nâng cấp bất cứ lúc nào.

Solana Foundation, OtterSec và đội ngũ Ellipsis Labs không chịu trách nhiệm về bất kỳ tổn thất hoặc thiệt hại nào có thể xảy ra khi sử dụng quy trình xây dựng đã được xác minh.

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

Ngoài các bản dựng đã xác minh, 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ẽ lưu trữ khóa công khai của trình 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 dẫn xuất từ địa chỉ chương trình và pubkey của trình xác minh. Theo mặc định, đây là 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 trong các hợp đồng thông minh Solana của họ. Lấy cảm hứng từ securitytxt.org, phương pháp này cung cấp một cách thức chuẩn hóa để các nhà nghiên cứu bảo mật liên hệ với những người duy trì dự án, ngay cả khi họ chỉ biết địa chỉ hợp đồng.

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

Đối với nhiều dự án, đặc biệt là các dự án nhỏ hoặc riêng tư, việc xác định nhà phát triển chỉ từ địa chỉ hợp đồng có thể khó khăn và tốn nhiều thời gian. Nhúng tệp security.txt vào chương trình giúp đả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, từ đó có thể ngăn chặn các khai thá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 thực hiện các bước sau:

Thêm dependency 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 để định nghĩa 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. Dưới đâ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ể được truy vấn dễ dàng 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 luôn sẵn sàng cho bất kỳ ai muốn báo cáo các vấn đề tiềm ẩn.

Các phương pháp tốt nhất

  • Sử dụng liên kết: Đối với các 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 trực tiếp vào hợp đồng. Điều này giúp tránh 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 lẫn các 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ệ hơn, thúc đẩy bảo mật tốt hơn và tăng cường giao tiếp trong hệ sinh thái Solana.

Đây là ví dụ về giao diện của security.txt trên 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. Build 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 sang multisig5. Xuất giao dịch PDA6. Gửi giao dịch thông qua Squads7. Gửi yêu cầu 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ụ build đã được xác minhCác chương trình phổ biến đã được xác minhPhoenixSquads V3Drift V2Marginfi V2Câu hỏi thường gặpXác minh của tôi bị thất bại. Tôi phải làm gì?Hash build cục bộ của tôi không khớp với hash onchain. 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 sao 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 program account của mình bao lâu một lần?Điều gì xảy ra khi tôi nâng cấp program account của mình?Tôi có thể tin tưởng vào kết quả xác minh không?Làm thế nào tôi có thể xác minh một chương trình một cách độc lập?Người khác có thể xác minh chương trình của tôi mà không cần quyền không?Tôi cần gì để tạo các bản build có thể xác minh?Tôi có thể xác minh các kho lưu trữ riêng tư không?Làm thế nào để xác minh một 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.txtCác phương pháp tốt nhất
Chỉnh sửa trang