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 Labs và OtterSec. Để 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 Explorer và SolanaFM, 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:
[workspace]members = ["program/programs/*"]resolver = "2"[profile.release]overflow-checks = truelto = "fat"codegen-units = 1[profile.release.build-override]opt-level = 3incremental = falsecodegen-units = 1
Đảm bảo rằng chương trình của bạn nằm trong mảng workspace/members và
Cargo.toml của chương trình có tên lib được cấu hình đúng.
Quan trọng là
lib namechứ không phải tên package!
Một cái gì đó như thế này:
[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 buildhoặccargo build-sbfvì 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-repobạn cần thêm cờ--mount-path. Đây sẽ là đường dẫn đến thư mục chứaCargo.tomlcó 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ờ
--remotecũ trênverify-from-repođã bị ngừng sử dụng. Hãy tải PDA của bạn lên trước, sau đó chạyremote 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 0xDeep và OtterSec 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 muchsolana 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 buildsolana 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-3454c1c2b5b3Verification in progress... ⏳ [00:18:02] ✅ Process completed. (Done in 18minutes) Program 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD has been verified.✅ The provided GitHub build matches the onchain hash. On Chain Hash:96f8c3d9400258f7759408d1f6f8435b4a24d9b52f5a0340d97907e567cb8773 ExecutableHash: 96f8c3d9400258f7759408d1f6f8435b4a24d9b52f5a0340d97907e567cb8773 Repo URL:https://github.com/Woody4618/verify-squads/tree/0fb0a2e30c15c51732c0ad5e837975a6f7bbc7edCheck the verification status at:https://verify.osec.io/status/6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD Joburl: 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 -eexamples/hello_world/target/deploy/hello_world.so -iellipsislabs/hello_world_verifiable_build:latest -p2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn
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 ID2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn Executable path in container:"examples/hello_world/target/deploy/hello_world.so"Executable hash:08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760 Program hash:08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760 Executablematches 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: 6877a5b732b3494b828a324ec846d526d962223959534dbaf4209e0da3b2d6a9Onchain Program Hash: 6877a5b732b3494b828a324ec846d526d962223959534dbaf4209e0da3b2d6a9Program 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-namevì kho lưu trữ Squads bao gồm nhiều chương trình. Chúng ta sử dụng cờ--bpfvìsquads_mplđã được xác minh trước đó bằng Anchor.
Kết quả cuối cùng:
Executable Program Hash from repo: 72da599d9ee14b2a03a23ccfa6f06d53eea4a00825ad2191929cbd78fb69205cOnchain Program Hash: 72da599d9ee14b2a03a23ccfa6f06d53eea4a00825ad2191929cbd78fb69205cProgram 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: e31d58edeabc3c30bf6f2aa60bfaa5e492b41ec203e9006404b463e5adee5828Onchain Program Hash: e31d58edeabc3c30bf6f2aa60bfaa5e492b41ec203e9006404b463e5adee5828Program 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: 890d68f48f96991016222b1fcbc2cc81b8ef2dcbf280c44fe378c523c108fad5Onchain Program Hash: 890d68f48f96991016222b1fcbc2cc81b8ef2dcbf280c44fe378c523c108fad5Program 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 -umvà chọ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:
- 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.
- 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
- Gửi yêu cầu xác minh mới bằng upgrade authority của bạn
- 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-verifycụ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'tcargo install solana-verify# Get the PDA datasolana-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 PDAsolana-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:
- Siêu dữ liệu PDA là xác thực (được lưu trữ trên chuỗi)
- Mã nguồn trong kho lưu trữ của PDA khớp với chương trình đã triển khai
- 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 normallysolana-verify buildsolana program deploy <your-program.so> --program-id YourProgramId...# 2. Verify locally first - confirm the hash matchessolana-verify verify-from-repo -um \--program-id YourProgramId... \https://github.com/your-org/your-program# 3. Export the PDA creation transactionsolana-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 verificationsolana-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:
[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 Fieldspreferred_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?