Pengarang: SJORS PROVOOST

Sumber: https://sprovoost.nl/2022/11/10/what-is-a-bitcoin-address/

Alamat Bitcoin bukan bagian dari blockchain Bitcoin, namun merupakan token yang digunakan perangkat lunak Bitcoin (dompet) untuk berkomunikasi ke mana harus mengirim Bitcoin: baik ke kunci publik tertentu (P2PK) atau Hash kunci publik (P2PKH) , hash skrip (P2SH), hash kunci publik SegWit (P2WPKH), atau hash skrip SegWit (P2WSH). Alamat tersebut juga berisi beberapa metadata tentang tipenya.

(Catatan Penerjemah: Jenis alamat Bitcoin akan terus meningkat seiring dengan peningkatan jaringan Bitcoin dan standarisasi metode skrip. Faktanya, jenis alamat yang disebutkan di atas, kecuali P2PK dan P2PKH, muncul dengan rilis awal Bitcoin. , sisanya datang kemudian. Sekarang, karena peningkatan Taproot diaktifkan pada tahun 2021, Bitcoin memiliki jenis alamat lain "P2TR").

Alamat Bitcoin menggunakan sistem penomoran unik untuk menyatakan metode pembayaran di atas. Artikel ini akan memperkenalkan masing-masing sistem penomoran yang berbeda dan memberikan analisis mendalam tentang keunggulan alamat Bitcoin secara umum dan alamat bech32. Selain itu, kami akan menjelaskan dari mana asal kerentanan (ancaman lebih rendah) yang terkandung dalam alamat bech32 versi pertama dan bagaimana cara mengatasinya. Terakhir, kita membahas dampak komputasi kuantum.

- Artikel ini dikutip dari buku baru saya (Bitcoin: Unfinished Research) -

latar belakang sejarah

Saat Anda mengirim Bitcoin ke seseorang, pada dasarnya Anda membuat transaksi dengan banyak masukan dan setidaknya satu keluaran. Output menentukan siapa yang dapat membelanjakannya melalui batasan bawaan (secara hukum disebut pembebanan, yang membatasi pengalihan kepemilikan suatu aset).

Beban paling sepele adalah mengizinkan siapa pun membelanjakan bitcoinnya. Ini bukan ide bagus karena Bitcoin akan cepat dicuri. Oleh karena itu, pada masa-masa awal perkembangan Bitcoin, sebagian besar Bitcoin di blockchain hanya dapat menggunakan dua batasan: Pay-to-Public-Key (P2PK) atau Pay-to-Public-Key-Hash (P2PKH). Yang pertama dapat dipahami sebagai "Hanya mereka yang memegang kunci privat yang sesuai dengan kunci publik yang dapat membelanjakan Bitcoin."

Pada saat itu, kami juga dapat mengirimkan Bitcoin ke alamat IP penerima, namun fitur ini dihentikan pada tahun 2012. Untuk menggunakannya, Anda perlu terhubung ke alamat IP penerima pembayaran, meminta kunci publik dari penerima pembayaran, dan penerima pembayaran akan memberi Anda kunci publik1. Dompet Anda kemudian akan membuat Bitcoin dengan skrip P2PK.

Alur kerja ini mungkin tampak agak aneh saat ini2, namun sesuai dengan pola umum aplikasi peer-to-peer seperti Napster dan Kazaa pada saat itu, yaitu terhubung langsung ke orang lain dan mengunduh sesuatu dari mereka. Saat ini, kemungkinan besar Anda tidak mengetahui alamat IP teman Anda, dan jika mereka menggunakan perangkat seluler, alamat IP mereka mungkin berubah setiap saat. Meskipun Anda dapat menginstruksikan node Bitcoin Anda untuk terhubung secara spesifik ke node teman Anda, secara umum node tersebut hanya akan terhubung ke node acak, lihat Bab 2.

Metode transaksi yang lebih umum mirip dengan transfer bank. Penerima memberi Anda alamat, dan Anda mengirim bitcoin ke alamat ini, sama seperti Anda mengirim uang ke rekening bank. Awalnya kami semua menggunakan P2PKH sebagai alamatnya (makna P2PKH dijelaskan di bawah).

