Lanjutan Pelajaran 4 Baca 4 menit

ECDSA langkah demi langkah: bagaimana sebuah tanda tangan dihitung

Sebuah nonce, dua perkalian, dan dua angka, r dan s. Pelajaran ini menghitung dan memverifikasi tanda tangan secara keseluruhan.

Sebuah tanda tangan bitcoin terdiri dari dua angka, r dan s. Prosedur yang menghasilkan keduanya dapat dijelaskan dalam lima baris, verifikasinya dalam tiga baris, dan alasan mengapa ini berfungsi dapat dijelaskan dalam satu substitusi aljabar. Pelajaran ini mencakup ketiga hal tersebut.

Mari mulai dengan apa yang masuk. Pesan yang ditandatangani adalah transaksi, diringkas oleh SHA-256 dan dibaca sebagai sebuah angka, yang disebut z. Kunci privat adalah angka d, dan kunci publik adalah titik Q, yang bernilai d kali G. Ada juga bahan ketiga, yang diundi saat itu, yaitu nonce k.

Menandatangani memiliki empat langkah. Undi k antara satu dan n kurang satu. Hitung titik k kali G dan ambil koordinat x-nya, dikurangi modulo n: itulah r. Hitung s sebagai kebalikan dari k dikalikan dengan jumlah z dan r kali d, semuanya modulo n. Tanda tangan adalah pasangan r, s. Jika r atau s bernilai nol, undi k lain — yang dalam praktiknya hampir tidak pernah terjadi.

Perhatikan bahwa kunci privat d muncul hanya sekali, di baris ketiga, dicampur dengan z dan dilindungi oleh perkalian dengan kebalikan dari k. Tidak ada dalam r atau s yang memungkinkan untuk mengisolasinya — selama k berbeda setiap kali, dan pelajaran berikutnya sepenuhnya tentang apa yang terjadi ketika tidak demikian.

Verifikasi memiliki tiga langkah, dan yang memverifikasi hanya memiliki transaksi, kunci publik Q, dan pasangan r, s. Hitung kebalikan dari s modulo n. Kalikan z dengannya dan sebut sebagai u1; kalikan r dengannya dan sebut sebagai u2. Jumlahkan titik u1 kali G dan u2 kali Q. Tanda tangan berlaku jika koordinat x dari titik yang dihasilkan, dikurangi modulo n, sama dengan r.

Dua pandangan bertemu tepat di titik yang sama, dan tidak ada satupun yang harus pergi ke sana.

Sekarang substitusi yang menjelaskan semuanya. Titik yang dihitung dalam verifikasi adalah u1 kali G ditambah u2 kali Q. Mengganti Q dengan d kali G, ini menjadi kebalikan dari s mengalikan jumlah z dengan r kali d, semuanya kali G. Tetapi s didefinisikan persis sebagai kebalikan dari k kali jumlah yang sama — jadi kebalikan dari s kali jumlah adalah k. Titik yang dihasilkan verifikasi adalah k kali G: tepatnya titik yang dihitung penandatangan pada langkah kedua, dan koordinat x-nya menjadi r yang sedang dibandingkan.

Inilah sebabnya mengapa verifikasi berfungsi tanpa mengungkapkan apapun. Yang memeriksa tidak menemukan d, tidak menemukan k, dan tidak pernah mengetahui hasil undian. Dia hanya merekonstruksi titik yang sama melalui jalur yang berbeda dan mengonfirmasi bahwa kedua jalur bertemu.

Tiga detail praktis menutup topik ini.

Yang pertama adalah bahwa r hanya menyimpan koordinat x dari titik, dan ketinggiannya dibuang. Karena setiap x sesuai dengan dua titik, satu di atas dan satu di bawah sumbu, tanda tangan sendirian tidak mengatakan yang mana dari keduanya. Itulah sebabnya memulihkan kunci publik dari tanda tangan memerlukan bit ekstra untuk pemulihan, dan itulah sebabnya transaksi umum membawa kunci publik daripada menyimpulkannya.

Bayangan menunjukkan di mana, tidak menunjukkan pada ketinggian berapa.

Yang kedua adalah konsekuensi yang mengganggu dari simetri. Untuk setiap tanda tangan yang valid dengan nilai s, nilai n kurang s juga valid — ada dua pasangan berbeda yang membuktikan hal yang sama. Ini memungkinkan mengubah pengidentifikasi transaksi tanpa membuatnya tidak valid, cacat yang disebutkan dalam perang blok. Sejak 2016, jaringan mengharuskan nilai terkecil dari dua nilai tersebut, dan jalur lainnya ditutup.

Dua jalur mencapai tempat yang sama. Aturan menutup salah satunya.

Yang ketiga adalah kemasan. Kedua angka tersebut dikirim dalam format yang diwarisi dari standar sertifikat, DER, yang memakan antara tujuh puluh hingga tujuh puluh dua byte karena penanda panjang dan tipe. Tanda tangan Schnorr, yang dibawa oleh Taproot, memiliki enam puluh empat byte tetap dan tanpa hiasan — sebagian dari penghematan pembaruan tersebut ada di sini.

Matematika dalam pelajaran ini solid dan belum pernah dipecahkan. Yang pernah dipecahkan, dengan kerugian nyata dan dalam lebih dari satu kasus terkenal, adalah undian pada baris ketiga. Pada pelajaran berikutnya, nonce yang diulang dan aljabar sekolah menengah yang mengungkapkan kunci privat.