Bitcoin Protocol Rules
"Rules" yang digunakan oleh Bitcoin Client dalam memproses "message" dan mencegah dari adanya potensi "Unauthorized spending"
[1] dan "Double spending"
[2]● Data structures
- Transactions
- Transaction Pool (Unconfirmed Transactions yang berada di Mempool)
- Orphan transactions (Transaksi yang dianggap orphan oleh node dan dimasukkan kedalam orphan pool karena parent transaction tidak eksis)
- Blocks
- Blocks di rantai utama (Deretan Blocks terpanjang)
- Blocks di rantai cabang (Deretan blocks disamping rantai utama dengan deretan yang lebih pendek)
- Orphan blocks
● Difficulty adjustment
Difficulty mengalami perubahan setiap 2016 Bloks baru ditemukan, dimana waktu yang diperkirakan untuk menemukan 2016 Bloks adalah 2 Minggu.
Sementara untuk rumus perubahan Difficulty adalah seperti ini :
D+ = D0 * MT / SM
D+ = New Difficulty (Difficulty baru)
D0 = Initial difficulty (Difficulty sebelum mengalami perubahan)
M = 2016 Blocks
T = 10 minutes
SM = Actual time 2016 Blocks (Waktu yang dibutuhkan untuk membuat 2016 Blocks pada saat Initial difficulty diterapkan)
Jadi pada dasarnya Difficulty baru akan mengalami penurunan jika SM > MT, dan sebaliknya Difficulty baru akan mengalami kenaikan jika SM < MT
*
https://www.domob.eu/research/DifficultyControl.pdf● Block creation fee (Block Subsidy)
Block creation fee atau dikenal juga sebagai Block Subsidy merupakan sebuah insentif yang didapatkan oleh node mining pada saat mereka berhasil membuat sebuah block yang valid. Insentif ini diterima sebagai Coinbase transaction (+ fee transaksi) yang ikut menjadi bagian dari Block yang mereka temukan.
Pada awalnya nilai dari Block Subsidy adalah sebesar 50 BTC yang dimulai dari
Genesis Block, dan akan mengalami penurunan sebesar 50% untuk setiap kelipatan 210000 Block baru ditemukan. Pemangkasan nilai Block Subsidy ini dikenal juga dengan istilah
Bitcoin HalvingtxNew.vout[0].nValue = genesisReward
CTxOut(nValue=50.00000000, scriptPubKey=0x5F1DF16B2B704C8A578D0B)
CAmount nSubsidy = 50 * COIN;
// Subsidy is cut in half every 210,000 blocks which will occur approximately every 4 years.
nSubsidy >>= halvings;
return nSubsidy;
● "TX" Messages
Seluruh node di jaringan Bitcoin melakukan verifikasi untuk setiap transasi berdasarkan kriteria sebagai berikut :
- Sintaks transaksi dan struktur datanya harus benar
- Memastikan tidak ada Inputs maupun Outputs yang kosong
- Ukuran transaksi (dalam satuan "byte") harus kurang dari batas atau sama dengan maksimal ukuran block yang sudah ditentukan (SIZE <= MAX_BLOCK_SIZE)
- Untuk setiap nilai Output beserta nilai totalnya harus berada dalam rentang nilai yang sudah ditentukan (lebih dari 0 dan kurang dari 21 Juta koin)
- Memastikan tidak ada inputs yang memiliki hash=0, N=–1
- nLockTime kurang atau sama dengan INT_MAX[3] , Ukuran transaksi lebih besar atau sama dengan 100 bytes[4] dan sig opcount <= 2[5]
- Untuk setiap transaksi "nonstandard" akan di reject
- Untuk setiap transaksi baru yang identik dengan yang sudah ada di Mempool atau block valid akan di reject
- Jika input menggunakan referenced output yang sudah terpakai di transaksi lain yang berada di Mempool, maka akan di reject[6]
- Jika input menggunakan referenced output dari transaksi yang tidak dapat ditemukan di rantai block utama maupun Mempool, maka akan dianggap sebagai orphan transactions (ditaruh di orphan Pool)
- Untuk setiap Input yang menggunakan referenced output dari coinbase transaction, maka harus mendapatkan konfirmasi konfirmasi COINBASE_MATURITY (100) (jika tidak transaksi akan di reject)
- Untuk setiap transaksi yang memiliki Input menggunakan referenced Output yang tidak eksis (atau sudah digunakan) akan di reject[6]
- Untuk setiap nilai Input beserta nilai totalnya harus berada dalam rentang nilai yang sudah ditentukan (lebih dari 0 dan kurang dari 21 Juta koin)
- Jika jumlah nilai input lebih kecil dari jumlah nilai output maka transaksi akan di reject
- Jika fee transaksi terlalu rendah untuk dimasukan ke empty block, maka transaksi akan di reject
- scriptPubKey untuk setiap input harus diverifikasi, jika tidak sesuai akan di reject
- Untuk setiap transaksi yang memenuhi kriteria diatas akan dimasukan ke Memory Pool (MemPool)[7]
- Transaksi akan ditambahkan ke wallet jika berhasil masuk kedalam block valid
- Transaksi akan disebarkan ke node-node lain
- Untuk setiap orphan transaction, terapkan semua prosedur (termasuk poin 20 ini) secara rekursif pada orphan transaction tersebut
● "BLOCK" Messages
Seluruh node di jaringan Bitcoin melakukan verifikasi dan validasi untuk setiap block berdasarkan kriteria sebagai berikut :
- Sintaks block dan struktur datanya harus benar
- Duplikat Block yang ditemukan di salah satu dari 3 kategori Block yang ada akan di reject
- List transaksi tidak boleh kosong
- Block Hash harus memenuhi persyaratan proof of work (hash <= nBits)
- Block timestamp tidak boleh lebih dari 2 jam kedepannya
- Transaksi pertama harus merupakan Coinbase transaction
- Untuk setiap transaksi akan dilakukan pengecekan sesuai prosedur "TX" poin 2 s/d 4
- Untuk Coinbase transaction, panjang scriptSig harus 2-100
- Jika sig opcounts > MAX_BLOCK_SIGOPS, maka block akan di reject
- Melakukan verifikasi terhadap Merkle hash
- Jika hash previous Block tidak sesuai dengan yang ada di rantai block utama atau rantai block cabang, maka block akan dianggap sebagai orphan block
- Nilai nBits harus sesuai dengan Difficulty rules
- Jika timestamp lebih kecil atau sama dengan median time dari 11 Blocks sebelumnya, maka akan di reject
- Memeriksa block-block lama tertentu, dan memastikan memiliki hash yang sesuai dengan nilai yang diketahui (contoh : Initial Block Download)
- Memasukan Block kedalam rantai, dimana ada 3 kondisi: (1)Block dengan deretan terpanjang sebagai rantai utama, (2)rantai cabang dengan deretan block lebih pendek disamping rantai utama dan gagal menjadi rantai utama, (3)rantai cabang yang akhirnya menjadi rantai utama karena memiliki deretan block yang lebih panjang dari rantai utama sebelumnya.
- Jika kondisi (1) menjadi rantai utama
- Untuk semua transaksi kecuali coinbase, diterapkan :
- Jika input menggunakan referenced output dari transaksi yang tidak dapat ditemukan di rantai block utama, maka akan di reject
- Untuk setiap Input yang menggunakan "n" output dari transaksi sebelumnya, namun nilainya kurang dari "n+1" output, maka akan di reject
- Untuk setiap Input yang menggunakan referenced output dari coinbase transaction, maka harus mendapatkan konfirmasi konfirmasi COINBASE_MATURITY (100) (jika tidak akan di reject)
- Melakukan verifikasi crypto signatures untuk setiap input, jika tidak sesuai akan di reject
- Untuk setiap input yang menggunakan referenced output yang sudah digunakan oleh transaksi lain yang berada di rantai block utama, maka akan di reject
- Untuk setiap nilai Input beserta nilai totalnya harus berada dalam rentang nilai yang sudah ditentukan (lebih dari 0 dan kurang dari 21 Juta koin)
- Jika jumlah nilai input lebih kecil dari jumlah nilai output, maka akan di reject
- Jika nilai coinbase > nilai Block subsidy + transaction fee, maka akan di reject
- (jika tidak di reject), maka :
- Untuk setiap transaksi akan ditambahkan ke wallet jika berhasil dimining
- Untuk setiap transaksi di Mempool yang identik dengan transaksi yang sudah berada di Block valid akan di hapus
- Block akan disebarkan ke node-node lain
- Jika Block di reject, maka block tersebut tidak dianggap sebagai bagian dari rantai block utama
- Untuk kondisi (2) yang menjadi rantai block cabang, tidak akan dilakukan tindakan
- Untuk kondisi (3), dimana rantai block cabang menjadi rantai block utama
- Mencari fork block di rantai block utama, dimana terjadinya percabangan
- Mendefinisikan ulang rantai block utama untuk diperluas hanya ke fork block ini
- Untuk setiap block di rantai cabang, dari child of the fork block sampai ke ujungnya, ditambahkan ke rantai block utama
- Lakukan pemeriksaan "cabang" sesuai prosedur "BLOCK" poin 3 s/d 11
- Untuk semua transaksi kecuali coinbase, diterapkan :
- Jika input menggunakan referenced output dari transaksi yang tidak dapat ditemukan di rantai block utama, maka akan di reject
- Untuk setiap Input yang menggunakan "n" output dari transaksi sebelumnya, namun nilainya kurang dari "n+1" output, maka akan di reject
- Untuk setiap Input yang menggunakan referenced output dari coinbase transaction, maka harus mendapatkan konfirmasi konfirmasi COINBASE_MATURITY (100) (jika tidak akan di reject)
- Melakukan verifikasi crypto signatures untuk setiap input, jika tidak sesuai akan di reject
- Untuk setiap input yang menggunakan referenced output yang sudah digunakan oleh transaksi lain yang berada di rantai block utama, maka akan di reject
- Untuk setiap nilai Input beserta nilai totalnya harus berada dalam rentang nilai yang sudah ditentukan (lebih dari 0 dan kurang dari 21 Juta koin)
- Jika jumlah nilai input lebih kecil dari jumlah nilai output, maka akan di reject
- Jika nilai coinbase > nilai Block subsidy + transaction fee, maka akan di reject
- (jika tidak di reject), maka :
- Untuk setiap transaksi akan ditambahkan ke wallet jika berhasil dimining
- Jika di reject, maka rantai block utama harus dibiarkan seperti semula
- Untuk setiap block di rantai block utama (lama), dari child of the fork block sampai ke ujungnya, diterapkan :
- Untuk setiap transaksi yang bukan merupakan coinbase transaction di Block, diterapkan :
- Terapkan pemeriksaan sesuai prosedur "TX" poin 2 s/d 9 (Untuk poin ke-8 hanya dicari duplikat transaksi pada Mempool saja)
- Jika diterima, ditambahkan ke transaction pool, jika tidak lanjutkan ke transaksi berikutnya
- Untuk setiap block di rantai block utama (baru), dari child of the fork block sampai ke ujungnya, diterapkan :
- Untuk setiap transaksi di Mempool yang identik dengan transaksi yang sudah berada di Block valid akan di hapus
- Block akan disebarkan ke node-node lain
- Untuk setiap orphan block yang merupakan prev block, terapkan semua prosedur (termasuk poin 19 ini) secara rekursif pada orphan block tersebut
Note
[1] Penggunaan Bitcoin (sebagai transaksi) yang dilakukan oleh orang lain tanpa ijin dan otorisasi dari pemilik. Dengan penerapan public-private key cryptography hal ini dapat dicegah
[2] Penggunaan reference output yang sama pada sebuah Input transaksi, namun digunakan pada 2 output (address penerima) yang berbeda
[3] nLockTime tidak boleh melebihi 31 bits
[4] Transaksi yang valid harus memiliki ukuran lebih dari atau sama dengan 100 bytes. Jika kurang transaksi dianggap tidak valid
[5] Jumlah signature operands didalam sebuah Signature pada transaksi standar tidak boleh lebih dari 2
[6] Rules ini mencegah potensi double-spending
[7] Ketika transaksi diterima (masuk) ke Mempool, akan dipastikan bahwa nilai coinbase > Block Subsidy + fee transaksi
*Reference Source https://en.bitcoin.it/wiki/Protocol_rules