Dengan cara ini, transaksi tidak dikirim langsung ke penerima pembayaran, tetapi disiarkan melalui semua node di jaringan, dan akhirnya ditemukan oleh node penambangan dan dikemas ke dalam sebuah blok. Ada kemungkinan bahwa node rekanan Anda melihat transaksi dari node rekan, atau menerima blok tempat transaksi terjadi.

Metode transaksi ketiga adalah penambangan, mengirimkan hadiah blok yang diperoleh dari penambangan kepada Anda sendiri. Awalnya, perangkat lunak Bitcoin memiliki perangkat lunak penambangan di dalamnya. Jadi, segera setelah Anda mengunduh perangkat lunak Bitcoin, perangkat lunak Bitcoin Anda akan mulai menambang dan kemudian mengirimkan Bitcoin ke dompet Anda, dalam hal ini tidak perlu bertukar alamat. Semua Bitcoin ini menggunakan P2PK sebagai batasan 3.

Apa alamatnya?

Alamat adalah cara mudah untuk menunjukkan skrip mana yang perlu dimasukkan ke dalam blockchain. Seperti yang kami nyatakan di atas, tujuan skrip ini adalah untuk memberikan batasan pada Bitcoin dan hanya mengizinkan penerima untuk membelanjakannya4. Alamatnya sendiri tidak ada di blockchain, dan alamat tersebut bahkan tidak berisi skrip lengkap.

Dari dua jenis skrip yang paling banyak digunakan di masa lalu, alamat hanya digunakan untuk Pay-to-Public-Key-Hash (P2PKH). Ketika dompet melihat alamat tersebut, dompet tersebut menghasilkan skrip yang mengharuskan orang yang membelanjakan bitcoin di dalamnya untuk memegang kunci publik yang sesuai untuk hash tersebut (skrip sebenarnya disediakan di Bab 10). Hanya hash yang dipublikasikan, dan kunci publik tetap dirahasiakan sampai penerima membelanjakan bitcoinnya.

Alamat P2PKH dimulai dengan angka 1, diikuti dengan hash kunci publik. Alamatnya dikodekan base58, seperti yang ditunjukkan dalam contoh berikut:

1HLoFgMiDL3hvACAfbkDUjcP9r9veUcqAF

Apa itu sistem Basis?

Untuk memahami base58, pertama-tama kita perlu memahami prinsip dasar sistem dasar.

Ambil base10 misalnya, anggap saja sebagai 10 jari Anda. Jadi jika Anda ingin menyatakan angka 115 (1, 1, 5), Anda harus membuat tiga gerakan dengan kedua tangan yang sesuai dengan 1, 1, 5. Sejak manusia menemukan tablet tanah liat dan kertas, Anda juga dapat menulis angka-angka ini dengan pena, yang jauh lebih nyaman daripada menggunakan jari Anda. Oleh karena itu, base10 adalah sistem desimal yang menggunakan 10 simbol berbeda, menggunakan berbagai kombinasi dari 10 simbol tersebut untuk menyatakan bilangan apa pun (bilangan bulat).

Selain itu, ada banyak sistem dasar yang berbeda. Misalnya, orang Babilonia kuno menggunakan base60. Untuk membaca kode mesin biasanya kita menggunakan heksadesimal yaitu base16 - menggunakan 16 karakter angka 0 sampai 9 dan huruf A sampai F. Sementara itu, komputer cenderung menggunakan base2 (sistem bilangan biner) secara internal karena transistor hanya memiliki dua keadaan: hidup dan mati. Artinya semuanya dilakukan hanya dengan dua angka, 0 dan 1, dan Anda dapat menggunakannya untuk mewakili angka apa pun.

Satoshi Nakamoto memperkenalkan sistem base58, yang menggunakan 58 simbol berbeda: angka 0 hingga 9 dan sebagian besar huruf kecil dan besar dalam alfabet. Namun, beberapa huruf dan angka yang mudah membingungkan dan salah diidentifikasi oleh pengguna tidak disertakan - misalnya, angka 0 dan huruf besar O, serta huruf besar I dan huruf kecil l.

