Ký từng phần cho phép nhiều bên ký cùng một giao dịch vào các thời điểm hoặc trên các thiết bị khác nhau. Bên điều phối xây dựng thông điệp, mỗi người ký bắt buộc ký lên chính xác các byte của thông điệp đã được tuần tự hóa, và bên điều phối xác minh rồi hợp nhất các chữ ký trước khi gửi.
Chữ ký xác thực các byte, không phải ý định
Việc thay đổi người trả phí, blockhash, thứ tự instruction, danh sách tài khoản, hoặc bất kỳ instruction data nào sẽ tạo ra một thông điệp khác và làm mọi chữ ký đã thu thập trở nên vô hiệu.
Quy trình ký từng phần
- Thống nhất các instruction của giao dịch và người sẽ trả phí.
- Thiết lập thời hạn hiệu lực của giao dịch và người trả phí.
- Tuần tự hóa thông điệp một lần duy nhất. Coi các byte đó là bất biến.
- Phân phối các byte của thông điệp cùng bản tóm tắt dễ đọc cho từng người ký.
- Thu thập và xác minh từng chữ ký Ed25519 dựa trên cùng các byte của thông điệp.
- Gắn các chữ ký vào địa chỉ người ký bắt buộc tương ứng.
- Xác nhận mọi chữ ký bắt buộc đều có mặt và hợp lệ, sau đó gửi giao dịch.
Ví dụ hoàn chỉnh
Người trả phí và người gửi SOL dưới đây ký độc lập với nhau. Bên điều phối xác minh cả hai chữ ký, hợp nhất chúng và gửi giao dịch đã hoàn chỉnh.
Ví dụ này sử dụng chữ ký Ed25519 thô để làm rõ ranh giới giữa bên điều phối và từng người ký. Ví, thiết bị phần cứng, dịch vụ lưu ký hoặc người ký ngoại tuyến có thể thay thế bất kỳ keypair cục bộ nào, miễn là họ ký chính xác cùng các byte của thông điệp.
Cố định thông điệp trước khi ký
Mỗi chữ ký bao phủ toàn bộ thông điệp giao dịch đã được tuần tự hóa. Thông điệp bao gồm tất cả những thành phần sau:
- người trả phí
- blockhash gần đây hoặc durable nonce
- địa chỉ của mọi chương trình và tài khoản
- quyền ký và quyền ghi của tài khoản
- thứ tự instruction và instruction data
Hãy xây dựng các trường này trước, tuần tự hóa thông điệp một lần và phân phối mảng byte đó cho mọi người ký. Nên lưu một bản băm (digest) của thông điệp cùng với mỗi yêu cầu ký để bên điều phối có thể từ chối chữ ký được trả về cho một thông điệp khác.
Đừng giải tuần tự hóa thông điệp, chỉnh sửa nó rồi mong các chữ ký đã thu thập trước đó vẫn còn hợp lệ. Ngay cả một thay đổi có vẻ mang tính vận hành, chẳng hạn thay blockhash đã hết hạn hoặc đổi người trả phí, cũng yêu cầu mọi người ký phải ký lại.
Điều phối người trả phí
Người trả phí luôn là người ký bắt buộc và phải được chọn trước khi thông điệp được cố định. Hãy xác nhận tài khoản có đủ SOL cho phí cơ bản và mọi phí ưu tiên. Nếu một bên tài trợ hoặc backend sẽ trả phí, hãy đặt địa chỉ đó vào thông điệp trước khi thu thập chữ ký của người dùng; việc thêm bên tài trợ sau đó sẽ làm thay đổi các byte đã ký.
Bên điều phối cần xác minh rằng chữ ký nhận được thuộc về một địa chỉ nằm trong danh sách người ký bắt buộc. Tuyệt đối không chấp nhận khóa công khai tùy ý rồi gắn nó vào giao dịch.
Quản lý thời hạn hiệu lực của giao dịch
Giao dịch dùng blockhash gần đây chỉ hợp lệ khi blockhash của nó vẫn còn trong
hàng đợi blockhash gần đây của validator. Trước khi bắt đầu quy trình ký nhiều bên,
hãy ước tính xem liệu tất cả người ký có thể phản hồi trước lastValidBlockHeight hay không.
Nếu blockhash hết hạn, hãy xây dựng thông điệp mới với blockhash mới và thu thập lại tất cả chữ ký. Với các quy trình có thể kéo dài hơn hoặc có người ký ngoại tuyến, hãy dùng durable nonce. Durable nonce tránh được khoảng thời gian giới hạn của blockhash gần đây, nhưng việc tăng hoặc tiêu thụ nonce đó theo cách khác vẫn sẽ làm vô hiệu giao dịch đang chờ.
Xác minh trước khi gửi
Với mỗi chữ ký được trả về:
- Xác minh chữ ký dựa trên các byte của thông điệp đã cố định và khóa công khai của người ký dự kiến.
- Gắn nó vào vị trí của người ký đó trong mảng chữ ký của giao dịch.
- Xác minh giao dịch đã lắp ghép có chữ ký hợp lệ cho mọi người ký bắt buộc.
- Gửi giao dịch đã tuần tự hóa mà không xây dựng lại thông điệp của nó.
Sau khi gửi, hãy xác nhận bằng chính thông tin về thời hạn hiệu lực đã được đưa vào thông điệp đã ký. Nếu quá trình xác nhận báo blockhash đã hết hạn hoặc nonce đã bị tiêu thụ, đừng thử lại với giao dịch đã chỉnh sửa; hãy bắt đầu lại quy trình ký.
Is this page helpful?