Blockchain/Tahap II · Mekanisme/2.1 Kriptografi/Pelajaran 6
Alamat dan pengekodan: Base58Check, Bech32, Bech32m
Abjad ralat: dari Base58Check hingga checksum BCH
BahanAntara muka penjelajah blok (contohnya, mempool.space atau blockchain.com)Editor teks untuk membandingkan panjang rentetanDokumen spesifikasi BIP-173 dan BIP-350
Ingin tahu
- Mengapa perubahan satu aksara dalam alamat hampir selalu merosakkannya, namun sesetengah kesilapan taip masih terlepas?
- Bagaimanakah rentetan huruf dan nombor boleh berfungsi sebagai peta kepada skrip penguncian tertentu tanpa menyimpan skrip tersebut dalam rantaian?
- Apakah yang boleh dijamin oleh Bech32 tentang kesilapan taip, sedangkan Base58Check hanya mampu menjadikannya tidak berkemungkinan?
Teroka
- Alamat bukanlah objek yang disimpan dalam set UTXO; ia ialah pengekodan skrip output yang mesra manusia. Rantaian hanya menyimpan bait, tetapi perisian menterjemahkannya kepada rentetan untuk dibaca dan ditaip oleh manusia. Lapisan terjemahan ini mesti mencegah ralat transkripsi, kerana alamat yang salah taip tetapi masih kelihatan sah boleh menghantar dana ke tempat yang salah. Reka bentuk asal Satoshi, Base58Check, menangani masalah ini dengan menggunakan abjad 58 aksara yang mengecualikan aksara yang mengelirukan secara visual, iaitu '0', 'O', 'I' dan 'l'.
- Base58Check mengekodkan bait versi, muatan (payload, seperti hash 20 bait), dan checksum empat bait. Checksum ini diterbitkan daripada empat bait pertama hash SHA-256 berganda bagi data sebelumnya. Alamat Pay-to-Public-Key-Hash (P2PKH) legasi menggunakan bait versi 0x00, menghasilkan rentetan yang bermula dengan '1'. Pay-to-Script-Hash (P2SH) menggunakan bait versi 0x05, menghasilkan rentetan yang bermula dengan '3'. Struktur ini membolehkan dompet mengesahkan integriti sebelum menerima sesuatu alamat.
- Segregated Witness (SegWit), yang diaktifkan pada Ogos 2017 di blok 481,824, memperkenalkan output witness natif yang memerlukan pengekodan baharu. Base58Check kurang sesuai untuk struktur data yang lebih panjang dan corak ralat khusus SegWit. Pieter Wuille dan Greg Maxwell mencadangkan Bech32 dalam BIP-173 (2017). Ia menggunakan set aksara terhad sebanyak 32 aksara—digit dan huruf kecil kecuali '1', 'b', 'i' dan 'o', dengan '1' dikhaskan sebagai pemisah. Penggunaan satu jenis huruf sahaja mengelakkan kekeliruan dan sesuai untuk kod QR.
- Alamat Bech32 bermula dengan bahagian yang boleh dibaca manusia 'bc' dan pemisah '1', diikuti oleh data dan checksum enam aksara. Checksum ini berasaskan kod Bose-Chaudhuri-Hocquenghem (BCH), yang jauh lebih kuat daripada checksum Base58Check yang diterbitkan daripada SHA-256. Kod BCH menjamin pengesanan sebarang ralat yang menjejaskan sehingga empat aksara dan sering dapat menentukan kedudukan kesilapan taip. Alamat SegWit v0 natif (P2WPKH dan P2WSH) menggunakan format ini, bermula dengan 'bc1q'.
- Para pembangun kemudian mengenal pasti kelemahan dalam polinomial Bech32 asal: memasukkan atau memadam urutan aksara tertentu boleh menghasilkan alamat yang sah tetapi berbeza. Untuk memperbaiki masalah ini tanpa merosakkan alamat v0 sedia ada, BIP-350 (2020) memperkenalkan Bech32m. Ia mengubah satu pemalar dalam pengiraan checksum supaya tindakan memasukkan atau memadam sebegini dapat dikesan. Alamat Taproot (versi SegWit 1), yang diaktifkan pada November 2021, menggunakan Bech32m dan bermula dengan ‘bc1p’.
- Alamat testnet menggunakan awalan 'tb1' dan bukannya 'bc1'. Bahagian data mengekodkan program witness: hash kunci awam atau skrip bagi SegWit versi 0, atau kunci awam ter-tweak (tweaked) 32 bait bagi Taproot. Apabila perisian mengimbas kod QR atau menerima input manual, ia menjalankan fungsi polymod BCH untuk mengesahkan integriti. Buka penjelajah blok dan cari satu alamat bagi setiap jenis: P2PKH legasi yang bermula dengan '1', SegWit v0 yang bermula dengan 'bc1q', dan alamat Taproot yang bermula dengan 'bc1p'. Catatkan panjang dan awalannya.
Fakta utama
- Base58Check menggunakan abjad 58 aksara, mengecualikan '0', 'O', 'I' dan 'l', serta menyertakan checksum empat bait yang diterbitkan daripada SHA-256 berganda.
- Alamat P2PKH legasi bermula dengan '1' (bait versi 0x00), manakala alamat P2SH bermula dengan '3' (bait versi 0x05).
- Bech32, yang ditakrifkan dalam BIP-173 (2017), menggunakan set 32 aksara dan checksum berasaskan BCH untuk mengesan ralat yang mempengaruhi sehingga empat aksara.
- Alamat SegWit v0 natif (P2WPKH/P2WSH) menggunakan pengekodan Bech32 dan bermula dengan 'bc1q'.
- Bech32m, yang ditakrifkan dalam BIP-350 (2020), memperbaiki kelemahan checksum pada Bech32 dan merupakan syarat wajib untuk versi SegWit 1 hingga 16.
- Alamat Taproot (versi SegWit 1) menggunakan pengekodan Bech32m dan bermula dengan ‘bc1p’.
Latihan sembilan, enam, tiga, satu
9KumpulCari 9 alamat Bitcoin sebenar daripada penjelajah blok: tiga yang bermula dengan '1', tiga yang bermula dengan '3', dua yang bermula dengan 'bc1q', dan satu yang bermula dengan 'bc1p'.
6KelompokkanKumpulkan 9 alamat tersebut ke dalam 6 kategori berdasarkan awalan, panjang, dan jenis skrip yang diwakilinya.
3SaringKurangkan 6 kumpulan tersebut kepada 3 perbezaan asas dalam cara pengekodan ini mengendalikan integriti data dan kekaburan visual.
1KristalkanTulis 1 ayat yang menerangkan mengapa peralihan daripada Base58Check kepada Bech32 didorong oleh matematik pengesanan ralat dan bukan sekadar estetika.
Semakan fakta
Tarikh, angka dan dakwaan telah disemak berbanding dengan sumber yang diterbitkan yang disenaraikan di bawah.