Kesalahannya terletak pada penerapan aturan validasi, bukan pada kriptografi atau jadwal penerbitan. Setiap output bernilai positif, tetapi jumlahnya mengalami overflow dan menjadi negatif. Selisih antara input dan jumlah negatif itu kemudian dianggap sebagai biaya. Versi 0.3.10 menambahkan batas atas untuk setiap output dan total sementara; setelah reorganisasi ke cabang yang diperbaiki, blok bermasalah keluar dari riwayat aktif.
Pada 15 Agustus 2010, pengembang Jeff Garzik menyoroti blok 74 638 yang janggal. Transaksi 1d5e512a9723cbef373b970eb52f1e9598ad67e7408077a82fdac194b65333c9 membelanjakan satu input sebesar 0,50 BTC dan membuat dua output yang sangat besar. Hasil printblock saat itu mencatat masing-masing sebesar 92 233 720 368,54275808 BTC. Identitas pembuat transaksi yang memanfaatkan celah tersebut belum dapat dipastikan: catatan publik membuktikan data transaksinya, bukan identitas atau motif pembuatnya. [1]
Saat itu Bitcoin menyimpan nilai sebagai bilangan bulat bertanda 64 bit dalam satoshi. Nilai bulat setiap output, yang juga tercatat dalam heksadesimal sebagai 0x7ffffffffff85ee0, positif dan sedikit di bawah batas maksimum int64. Namun, jumlah keduanya, 18 446 744 073 708 551 616 satoshi, melewati rentang yang dapat ditampung dan berubah menjadi −1 000 000 satoshi. Validasi lama menerima jumlah negatif itu saat membandingkannya dengan input. Ini adalah kesalahan aritmetika, bukan pembobolan tanda tangan. Catatan JSON pertama dalam diskusi memiliki digit desimal terakhir yang berbeda; agar perhitungannya tepat, di sini digunakan nilai bulat yang dikonfirmasi oleh printblock maupun catatan heksadesimal. [1]
Jumlah output negatif sebesar −0,01 BTC dengan input 0,50 BTC menghasilkan biaya semu sebesar 0,51 BTC. Penambang pun mengambil 50,51 BTC melalui coinbase, alih-alih imbalan dasar 50 BTC. Setelah input yang dibelanjakan dikurangkan dan kelebihan coinbase diperhitungkan, kedua output besar itu menambah pasokan pada cabang bermasalah tepat sebesar 18 446 744 073 709 551 616 satoshi: 2^64 satoshi, atau 184 467 440 737,09551616 BTC. Jadi, angka ini bukan sekadar jumlah kedua output. [2]
Komunitas merespons secara terbuka di bawah tekanan waktu. Lfm menyebut bug itu serius, Gavin Andresen mengusulkan pemeriksaan cepat setiap output terhadap 21 juta BTC, dan Satoshi Nakamoto menerbitkan bentuk lebih luas: menolak output negatif atau berlebihan serta total berjalan berlebihan setelah tiap penambahan. Satoshi juga meminta penambang berhenti sementara agar cabang valid baru dapat lebih cepat menyusul dan menggantikan cabang yang bermasalah. [2]
Satoshi mengumumkan versi 0.3.10 pada 15 Agustus 2010 pukul 23:48 waktu forum, sekitar lima jam empat puluh menit setelah laporan Garzik. Node yang diperbarui menganggap transaksi eksploitasi dan blok 74 638 tidak valid serta membangun di atas blok valid bersama terakhir. Pengumuman saat itu kemudian menyatakan cabang baik telah menyalip cabang buruk, sehingga klien dapat bereorganisasi otomatis tanpa menghapus berkas blockchain secara manual. [3]
Tidak ada blok lama yang disunting dalam basis data pusat. Saat itu ada dua riwayat yang bersaing: node lama menerima blok sesuai aturan awal, sedangkan node yang sudah diperbaiki menolaknya dan hanya menerima kerja yang melanjutkan blok pendahulu yang valid. Setelah cabang yang diperbaiki mengumpulkan lebih banyak Proof of Work, jaringan mengikutinya dan blok yang menyebabkan inflasi keluar dari riwayat aktif. Penentunya adalah pengguna dan penambang yang memasang aturan baru serta kerja yang dilakukan setelahnya, bukan perintah seorang administrator. [3]
Perlindungan yang ditambahkan saat itu masih terlihat dalam Bitcoin Core. CheckTransaction menolak output negatif, output di atas MAX_MONEY, serta total sementara yang berada di luar MoneyRange. Pemeriksaan setelah setiap penjumlahan mencegah total mengalami overflow sebelum sempat dibandingkan. Komentar dalam kode secara tegas merujuk pada CVE-2010-5139. Sementara itu, pemeriksaan terpisah untuk input yang dipakai berulang merujuk pada kejadian berbeda, yaitu CVE-2018-17144. [4]
Kejadian ini menunjukkan bahwa batas 21 juta bukan angka ajaib yang dilindungi oleh hash semata. Batas itu ditegakkan oleh aturan validasi yang tepat dan penerapannya yang benar. Karena itu, audit perlu memeriksa rentang setiap nilai, penjumlahan yang aman, coinbase dan biaya, urutan pemeriksaan, kasus uji pada batas rentang, serta kesesuaian hasil antarpenerapan perangkat lunak yang dikembangkan secara independen. Sejarah ini memperlihatkan kemampuan komunitas awal untuk memperbaiki kesalahan dengan cepat, sekaligus besarnya ketergantungan saat itu pada segelintir pengembang, penambang, dan koordinasi langsung antarmanusia. [5]
Untuk gambaran yang lebih utuh, baca entri ini bersama Bitcoin Core, Aturan konsensus, Transaksi, UTXO, Reorg, Soft Fork.
01Pernahkah 184 miliar BTC ada dalam Bitcoin yang valid?+
Nilai itu sempat ada pada cabang cacat yang saat itu ditambang sebagai hasil blok eksploitasi. Node tertambal menolak cabang tersebut dan cabang valid mereorganisasinya, sehingga output raksasa tidak termasuk blockchain aktif atau himpunan UTXO saat ini. Insiden historisnya tetap terdokumentasi melalui blok dan respons masa itu.
02Apakah insiden merusak batas 21 juta secara permanen?+
Tidak dalam riwayat yang diterima saat ini, karena aturan konsensus yang diperbaiki menolak blok cacat dan outputnya hilang dalam reorganisasi. Peristiwa itu menunjukkan bahwa batas bergantung pada validasi benar dan perangkat lunak yang benar-benar dijalankan peserta; pernyataan dokumentasi saja tidak menegakkan suplai.