Penandatanganan parsial memungkinkan beberapa pihak menandatangani transaksi yang sama pada waktu yang berbeda atau di perangkat yang berbeda. Koordinator membangun pesan, setiap penanda tangan yang diperlukan menandatangani byte pesan terserialisasi yang persis sama, dan koordinator memverifikasi serta menggabungkan tanda tangan tersebut sebelum pengiriman.
Tanda tangan mengotorisasi byte, bukan maksud
Mengubah fee payer, blockhash, urutan instruksi, daftar akun, atau instruction data apa pun akan menghasilkan pesan yang berbeda dan membatalkan setiap tanda tangan yang sudah dikumpulkan.
Alur penandatanganan parsial
- Sepakati instruksi transaksi dan siapa yang akan membayar biaya.
- Tetapkan masa berlaku transaksi dan fee payer.
- Serialisasikan pesan satu kali saja. Perlakukan byte tersebut sebagai data yang tidak dapat diubah.
- Distribusikan byte pesan beserta ringkasan yang mudah dibaca manusia kepada setiap penanda tangan.
- Kumpulkan dan verifikasi setiap tanda tangan Ed25519 terhadap byte pesan yang sama.
- Lampirkan tanda tangan ke alamat penanda tangan yang diwajibkan.
- Pastikan setiap tanda tangan yang diperlukan tersedia dan valid, lalu kirim.
Contoh lengkap
Fee payer dan pengirim SOL di bawah ini menandatangani secara independen. Koordinator memverifikasi kedua tanda tangan, menggabungkannya, dan mengirim transaksi yang sudah lengkap.
Contoh ini menggunakan penandatanganan Ed25519 mentah untuk membuat batas antara koordinator dan setiap penanda tangan menjadi eksplisit. Dompet, perangkat keras, layanan custody, atau penanda tangan offline dapat menggantikan salah satu keypair lokal selama menandatangani byte pesan yang persis sama.
Bekukan pesan sebelum menandatangani
Setiap tanda tangan mencakup pesan transaksi yang telah diserialisasi. Pesan tersebut mencakup semua hal berikut:
- fee payer
- blockhash terbaru atau durable nonce
- setiap alamat program dan akun
- izin signer dan writable pada akun
- urutan instruksi dan instruction data
Bangun bidang-bidang ini terlebih dahulu, serialisasikan pesan satu kali, dan distribusikan array byte tersebut ke setiap penanda tangan. Sebaiknya simpan digest pesan bersama setiap permintaan penandatanganan agar koordinator dapat menolak tanda tangan yang dikembalikan untuk pesan yang berbeda.
Jangan mendeserialisasi pesan, mengubahnya, lalu berharap tanda tangan yang sebelumnya dikumpulkan tetap valid. Bahkan perubahan yang tampak operasional, seperti mengganti blockhash yang kedaluwarsa atau mengubah fee payer, mengharuskan setiap penanda tangan untuk menandatangani ulang.
Koordinasikan fee payer
Fee payer selalu merupakan penanda tangan yang wajib dan harus dipilih sebelum pesan dibekukan. Pastikan akun tersebut memiliki SOL yang cukup untuk biaya dasar dan biaya prioritas apa pun. Jika sponsor atau backend akan membayar biaya, masukkan alamat tersebut ke dalam pesan sebelum mengumpulkan tanda tangan pengguna; menambahkan sponsor di kemudian hari mengubah byte yang ditandatangani.
Koordinator harus memverifikasi bahwa tanda tangan yang masuk berasal dari alamat yang terdaftar sebagai penanda tangan yang wajib. Jangan pernah menerima public key sembarangan dan menambahkannya ke transaksi.
Kelola masa berlaku transaksi
Transaksi dengan recent blockhash hanya valid selama blockhash-nya masih berada di
antrean recent blockhash milik validator. Sebelum memulai alur penandatanganan multi-pihak,
perkirakan apakah semua penanda tangan dapat merespons sebelum lastValidBlockHeight.
Jika blockhash kedaluwarsa, bangun pesan baru dengan blockhash yang baru dan kumpulkan semua tanda tangan kembali. Untuk alur kerja yang mungkin memakan waktu lebih lama atau melibatkan penanda tangan offline, gunakan durable nonce. Durable nonce menghindari jendela recent blockhash, tetapi memajukan atau menggunakan nonce tersebut tetap akan membatalkan transaksi yang tertunda.
Verifikasi sebelum pengiriman
Untuk setiap tanda tangan yang dikembalikan:
- Verifikasi tanda tangan terhadap byte pesan yang telah dibekukan dan public key penanda tangan yang diharapkan.
- Lampirkan ke slot penanda tangan tersebut dalam array tanda tangan transaksi.
- Verifikasi bahwa transaksi yang telah dirakit memiliki tanda tangan yang valid untuk setiap penanda tangan yang diwajibkan.
- Kirim transaksi yang telah diserialisasi tanpa membangun ulang pesannya.
Setelah pengiriman, lakukan konfirmasi menggunakan informasi masa berlaku yang sama seperti yang disertakan dalam pesan yang ditandatangani. Jika konfirmasi melaporkan blockhash yang kedaluwarsa atau nonce yang sudah digunakan, jangan coba lagi dengan transaksi yang dimodifikasi; mulai ulang alur penandatanganan.
Is this page helpful?