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 đối với một kho lưu trữ, kho đó cần có tệp Cargo.lock trong thư mục gốc của kho lưu trữ của bạn. Nếu bạn chỉ có một chương trình trong kho lưu trữ và một tệp cargo.lock trong thư mục gốc, bạn có thể trực tiếp chuyển sang bước tiếp theo và xây dựng chương trình của mình.

Nếu chương trình của bạn nằm trong một thư mục con và bạn có một workspace Rust, bạn cần tạo một tệp Cargo.toml workspace trong thư mục gốc của kho lưu trữ của bạn.

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/members và tệp Cargo.toml của chương trình của bạn đã được cấu hình đúng tên lib.

Điều quan trọng là lib name chứ không phải tên gói!

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 kho lưu trữ này, bạn có thể xem một ví dụ về workspace với một chương trình trong thư mục con. Lưu ý rằng khi chương trình nằm trong một 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 tệp Cargo.toml này được đặt đúng vị trí, bạn có thể chạy cargo generate-lockfile để tạo một tệp khóa và tiếp tục xây dựng chương trình của bạn.

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

Để xây dựng chương trình Solana của bạn một cách có thể xác minh, hãy điều hướng đến thư mục chứa tệp 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ự triển khai bản xây dựng đã được xác minh và không vô tình ghi đè lên nó với 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 một mã băm 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 dựng đã 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ó chứa tên thư viện 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 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 để 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 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

Đối với 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: Kiểm tra xem 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 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 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

Điều này sẽ trả về cho bạn một giao dịch mã hóa base58. Nếu bạn muốn một giao dịch 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 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 on-chain được cung cấp cho lệnh. Vì bản build đã được tải lên một image, nên không cần phải rebuild toàn bộ tệp 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-beta.solana.com" against program ID
2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn Executable path in container:
"examples/hello_world/target/deploy/hello_world.so"
Executable hash:
08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760 Program hash:
08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760 Executable
matches on-chain program data ✅

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 sẽ lấy commit cuối cùng trên nhánh main. Bạn cũng có thể xác đị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ì 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 đó 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 ✅

Kết luận

Sử dụng 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à 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ị cho việc 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 cậy trong thiết lập mặc định. Các image docker đượ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 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 nhạy cảm tiềm ẩn.

Nếu bạn muốn có một thiết lập hoàn toàn không cần tin cậy, 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ị can thiệp. Bạn có thể tìm thấy các script để tạo image docker của riêng bạn trong kho lưu trữ Verified builds và bạn có thể fork nó và tự chạy các github actions hoặc xác nhận 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 vào API của OtterSec 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 cậy, bạn có thể tự chạy Verify API hoặc tự chạy việc xác minh chương trình cục bộ bằng cách sử dụ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 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 OtterSec và chưa được cố định nên có thể được nâng cấp bất cứ lúc nào.

Solana Foundation, OtterSec và đội Ellipsis Labs không chịu trách nhiệm cho 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 xây 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 pubkey của trình xác minh để dễ dàng truy cập vào dữ liệu xác minh được lưu trữ 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ỉ của chương trình và pubkey của trình 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 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 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 tiêu chuẩn hóa để các nhà nghiên cứu bảo mật liên hệ với người duy 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à 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 thời gian. Việc nhúng tệp security.txt 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, tiềm 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 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 để 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í là 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!"
}

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 luôn sẵn có 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 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ó thể xác thực cả chương trình onchain và 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ệ với bạn hơn, thúc đẩy bảo mật tốt hơn và cải thiện giao tiếp 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

Is this page helpful?