Pernahkah Anda melihat kode sumber lampiran email? Sekelompok nomor aneh. Ini adalah base64, dan base58 lahir berdasarkan bas64. Namun, base64 berisi karakter seperti garis bawah, tanda tambah, tanda sama dengan, dan garis miring. base58 menghapus karakter ini, membuat inspeksi visual lebih mudah, dan dapat diterapkan secara efektif ke URL.

Base58 dan Bayar-ke-Hash-Kunci-Publik

Apa hubungannya dengan P2PKH? Alamat P2PKH dimulai dengan 1, diikuti dengan hash kunci publik yang dikodekan base58.

Ini adalah informasi yang perlu Anda kirimkan kepada orang lain ketika Anda ingin menerima Bitcoin dari mereka. Anda juga dapat mengirimkannya 0x005 dan kunci publik. Mungkin mereka berhasil menerjemahkan 0x00, tetapi kemungkinan besar tidak.

Secara teori, Anda dapat mengirimkan skrip Bitcoin kepada orang lain yang dinyatakan dalam heksadesimal (format yang digunakan pada blockchain) karena skrip Bitcoin adalah pesan biner. Di blockchain, skrip Bitcoin seperti ini berarti: "Jika orang ini memiliki hash kunci publik yang benar dan kunci publik yang sesuai, Anda dapat membelanjakan Bitcoin ini." Jika Anda ingin mempelajari lebih dalam di Bab 10.

Meskipun ada begitu banyak representasi yang dapat dipilih, orang biasanya memilih format alamat standar. Ini menjelaskan mengapa semua alamat Bitcoin tradisional dimulai dengan 1 dan panjangnya hampir sama.

Selain digunakan untuk mengirim alamat Bitcoin, base58 juga dapat digunakan untuk meneruskan kunci pribadi. Dalam hal ini, simbol utamanya adalah 5 (mewakili 128 sebagai byte versi), diikuti dengan kunci pribadi.

Dulu, pengguna menggunakan dompet kertas yang bisa dicetak. Jika dihasilkan dengan aman tanpa pintu belakang, maka kertas tersebut memiliki string yang dimulai dengan "1" di satu sisi dan string yang dimulai dengan "5" di sisi lain, dengan catatan bahwa hanya alamat Bitcoin yang dapat disajikan, kunci pribadinya harus tidak dibagikan.

Ada juga alamat yang dimulai dengan "3", yang berarti Bitcoin dikunci dalam hash skrip, bukan hash kunci publik. Kami akan memperkenalkan Pay to Script Hash (P2SH) di Bab 10. Alamat tersebut biasanya berupa alamat multisig, namun bisa juga berupa alamat SegWit6.

Meskipun alamat base58 berkinerja baik, masih ada ruang untuk perbaikan. Jadi, kita punya bech32.

bech32 muncul

Pada bulan Maret 2017, Pieter Wuille berbicara tentang format alamat baru, bech32. Bech32 telah digunakan sejak aktivasi SegWit berhasil. Seperti namanya, bech32 adalah sistem base32. Artinya, Anda bisa menggunakan hampir semua huruf dan semua angka, kecuali beberapa yang bisa menimbulkan kebingungan.

Video penjelasan: https://youtu.be/NqiN9VFE4CU

Perbedaan terbesar antara bech32 dan base58 adalah huruf besar dan kecil tidak tercampur. Setiap huruf hanya akan muncul satu kali (baik huruf besar semua atau huruf kecil semua), sehingga akan lebih mudah untuk dibaca. Pemetaan yang tepat antara setiap huruf atau angka dan nilai yang terkait adalah tetap, namun agak sewenang-wenang: Q berarti 0, P hanya berarti 1, tanpa makna mendalam di baliknya.

- tabel pemetaan bech32. Misalnya, q berarti 0 dan 3 berarti 17 (1+16) -

Alamat bech327 terdiri dari dua bagian yang dipisahkan dengan "1", misalnya bc1q9kdcd08adkhg35r4g6nwu8ae4nkmsgp9vy00gf.

Paruh pertama sengaja dibaca, misalnya, "bc" (untuk Bitcoin) atau "Inbc" (Lightning Network di Bitcoin). Nilai yang diwakili oleh huruf seperti “b” dan “c” tidak ada artinya. Mereka ada hanya untuk dikenali oleh orang-orang: "Paham, jika alamatnya dimulai dengan 'bc', itu mengacu pada Bitcoin sebagai mata uang kripto." Namun, dompet akan memeriksa apakah nilai-nilai ini ada sebagai pemeriksaan kredibilitas, dan nilai-nilai ini ​​juga termasuk dalam checksum.

