Pembelanjaan ganda tidak menciptakan bitcoin baru. Pengirim membuat dua transaksi yang mencoba membelanjakan setidaknya satu sumber dana yang sama dari transaksi sebelumnya. Keduanya dapat beredar, tetapi tidak dapat sama-sama valid dalam satu riwayat. Menerima pembayaran tanpa konfirmasi, atau zero-conf, berarti bertindak sebelum jelas versi mana yang akan menang.
Bayangkan Tom punya satu output dari penerimaan sebelumnya senilai 100 000 sat, satuan terkecil bitcoin. Output yang belum dibelanjakan disebut UTXO. Ia menyiapkan pembayaran 99 000 sat untuk Alice dan menyisakan 1 000 sat sebagai biaya. Namun, ia juga bisa menandatangani transaksi lain yang memakai UTXO yang sama dan mengirim uang ke tempat lain. Keduanya memakai sumber dana yang sama, sehingga berkonflik. Ini bukan seperti menyalin berkas: node Bitcoin, komputer yang memeriksa aturan, tidak mengizinkan output yang sama dibelanjakan dua kali dalam satu rantai valid. Penipuan berhasil jika Alice menyerahkan barang untuk pembayaran pertama, tetapi riwayat yang diterima akhirnya berisi pembayaran kedua. Tidak ada koin baru; Alice mengandalkan versi yang kalah. Secara teknis, setiap input menunjuk output sebelumnya melalui pengenal transaksinya, txid, dan nomor output. Pasangan itu disebut outpoint. [1] [3] [7]
Alice mungkin melihat pembayaran masuk dalam hitungan detik. Itu belum berarti transaksi telah dicatat dalam blok. Mempool adalah tempat penyimpanan lokal transaksi belum terkonfirmasi milik sebuah node. Tidak ada satu Mempool global atau urutan kedatangan bersama untuk seluruh Bitcoin. Node lain mungkin menerima versi konflik lebih dahulu atau belum melihat versi Alice. Kebijakan first-seen mengutamakan versi yang pertama diterima saat meneruskan transaksi. Itu bukan janji bahwa penambang akan memasukkannya ke blok. Jadi, tangkapan layar dompet atau txid saja tidak membuktikan penyelesaian pembayaran. Yang penting adalah status pembayaran tersebut dalam rantai yang diverifikasi secara andal. [2] [5]
Alice juga bisa sedang mengirim pembayaran jujur yang lama menunggu. Replace-by-Fee (RBF) memungkinkan transaksi belum terkonfirmasi diganti, biasanya dengan transaksi berbiaya lebih tinggi. Penerima masih bisa mendapat jumlah yang sama meskipun txid berubah. Penggantinya memakai setidaknya sebagian dana yang sama, sehingga secara teknis bertentangan dengan transaksi awal tanpa ada niat menipu. Yang penting ialah isi pembayaran baru dan keadaannya, bukan label RBF saja. Namun, mekanisme yang sama juga bisa mengalihkan uang ke tujuan lain. Full-RBF menjadi kebijakan bawaan Bitcoin Core sejak versi 28 dan tidak mewajibkan transaksi awal memberi sinyal bahwa ia dapat diganti. Pengganti tetap harus memenuhi aturan biaya dan pencegahan penyalahgunaan node. Jadi, ketiadaan sinyal RBF juga tidak membuat pembayaran tanpa konfirmasi menjadi tak dapat dibatalkan. [5] [6] [15]
Pembayaran mendapat konfirmasi ketika masuk ke blok valid yang diterima node. Blok berikutnya biasanya membuat penggantian riwayat itu lebih sulit dan mengurangi risiko penipuan berhasil. Namun, tidak ada jumlah yang aman untuk semua keadaan. Kehilangan pembayaran secangkir kopi berbeda dari menyerahkan mobil atau mengizinkan penarikan besar dari bursa. Enam konfirmasi yang sering disebut adalah kebiasaan, bukan aturan Bitcoin. Penerima perlu mempertimbangkan nilai, kemungkinan pemulihan, perilaku rantai yang tidak biasa, serta kualitas sumber informasi. Isolasi node, yang dikenal sebagai Eclipse Attack, dapat mengacaukan pandangannya terhadap jaringan. Menunggu perlu mendampingi verifikasi, bukan menggantikannya. [2] [10]
Perpindahan node ke cabang valid lain disebut reorganisasi. Proof of Work membuktikan kerja untuk menghasilkan blok; akumulasi kerja sebuah cabang disebut chainwork. Setelah pembayaran dikonfirmasi, pembayaran itu tidak bisa dibatalkan dengan mengganti transaksi di Mempool. Cabang alternatif yang valid harus tidak memuat pembayaran asli, memasukkan pembelanjaan yang kedua, dan mengumpulkan lebih banyak kerja, yaitu chainwork, daripada rantai aktif penerima. Reorganisasi rantai juga dapat terjadi tanpa penipuan, misalnya akibat blok yang ditambang hampir bersamaan atau kesalahan perangkat lunak maupun jaringan. Pembelanjaan ganda terhadap korban baru disebut berhasil ketika penyerang memperoleh nilai karena transaksi konflik menang. Untuk transaksi dompet yang kalah, Bitcoin Core dapat menampilkan jumlah konfirmasi negatif dalam kolom confirmations serta konflik terkait dalam kolom walletconflicts. [4] [7] [8]
Hashrate adalah kecepatan perhitungan dalam penambangan. Porsi yang lebih besar membantu dalam perlombaan riwayat, tetapi tidak mengecualikan aturan lainnya. Peluang cabang yang ditambang diam-diam untuk menyusul rantai jujur bergantung, antara lain, pada porsi daya komputasi jaringan yang dikuasai penyerang dan jumlah konfirmasi. Nilai yang bisa diperoleh terutama memengaruhi apakah serangan itu menguntungkan. Porsi di bawah 50 % bukan berarti peluangnya nol; mayoritas yang dipertahankan sangat meningkatkan kemungkinan mengejar cabang lainnya. Namun, bahkan mayoritas tidak memungkinkan penambang memalsukan tanda tangan, membelanjakan UTXO milik orang lain, melanggar aturan penerbitan, atau memaksa full node menerima blok tidak valid. Penilaian serangan perlu memperhitungkan daya komputasi, energi, dan imbalan yang hilang karena tidak menambang secara jujur. Modal yang tersedia, risiko kegagalan, dan kemungkinan terdeteksi juga penting. Hasilnya dapat pula mencakup keuntungan dari posisi di pasar keuangan, sehingga harga sewa mesin tambang saja tidak cukup untuk membuat perkiraan. [1] [10] [12]
Race di sini berarti perlombaan waktu: penerima dan penambang mungkin lebih dahulu melihat transaksi yang berbeda. Dalam race attack, atau serangan yang berlomba mendahului konfirmasi, pembayar mengirim satu transaksi kepada pedagang dan transaksi yang bertentangan kepada penambang atau node lain. Ia berusaha membuat pedagang menyerahkan barang secara tidak dapat dibatalkan sebelum sebuah blok memilih salah satu versi. Hasilnya bergantung pada penyebaran transaksi, pandangan jaringan milik pedagang, pilihan penambang, dan waktu penyerahan barang. Beberapa node independen yang memantau jaringan dapat memperbaiki deteksi konflik, tetapi tidak menjamin penyelesaian yang tak dapat dibatalkan. Nama race, Finney, dan Vector76 menjelaskan skenario serangan, bukan kolom data transaksi ataupun aturan konsensus yang berbeda. [2] [11]
Finney attack adalah nama skenario ketika penyerang juga mengendalikan penambangan. Ini bukan kenaikan biaya biasa oleh dompet. Dalam Finney attack, penyerang yang mampu menambang lebih dahulu menambang secara privat sebuah blok berisi transaksi konflik yang mengembalikan nilai kepadanya. Ia kemudian memakai UTXO yang sama untuk membayar pedagang yang menerima pembayaran tanpa konfirmasi, lalu memublikasikan blok tersembunyi itu setelah barang diterima. Rencana ini hanya berhasil jika blok tersebut masih dapat digunakan dan jaringan menerimanya sebelum blok pesaing yang ditambang secara jujur menggagalkan persiapan itu. Penyerang mempertaruhkan imbalan blok sekaligus biaya penambangan. Menunggu transaksi pedagang masuk ke blok yang sudah diverifikasi memutus cara serangan klasik ini, tetapi tidak menghapus risiko reorganisasi rantai di kemudian hari. [1] [11]
RPC adalah antarmuka pemrograman node. Nama berikut adalah perintah dan kolom untuk pengembang sistem pembayaran, bukan jenis konfirmasi lain. Sistem pedagang dapat memakai full node sendiri untuk memantau pembelanjaan yang saling bertentangan di Mempool, memanggil gettxspendingprevout, membaca kolom walletconflicts, membandingkan blok terakhir rantai aktif, dan memberi peringatan saat konfirmasi hilang. Lebih banyak node yang terhubung atau independen mempersempit titik buta, tetapi tidak ditemukannya konflik hanyalah bukti keamanan yang lemah: penyerang dapat menahan transaksi konflik atau mengirimkannya lewat jalur lain. Penjelajah blok menampilkan pandangan node miliknya sendiri dan dapat terlambat. Menemukan konflik memungkinkan penyerahan barang dihentikan. Namun, hal itu tidak dapat memerintahkan penambang memilih transaksi tertentu ataupun menyamakan pembayaran tanpa konfirmasi dengan pembayaran yang sudah dikonfirmasi. [8] [9] [11]
Periksa pembayaran yang benar-benar masuk, tujuan, jumlah, dan konfirmasinya. Bukti dari pengirim tidak menggantikan pemeriksaan itu. Full node sendiri memungkinkan pemeriksaan aturan secara langsung. Jika memakai layanan lain, pahami siapa yang menyediakan informasi dan, bila berlaku, menyimpan dana Anda. Sistem pedagang sebaiknya menghubungkan pesanan dengan output tertentu dan mengikuti transaksi pengganti. Konflik atau hilangnya konfirmasi harus menghentikan penyerahan yang tidak bisa dibatalkan. Pembayaran berikutnya yang memakai kembalian belum terkonfirmasi bergantung pada transaksi awal; itu bukan bukti keamanan yang independen. Lightning Network memungkinkan pembayaran cepat lewat kanal yang didanai transaksi Bitcoin. Peserta kanal bertukar transaksi commitment bertanda tangan yang mencatat pembagian dana. Saat memperbarui kanal, mereka memberikan data rahasia kepada pihak lain agar penalti dapat dikenakan jika kemudian mereka memublikasikan status lama; pembatalan status lama ini disebut revocation. Perlindungan memerlukan deteksi dan tanggapan tepat waktu terhadap upaya tersebut. Mekanismenya berbeda dari menyerahkan barang untuk transfer blockchain tanpa konfirmasi. Kanal yang dibuka tanpa konfirmasi, zero-conf channel, sengaja mempercayai pendananya dan tidak menghapus risiko pembelanjaan ganda dana tersebut. [13] [14]
Untuk gambaran yang lebih utuh, baca entri ini bersama Transaksi, Konfirmasi, Mempool, Proof of Work, Replace-by-Fee (RBF), Bitcoin. Entri ini juga dirujuk dari Konfirmasi, Reorg, Stale Block, Replace-by-Fee (RBF).