Program Derived Addresses (PDAs) là các địa chỉ tài khoản 32-byte được tạo ra
một cách xác định từ program ID và một tập hợp các seed. Chúng được đảm bảo
không nằm trên đường cong Ed25519, có nghĩa là không tồn tại private key cho
chúng. Chỉ có chương trình mà ID của nó được sử dụng trong quá trình tạo ra mới
có thể "ký" cho PDA, và nó thực hiện điều này thông qua
invoke_signed trong quá trình cross-program invocations
(CPIs).
Program Derived Address
PDA Derivation
Thuật toán tạo ra, canonical bump, các ví dụ về findProgramAddress với nhiều loại seed khác nhau.
PDA Accounts
Tạo tài khoản tại địa chỉ PDA, ký bằng invoke_signed, các mẫu Anchor.
Các điểm chính
- Xác định: Cùng một seed và program ID luôn tạo ra cùng một địa chỉ.
- Ngoài đường cong: Địa chỉ được tạo ra được xác minh là không phải public key Ed25519 hợp lệ. Nếu hash tình cờ nằm trên đường cong, quá trình tạo ra sẽ thất bại và một bump seed khác sẽ được thử.
- Không có private key: Vì địa chỉ nằm ngoài đường cong, không ai có thể tạo
ra chữ ký mật mã cho nó. Chương trình "ký" thông qua cơ chế
invoke_signedcủa runtime.
Khi nào sử dụng PDAs
- Địa chỉ xác định: Tạo ra cùng một tài khoản từ cùng một seed mỗi lần.
- Ký bởi chương trình: Chỉ có chương trình sở hữu mới có thể ký thông qua
invoke_signed, cho phép các chương trình hoạt động như các cơ quan có thẩm quyền tự chủ. - Trạng thái theo người dùng: Tạo ra các tài khoản cho từng người dùng từ
pubkey seed của người dùng (ví dụ:
["user", user_pubkey]). - Không cần quản lý keypair: Không có private key để lưu trữ hoặc mất. Địa chỉ được tạo ra hoàn toàn từ các seed.
Giới hạn
| Giới hạn | Giá trị | Nguồn |
|---|---|---|
| Số lượng seed tối đa | 16 | MAX_SEEDS |
| Độ dài seed tối đa | Tối đa 32 byte mỗi seed | MAX_SEED_LEN |
| Phạm vi bump | 0-255 (1 byte) | Được thêm vào như phần tử seed cuối cùng |
Chi phí create_program_address | 1.500 CU | create_program_address_units |
Chi phí find_program_address trường hợp xấu nhất | 1.500 ban đầu + 1.500 x số lần lặp | 1.500 khi bắt đầu + 1.500 cho mỗi bump thất bại |
| Số lượng PDA signer tối đa mỗi CPI | 16 | MAX_SIGNERS |
Is this page helpful?