
PDA trên Solana là gì? Giải thích & Ví dụ (2026)
Cảm ơn 0xIchigo đã duyệt bài, Unboxed Software đã cung cấp chương trình đánh giá phim và Paul Verhoeven đã làm ra Robocop.
Các chương trình Solana (hợp đồng thông minh) lưu trữ dữ liệu trong các tài khoản riêng biệt được gọi là Program Derived Address (PDA).
Các PDA có thể được truy cập và cập nhật độc lập, giúp giảm xung đột và cho phép xử lý song song.
Mặc dù PDA không phải là một khái niệm khó, các nhà phát triển mới vẫn có thể gặp khó khăn khi tìm hiểu về chúng.
Bài viết này sẽ giúp bạn hình dung PDA như các kho khóa/giá trị và chia sẻ bốn ví dụ thực tế về PDA.
Hãy bắt đầu.
PDA dưới dạng kho dữ liệu khóa/giá trị
Kho khóa/giá trị đã tồn tại trong lĩnh vực lập trình từ nhiều năm trước khi blockchain ra đời. Đây là một cách tìm dữ liệu nhanh chóng. Việc tra cứu giá trị tại một khóa nhất định trong kho luôn trả về cùng một dữ liệu.
Trong mô hình lập trình của Solana, hệ thống PDA chính là kho khóa/giá trị của chương trình.
Khóa cho mỗi phần dữ liệu là một loại địa chỉ đặc biệt, được tạo từ các seed đầu vào do lập trình viên xác định.
Cùng một tập hợp seed luôn tạo ra cùng một địa chỉ, vì vậy bất kỳ ai cũng có thể tìm dữ liệu theo cách xác định với một tập hợp seed nhất định.
Địa chỉ PDA sẽ không bao giờ xung đột với các khóa công khai thực tế vì giá trị của chúng nằm ‘ngoài đường cong’. Nói cách khác, các địa chỉ được tạo cho PDA khác biệt về mặt toán học với các giá trị khóa công khai tồn tại trên đường cong Ed25519 của Solana.
Giá trị là một struct (hoặc đối tượng) chứa các trường và giá trị mà bạn, tác giả chương trình, muốn lưu trữ tại đó.
Cách tốt nhất để giải thích PDA là qua ví dụ, vì vậy hãy cùng xem các ví dụ sau.
1. PDA để lưu trữ token liên kết với ví
Hãy bắt đầu với chương trình của người khác—một chương trình bạn đã sử dụng. Bạn đã biết rằng ví của mình có nhiều token khác nhau và mỗi token có số dư riêng. Chào mừng đến với ví dụ đầu tiên về PDA!
Mỗi số dư token của bạn được lưu trong một tài khoản PDA, với các seed do chương trình Associated Token Account xác định.
Hãy xem chính xác cách thức hoạt động:
Tóm tắt video
Chương trình: chương trình Associated Token Account
Mục đích của tài khoản: lưu trữ số dư của một token duy nhất trong ví
Seed: địa chỉ ví và địa chỉ mint của token
Dữ liệu: số dư của token này trong ví này
Lợi ích:
Có một vị trí chuẩn để tra cứu lượng nắm giữ một token cụ thể của người dùng. Vì số dư của người dùng nằm trong các tài khoản riêng biệt, nhiều giao dịch có thể chạy song song, giúp Solana hoạt động nhanh!
2. PDA để lưu trữ dữ liệu của chương trình
Tốt rồi, nhưng làm thế nào để dùng PDA làm kho dữ liệu đa mục đích trong các chương trình Solana? Cần cân nhắc điều gì khi thiết kế seed và dữ liệu cho PDA?
Tóm tắt video
Chương trình: một chương trình đánh giá phim sử dụng quyền sở hữu tài sản để tăng khả năng các bài đánh giá là xác thực
Mục đích của tài khoản: lưu trữ bài đánh giá phim của từng chủ sở hữu tài sản
Seed: địa chỉ ví, tên phim và năm phát hành
Dữ liệu:
- một bài đánh giá bằng văn bản (
string) - điểm đánh giá từ 0-10 được lưu dưới dạng
u8
Lợi ích:
Có một vị trí chuẩn để tra cứu bài đánh giá của người dùng về một bộ phim cụ thể. Người dùng có thể cập nhật bài đánh giá song song mà không cản trở nhau. Thiết kế PDA thông minh này đảm bảo mỗi người dùng chỉ có một bài đánh giá cho mỗi phim, đồng thời xử lý các trường hợp ngoại lệ như kẻ xấu làm lại Robocop.
3. PDA để thiết lập các giá trị có thể cấu hình cho chương trình
Khi xây dựng ứng dụng riêng, bạn có thể sẽ cần thiết lập một số giá trị có thể cấu hình trong suốt vòng đời của chương trình:
- Các giá trị không đổi (ví dụ: phí trên nền tảng)
- Danh sách địa chỉ mint của các token mà chương trình sẽ sử dụng
- Các cờ tính năng có thể bật và tắt tùy ý
- Chương trình đang hoạt động hay tạm dừng (ví dụ: cho phép tài khoản quản trị viên tạm dừng chương trình là một tính năng khẩn cấp “phá kính” phổ biến trong nhiều chương trình blockchain)
Ta không muốn nâng cấp chương trình chỉ để thay đổi những giá trị này, vì vậy hãy đưa cấu hình vào một tài khoản PDA! Sau đó, ta có thể tạo các trình xử lý instruction để cập nhật những giá trị này và kiểm tra xem các instruction đến có được ký bởi tài khoản ‘quản trị viên’ được chỉ định hay không.
Trong trường hợp này, cấu hình sẽ có danh sách các khóa công khai được cho phép để giới hạn những ai có thể tương tác với chương trình, nhưng ta cũng có thể thêm bất kỳ cài đặt cấu hình nào khác.
Đây là một ví dụ thú vị vì có thể không dễ nhận ra rằng PDA có thể được dùng để lưu trữ cấu hình toàn cục như vậy!
Tóm tắt video
Chương trình: bất kỳ chương trình nào bạn đã tạo
Mục đích của tài khoản: lưu trữ một số cấu hình có thể cập nhật linh hoạt
Seed: "config"
Dữ liệu: cấu hình của chúng ta, trong trường hợp này là danh sách cho phép và tài khoản quản trị viên
allow_list: một vector gồm các khóa công khai của những người dùng được phép sử dụng ứng dụng nàyauthority: khóa công khai của một tài khoản có thể thay đổi các cài đặt này (các ứng dụng Solana thường dùng từauthorityđể biểu thị một loại quyền hạn). Ta sẽ đảm bảo tài khoản này ký các thao tác đặc quyền!
Lợi ích:
Thay vì mã hóa cứng một cấu hình nhất định vào mã nguồn, ta có thể cập nhật cấu hình ngay lập tức bằng một hàm instruction trong chương trình.
Các bản cập nhật cấu hình cũng không bị chặn bởi những thay đổi đối với dữ liệu không liên quan. Khi triển khai chương trình lần đầu, bạn cũng nên chạy intialize_config() và thiết lập authority!
4. PDA để sở hữu và chuyển token
PDA không chỉ dùng để lưu trữ dữ liệu. PDA cũng có thể sở hữu tài khoản token riêng. Sau đó, chương trình ký giao dịch với tư cách PDA để chuyển token từ các tài khoản token đó đến nơi khác. Điều này cho phép chương trình lưu trữ và chuyển giá trị:
Tóm tắt video
Chương trình: chương trình swap
Mục đích của tài khoản:
- Lưu trữ thông tin chi tiết của một đề nghị swap, cụ thể là loại token và số lượng token mà người tạo đề nghị muốn nhận lại để đổi lấy số token họ đã cung cấp.
- PDA này sở hữu một tài khoản token, nơi lưu trữ số token đã cung cấp. PDA có thể ký giao dịch và chuyển token từ tài khoản này đến người nhận.
Seed: "offer", ID của đề nghị (bất kỳ mã định danh nào, miễn là chưa được sử dụng) và địa chỉ của người tạo đề nghị
Dữ liệu:
maker_wanted_token: token muốn nhận lại, dưới dạng khóa công khai của địa chỉ mint của tokenmaker_wanted_amount: số lượng token muốn nhận (u64)
Lợi ích:
PDA này cho phép người dùng lưu trữ dữ liệu, đồng thời đóng vai trò chủ sở hữu của một tài khoản token để giữ token và chuyển chúng sang các tài khoản khác.
Tổng kết
Trên đây là bốn ví dụ thực tế về PDA trên Solana.
Thứ nhất, chương trình Associated Token Account sử dụng PDA để lưu trữ số dư của từng token mà ví sở hữu.
Thứ hai, chương trình do bạn viết có thể lưu trữ dữ liệu liên kết với những người dùng cụ thể bằng khóa công khai của họ hoặc với các mục dữ liệu cụ thể bằng ID mà bạn đã đặt cho chúng.
Thứ ba, các chương trình có thể lưu trữ cấu hình riêng trong một PDA, với các trình xử lý instruction chỉ dành cho quản trị viên để giới hạn những ai có thể sửa đổi các cài đặt này.
Thứ tư, PDA có thể sở hữu tài khoản token riêng, cho phép chương trình giữ tiền. Chương trình có thể ‘ký thay’ cho các giao dịch sử dụng những token này chỉ bằng cách chỉ định seed của PDA sở hữu chúng.
PDA không chỉ giúp Solana hoạt động nhanh mà còn cung cấp một kho khóa/giá trị hoàn chỉnh, cho phép chương trình nhanh chóng tìm thấy dữ liệu dựa trên các seed mà bạn chỉ định.
Chúc bạn sử dụng PDA vui vẻ và hãy xem thêm nhiều phim của Paul Verhoeven!
Bài viết liên quan
Đăng ký nhận tin từ Helius
Luôn cập nhật những thông tin mới nhất về phát triển Solana và nhận thông báo khi chúng tôi đăng bài