"1" hanyalah karakter pembatas dan tidak mewakili nilai apa pun. Jika Anda melihat tabel pemetaan untuk bech32, Anda akan melihat bahwa "1" tidak disertakan, artinya "lewati saja".

Babak kedua dimulai dengan nomor versi SegWit. Versi 0 diwakili oleh Q(bc1q…) (lihat Bab 3). Versi 1 adalah apa yang kami sebut Akar Tunggang (lihat Bagian 4 buku ini), diwakili oleh "P" (bc1p...). Dalam kasus SegWit versi 0, nomor versi akan diikuti oleh 20 atau 32 byte, masing-masing mewakili hash kunci publik atau hash skrip. Perbedaan panjangnya karena SegWit menggunakan hash SHA256 skrip (32 byte) dan bukan hash RIPEMD160 skrip (20 byte).

Di base58, hash skrip memiliki panjang yang sama dengan hash kunci publik. Namun di SegWit, panjang keduanya berbeda. Jadi hanya dengan melihat panjang alamatnya, Anda dapat langsung mengetahui apakah Anda membayar skrip atau hash kunci publik. Kebetulan, Taproot menghilangkan perbedaan panjang ini, sehingga semakin meningkatkan privasi.

Oleh karena itu, bench32 dicirikan dengan hanya menggunakan 32 karakter untuk paruh kedua alamat, dan sebaliknya tidak jauh berbeda dengan base58. Lihat fitur ini dan Anda akan tahu: "Aha, ini adalah alamat P2PKH." Dalam hal ini, Pay-to-Witness-Public-Key-Hash (P2WPKH), di mana "Witness" mengacu pada SegWit, tetapi ide intinya tetap sama: Orang dan komputer dapat mengidentifikasi jenis alamat berdasarkan awalan pendek yang diikuti dengan hash kunci publik atau skrip.

Permainan panah 32 dimensi

Namun, kesederhanaan bukanlah satu-satunya keuntungan. Keuntungan lainnya adalah koreksi kesalahan, setidaknya deteksi kesalahan.

Jika Anda memasukkan alamat yang salah, hal terburuk yang bisa terjadi adalah Anda mengirim Bitcoin ke hash kunci publik yang salah. Ketika penerima mencoba membelanjakan Bitcoin, dia akan menemukan bahwa hash kunci publiknya tidak sesuai dengan persyaratan blockchain karena pengirim sebelumnya memasukkan alamat yang salah. Bitcoin ini tidak akan pernah bisa dipulihkan.

Untungnya alamat base58 memiliki checksum di akhir. Dengan cara ini, jika Anda memasukkan alamat yang salah, verifikasi checksum di akhir alamat akan gagal. Dompet Anda akan mengingatkan Anda dan menolak mengirim transaksi (blockchain tidak akan melindungi Anda, tetapi dompet Anda akan melindunginya). Namun, jika Anda benar-benar kurang beruntung, Anda masih bisa mendapatkan checksum yang benar meskipun Anda melakukan kesalahan.

Bech32 dirancang untuk menghindari kejadian-kejadian ekstrem seperti itu. Selain itu, Bech32 tidak hanya memberi tahu Anda jika Anda melakukan kesalahan, namun juga di mana Anda melakukan kesalahan tersebut. Metode spesifiknya adalah dengan mengambil semua byte alamat dan melakukan hashing menggunakan rumus matematika yang rumit. Sekalipun Anda melakukan 4 kesalahan, Bech32 akan tetap mengetahui di mana Anda melakukan kesalahan dan berapa nilai sebenarnya. Jika Anda melakukan lebih dari 4 kesalahan, Bech32 tidak dapat membantu Anda.

Mari kita ilustrasikan dengan analogi: Anda menggambar sekumpulan lingkaran yang tidak tumpang tindih di dinding. Titik sasaran setiap lingkaran mewakili nilai yang benar, sedangkan titik lain dalam lingkaran mewakili kesalahan input. Jika Anda adalah pemain dart yang terampil, sering kali Anda akan tepat sasaran, yang berarti Anda kehilangan nilai yang tepat. Jika Anda sedikit meleset dari sasaran, namun masih berada di dalam lingkaran, itu berarti nilai yang Anda masukkan sedikit melenceng. Pemeriksaan kesalahan adalah mengetahui bahwa Anda melewatkan sasaran. Koreksi melibatkan memindahkan anak panah ke sasaran terdekat.

Idenya di sini adalah Anda ingin membuat lingkaran selebar mungkin untuk menampung pemain dart yang paling ceroboh, namun Anda tidak ingin membuang terlalu banyak ruang. Demikian pula, kami tidak ingin membuat alamat Bitcoin yang panjangnya ratusan karakter. Ini adalah masalah optimasi favorit para matematikawan.

Berbeda dengan dinding 2D, bech32 seperti dinding 32D dengan hipersfer 32D. Saat Anda memasukkan alamat Anda, ada sedikit penyimpangan di suatu tempat dalam ruang 32 dimensi ini, namun tidak peduli bagaimana tampilannya, Anda masih berada di dalam hipersfer ini. Dalam hal ini, dompet Anda mengetahui apa yang salah dan dapat secara efektif mencegah hilangnya Bitcoin yang disebabkan oleh pengiriman ke alamat yang salah8.

kerentanan bech32

Pada tahun 2019, orang-orang menemukan bahwa jika karakter terakhir dari alamat bech32 adalah P dan Anda secara tidak sengaja memasukkan satu atau lebih Q di kemudian hari, alamat tersebut masih akan lolos verifikasi checksum dan Anda tidak akan menerima pesan kesalahan input. Perangkat lunak dompet Anda akan mengira bahwa alamat tersebut dimasukkan dengan benar, sehingga memungkinkan Anda mengirim Bitcoin ke alamat yang salah, sehingga Bitcoin tidak dapat dibelanjakan, seperti yang kami jelaskan di atas.

Kabar baiknya adalah bech32 hanya berfungsi dengan SegWit, dan alamat SegWit memiliki batas panjangnya - hanya boleh 20 byte atau 32 byte. Untungnya, jika Anda memasukkan Q ekstra setelah alamat yang panjangnya 20 atau 32 byte, alamat yang Anda masukkan tidak valid karena melebihi batas panjangnya. Dompet Anda akan menyadari masalah ini dan menolak mengirim bitcoin. Awalnya dianggap memperkenalkan batas panjang alamat yang serupa untuk Taproot, namun solusi yang disebutkan di bawah menghilangkan kebutuhan ini. Panjang alamat yang fleksibel akan membantu kami meningkatkan Taproot di masa depan.

bech32m lahir

Untuk memperbaiki kerentanan bech32, standar baru yang disebut bech32m diusulkan9. bech32m sebenarnya adalah perubahan yang sangat sederhana: angka tambahan ditambahkan ke rumus checksum bech32 untuk memastikan bahwa karakter tambahan apa pun akan menghasilkan checksum yang tidak valid.

Standar baru ini hanya berlaku untuk alamat Taproot dan alamat masa depan. Tidak ada perubahan untuk alamat SegWit, karena alamat tersebut sudah dilindungi oleh batas panjang 20 atau 32 byte. Pada saat artikel ini ditulis, sebagian besar perangkat lunak dompet mendukung standar bech32m yang baru.

Apa yang membuat saya mengatasi kecemasan dan jatuh cinta pada komputasi kuantum?

Kebetulan, Pay-to-Public-Key-Hash (P2PKH) dianggap lebih tahan terhadap serangan kuantum karena Anda tidak perlu mengungkapkan kunci publik Anda. Kelemahannya adalah hash memakan lebih banyak ruang – namun hal ini tidak menjadi masalah pada saat itu karena bloknya masih jauh dari penuh.

Banyak orang khawatir bahwa komputer kuantum pada akhirnya akan merusak keamanan kriptografi Bitcoin, memberikan peluang bagi peretas kuantum untuk mencuri Bitcoin. Jika mereka berhasil mencuri jutaan Bitcoin, hal itu bahkan dapat menyebabkan jatuhnya pasar.

Masalahnya adalah meskipun P2PKH diadopsi secara luas, kunci publik untuk 5 juta hingga 10 juta Bitcoin tersebut telah dipublikasikan. Ironisnya, dengan banyaknya Bitcoin yang rentan terhadap peretas kuantum, tidak ada gunanya mencoba melindungi sisa Bitcoin dengan cara ini. Sekalipun Bitcoin Anda tidak dicuri karena Anda menggunakan P2PKH, mereka pasti akan menjadi tidak berharga karena jatuhnya harga.

Fisikawan Stepan Snigirev dan ahli matematika Andrew Poelstra menjelaskan potensi serangan kuantum memiliki konsekuensi yang menghancurkan dalam jangka pendek dan kemungkinan tindakan penanggulangannya dalam podcast dua episode berjudul (Apa yang Dilakukan Bitcoin).

Ruang blok kini menjadi sangat langka, sehingga tidak perlu menyimpan hash kunci publik di ruang blok yang berharga membantu pengguna menghemat uang. Inilah sebabnya mengapa dalam soft fork Taproot yang baru (lihat Bagian 4 buku ini), alamat Bitcoin menjadi P2PK10 lagi. Perlu diketahui bahwa penggunaan alamat Taproot tidak bersifat wajib, jadi jika Anda tidak setuju dengan alasan di atas, Anda dapat memilih untuk tidak menggunakan Taproot.

catatan kaki

1. Untuk memuaskan keingintahuan para penggemar kode “arkeologi”: node pengirim akan memiliki kotak dialog UI yang menanyakan jumlah transfer dan alamat IP. Fungsi StartTransfer() membuat transaksi cek kosong di mana checkorder pada node penerima menyisipkan skrip P2PK (sebagai scriptPubKey). OnReply2() lalu memasukkan jumlahnya, menandatangani transaksi, mengembalikan transaksi ke penerima, dan menyiarkannya. kode sumber. ↩

2. Dan tidak aman, Satoshi Nakamoto pun mengakuinya. ↩

3. Mengapa versi asli yang dirilis oleh Satoshi Nakamoto mendukung P2PK dan P2PKH? Kami tidak yakin alasannya. Metode pembayaran P2PK sebenarnya hanya digunakan untuk membayar alamat IP dan membayar imbalan blok kepada penambang. Keduanya tidak memerlukan interaksi manusia. Dalam skenario yang melibatkan interaksi manusia, pengguna menggunakan P2PKH. Alamat yang digunakan mengacu pada P2PKH bukan P2PK. Sistem otomatis tidak memerlukan konsep alamat karena juga dapat menangani skrip, sehingga tidak diperlukan konsep seperti alamat P2PK. ↩

4. Selama ini scriptnya mirip dengan rekening bank. Seperti yang akan kita pelajari di Bab 10, skrip melakukan lebih dari sekadar menyimpan uang bagi pemiliknya. ↩

5. Sepasang angka heksadesimal yang diawali dengan 0x biasanya digunakan untuk mewakili satu byte, yang dapat mewakili 16 × 16 = 256 nilai berbeda. Oleh karena itu, 0x00 mewakili satu byte dan nilainya adalah 0. ↩

6. Seperti yang dijelaskan di Bab 3, SegWit biasanya menggunakan alamat bech32. Namun, butuh waktu lama sebelum semua dompet dan bursa mendukung pembayaran ke alamat bech32. Untuk terus memanfaatkan beberapa manfaat SegWit, kami memperkenalkan jenis alamat yang terlihat seperti P2SH biasa dari sudut pandang pengirim, namun memiliki keajaiban SegWit di baliknya. Jenis alamat ini disebut alamat P2SH-P2WPKH. ↩

7.bech32 diusulkan oleh BIP173. ↩

8. Dompet Ethereum awal tidak menggunakan deteksi kesalahan karena standar alamatnya tidak memiliki checksum. Meskipun EIP55 memperkenalkan checksum pada tahun 2016, tidak semua dompet melakukan deteksi kesalahan. Bahkan hingga akhir tahun 2017, orang masih kehilangan ether karena salah memasukkan alamat. ↩

9.bech32m diusulkan oleh BIP 350. ↩

10. Lihat catatan BIP 341 untuk alasan spesifik. ↩