Sejak bitcoin pertama dirilis dan mengalami beberapa pengembangan, terdapat 5 standar transaksi bitcoin. Klasifikasi standar transaksi bitcoin tersebut menjadi batasan jenis script yang bisa dikenali oleh berbagai klien di dalam platformnya agar transaksi bisa berjalan, valid, tanpa ada kesalahan.
Selanjutnya, batasan berupa standar script transaksi itu dikodekan ke dalam sebuah fungsi yang disebut dengan isStandard(). Meskipun telah diklasifikasikan dalam 5 jenis, tidak menutup kemungkinan nantinya ada pengembangan melalui modifikasi lebih jauh di masa mendatang, atau mungkin juga beberapa dihilangkan untuk optimalisasi.
5 standar transaksi Bitcoin tersebut adalah:
- Pay to Public Key Hash – P2PKH
- Pay to Script Hash – P2SH
- Pay to Public Key – P2PK
- Multi Signature – Multisig
- Data Output – OP_RETURN
Agar lebih memahami, terlebih dahulu perlu diketahui bahwa bahasa pengkodean, scriptBitcoin dijalankan berdasarkan setiap baris instruksi atau perintah, secara linier. Oleh sebab itu, bahasa script bitcoin secara stack based. Singkat katanya, Stack adalah struktur data pengkode yang cukup sederhana.
Jika diibaratkan struktur data script berdasarkan Stack, tak ubahnya seperti sebuah tumpukan kartu. Dari tumpukan kartu paling bawah, sampai ke atas, dan akan diproses per baris perintah dari kiri ke kanan. Karena proses kerja script bitcoin tersebut diproses secara linier, hanya sekali, oleh sebab itu Bitcoin tidak mengenal proses “loop”.
Dalam memproses setiap baris instruksi dalam cara kerjanya, Stack dioperasikan dalam dua perintah, yakni “push”, dan “pop”. Instruksi ‘push’, digunakan untuk menambahkan sebuah item baru diatas stack. Sementara ‘pop’ berfungsi untuk menghapus item di bagian atas Stack.
Bagian penting yang perlu dipahami, setiap proses eksekusi Script dilakukan setiap item per item dari kiri ke kanan. Perintah untuk mengatur ‘pop’ dan ‘push’, adalah dengan fungsi “OP_ADD”. Dengan fungsi OP_ADD, mengatur parametar baris script mana yang ditambahkan ke Stack, dan juga menghapus item, dan memasukkan hasilnya kembali ke dalam stack.
Kedua, perlu pula untuk mengetahui bahwa “Address Bitcoin”, adalah berupa hash dari public Key. Sementara setiap transaksi, akan terdiri pula dari Input, dan Output, beserta Digital Signature. Istilah-istilah penting itu yang nantinya akan banyak bermunculan dalam memahami standar transaksi bitcoin, beserta turunannya.
Pay to Public Key Hash – P2PKH
Pay-to-Public-Key-Hash, atau yang disingkat dengan P2PKH, adalah jenis script standar transaksi bitcoin yang paling banyak digunakan. Gambaran singkatnya, script transaksi itu dibuat seolah-olah “pengirim transaksi membayar kepada address penerima”.
Bukankah P2PKH adalah Pay to Public Key Hash? Betul, namun perlu diingat kembali, bahwa Address Bitcoin tersebut sebenarnya adalah hasil dari hashing public key. Sedangkan Public Key di dalam Bitcoin, merepresentasikan “identitas pemilik”.
Tentu saja akan cukup berbeda dengan sebuah akun dalam perbankan. Identitas pemilik rekening harus tertera dengan detil, alamat, nama asli, no telp, dan sejumlah informasi asli pemilik lainnya. Hal itu bisa berakibat fatal, jika data penting pengguna berhasil diketahui orang lain. Menjadi pintu masuk untuk bisa diekspoitasi oleh penyerang.
Perbankan, dan banyak sistem pembayaran elektronik secara umum, berbentuk ”account based“. Artinya, pengguna harus memiliki akun berdasarkan detil informasi pengguna agar bisa menggunakan layanan tersebut.
Sistem yang berbasis ‘akun’ tersebut, tidak digunakan Bitcoin, atas alasan keamanan pengguna sebagai poin paling mendasar. Identitas pengguna, selanjutnya diganti menggunakan sepasang key, yakni Public Key dan Private Key. Sepasang key tersebut terbukti jauh lebih tangguh, ketimbang berbasis akun.
Oleh sebab itu, jenis script transaksi P2PKH bisa dilakukan hanya dengan seolah-oleh membayar kepada hash public key milik penerima transaksi saja.
OP_DUP OP_HASH160 <Hash Public Key Penerima> OP_EQUAL OP_CHECKSIG
Baca Juga: Script Bitcoin dalam Cara Kerja Bitcoin
Dapat dilihat disana, Hash public key penerima sebagai tujuan transaksi pada jenis script P2PKH. Sehingga yang masuk pada script di atas, adalah address bitcoin milik penerima. Hash public key, sudah diformat menjadi Base58.
Pengkodean dalam format Base58 bertujuan untuk menyingkat string menjadi lebih pendek. Karena, jika public key tersebut belum diformat ke dalam base58, tidak akan mudah untuk dibaca manusia. Sehingga address Bitcoin yang umum diketahui banyak orang, biasanya diawali dengan angka satu “1”.
Baris script ditas, bisa diproses dengan mengunci output transaksi. Output transaksi itu kemudian baru akan bisa ditransaksikan kembali oleh penerima, jika memiliki public key dan private key yang berelasi. Proses “Lock” dan “Unlock” transaksi di dalam Bitcoin ini disebut dengan UTXO (Unspend Transaction Output).
Jika kita coba untuk merinci lebih detil script tadi, sebenarnya output transaksi akan dikunci sementara, sampai penerima bisa menunjukkan digital signature yang sesuai dengan address tersebut, menggunakan private key yang sesuai agar output unspend transaction itu bisa ditransaksikan kembali.
Lalu bagaimana script selanjutnya agar penerima bisa unlock output, dan dapat ditransaksikan kembali? Yang dibutuhkan untuk unlock output transaksi adalah sepasang key, yakni Public Key dan Private Key. Sepasang key tersebut digunakan secara bersamaan, terutama dalam membubuhkan digital signature.
Sehingga yang dibutuhkan untuk membuka kunci output transaksi itu, adalah digital signature dan public key:
<Digital Signature> < Public Key>
Jika kedua script tersebut digabungkan, maka akan menjadi:
<Digital Signature> <Public Key> OP_DUP OP_HASH160
<Public Key Hash> OP_EQUAL OP_CHECKSIG
Jika kedua baris tersebut dieksekusi, perintah OP_EQUAL (EQUALVERIFY) selanjutnya akan berperan memeriksa script tersebut berhasil atau tidak. Perintah tersebut secara otomatis akan menjadi “True”, jika input yang disertakan benar-benar sesuai. Sebaliknya “False” jika inputnya tidak sesuai. Sederhananya, perintah Equalverify memeriksa valid tidaknya script transaksi tersebut. Sekaligus, merepresantikan validitas digital signature penerima, jika output transaksi itu hendak ditransaksikan kembali.
Sekilas, dari penjelasan P2PKH, kita akan melihat bagaimana dasar-dasar sebuah smart contract. Orang awam, kebanyakan tidak melihat bahwa detil standar transaksi bitcoin, sebenarnya juga sebuah smart contract.
Pay to Script Hash – P2SH
Standar script transaksi ke dua adalah Pay to Script Hash – P2SH. Script ini awalnya diperkenalkan di tahun 2021 silam. P2SH menjadi salah satu script transaksi bitcoin yang cukup bagus, lebih singkat, dan mudah digunakan dalam berbagai modifikasi script lainnya.
Mengapa disebut memudahkan untuk berbagai modifikasi script lainnya? Karena P2SH juga punya potensi untuk mempermudah script transaksi bitcoin dalam script yang lebih kompleks. Misalnya saja untuk proses pembayaran yang membutuhkan bahasa script yang lebih rumit, dengan kondisi yang berbeda-beda.
Singkat katanya, script P2SH seolah-olah “pengirim transaksi membayar kepada script yang sesuai dengan hash dari script ini”. Di sisi penerima, dengan kondisi yang berbeda, bisa membuka kunci output transaksi, asalkan script yang digunakan masih sesuai. Sehingga penerima bisa mentransaksikan kembali.
Oleh sebab itu, P2SH kemudian disebut juga sebagai “redeem script”. Pasalnya, titik fokus utama script transaksi P2SH untuk bisa membuat lebih sederhana persyaratan yang rumit untuk bisa membelanjakan output transaksi tersebut. Tentu saja, dengan kompleksitas dan situasi yang berbeda, untuk bisa mentransaksikan kembali.
Misalnya saja, pada sebuah kondisi bahwa transaksi itu melibatkan beberapa pihak. Dalam hal ini, beberapa pihak tersebut hanya cukup dilibatkan melalui digital signature yang berbeda. P2SH, menggunakan pula pola ”Multi Digital Signature“.
Berikut contoh skema script multisignature yang dimaksud:
<Public Key Pengirim> <Pihak 1 Public Key> <Pihak 2 Public Key> <Partner 3 Public Key> <Public Key Penerima> OP_CHECKMULTISIG
Pada script multi signature di atas, diketahui ada 5 pihak dalam transaksi tersebut. Pengirim transaksi, Pihak 1, Pihak 2, Pihak 3, dan Penerima. Anda tentu bisa membayangkan sendiri bagaimana potensi jenis script transaksi ini bisa digunakan untuk transaksi yang lebih kompleks bukan?
Script diatas, jika dilihat dalam kode aslinya, tentu cukup panjang. Terutama public key tersebut masih belum disederhanakan. Sementara, P2SH sudah berbentuk hash signature dari kelima pihak tersebut. Maka akan menjadi lebih singkat:
OP_HASH160 54c557e07dde5bb6cb791c7a540e0a4796f5e97e OP_EQUAL
Selanjutnya, sebagai reedem script, agar bisa ditransaksikan kembali:
<Sig1> <Sig2> <2 PK1 PK2 PK3 PK4 PK5 5 OP_CHECKMULTISIG>
Di sisi penerima, pada script di atas, dapat dilihat bahwa penerima harus memasukkan script asli untuk bisa mentransaksikan kembali. Script tersebut, pada contoh awal, terdapat 5 pihak, sehingga membutuhkan public key dari kelima pihak tersebut.
Jika digabungkan dalam bentuk hash, maka pemeriksaan pertama untuk redem script tersebut menjadi:
<2 PK1 PK2 PK3 PK4 PK5 5 OP_CHECKMULTISIG> OP_HASH160 <redeem scriptHash> OP_EQUAL
Setelah pemeriksaan berhasil, sesuai, maka unlock scriptnya menjadi:
<Sig1> <Sig2> 2 PK1 PK2 PK3 PK4 PK5 5 OP_CHECKMULTISIG
Secara keseluruhan, P2SH memberikan banyak keuntungan, terutama dalam modifikasi script transaksi di situasi yang lebih kompleks, melibatkan banyak pihak. Hal ini tentu saja membuka peluang lebih besar di masa depan.
Hanya saja, penggunaan P2SH memang lebih rumit. Terlebih lagi, P2SH adalah script transaksi bitcoin yang merinci persyaratan apa yang harus terpenuhi agar output transaksi itu bisa ditransaksikan kembali. Implementasi script yang salah, bisa berakibat sejumlah dana yang telah terkunci, menjadi tidak bisa ditransaksikan kembali, atau tidak bisa dipergunakan.
Pay to Public Key – P2PK
Pay to Public Key adalah script standar transaksi bitcoin yang paling sederhana. Artinya, pengirim membayar kepada publik key miliknya sendiri. Sehingga lock output juga kepada address itu sendiri. Sehingga script transaksi juga menjadi lebih singkat, jika dibandingkan dengan P2PKH.
Hampir sebagian besarnya, P2PK digunakan sebagai script transaksi Coinbase, untuk transaksi penerimaan reward block dalam pertambangan Bitcoin. Script transaksi P2PK ini diperkenalkan sendiri oleh Satoshi Nakamoto.
<Signature from Private Key> <Public Key> OP_CHECKSIG
Multi Signature – Multisig
Sudah sempat disinggung tentang multi digital signature pada jenis transaksi P2SH. Jenis script transaksi Multi Signature, juga menggunakan skema banyak digital signature. Sehingga standar script transaksi Multi Signature ini biasa disebut dengan skema M-of-N. Huruf N adalah total key yang terlibat dalam transaksi, sedangkan M adalah batas jumlah digital yang diperlukan dalam proses validasi transaksinya.
Misalnya saja, dalam sebuah transaksi, hanya membutuhkan dua digital signature dari 2 pihak untuk bisa diproses. Maka, transaksi itu harus menyertakan digital signature dari kedua belah pihak. Berikut script untuk public key dan digital signaturenya:
Pubkey script: <m> <A pubkey> [B pubkey] [C pubkey...] <n> OP_CHECKMULTISIG
Signature script: OP_0 <A sig> [B sig] [C sig...]
Agar lebih singkat, multisig tersebut bisa dirubah dalam bentuk hash agar lebih singkat. Jika digabung dalam redeem script untuk penerima, maka akan menjadi:
Pubkey script: OP_HASH160 <Hash160(redeemScript)> OP_EQUAL
Redeem script: <OP_2> <A pubkey> <B pubkey> <C pubkey> <OP_3> OP_CHECKMULTISIG
Signature script: OP_0 <A sig> <C sig> <redeemScript>
Data Output – OP_RETURN
Data output ini adalah bahwa bitcoin memungkinkan untuk menambahkan arbitrary data (sembarang data berupa text atau angka) ke dalam transaksi. Null Data atau OP_RETURN ini mulai dipergunakan sejak versi Bitcoin Core 0.9 dan 0.10.
Demi menjaga agar kapasitas data yang tersimpan di blockchain bitcoin tidak membengkak, standar ukuran arbitrary data ini kemudian dibatasi hanya 40 byte. Awalnya di versi bitcoin Core sebelumnya masih bisa hingga 80 byte.
Pubkey Script: OP_RETURN <0 to 40 bytes of data>
(Null data scripts cannot be spent, so there's no signature script.)
OP_RETURN adalah salah satu jenis script transaksi yang cukup unik. Karena pada dasarnya, opcode OP_RETURN digunakan untuk menandai output transaksi yang tidak valid. Sekaligus, memberikan penanda pula bahwa output transaksi itu menjadi output transaksi yang unspendable. Sehingga, output itu tidak dapat ditransaksikan kembali.
Oleh sebab itu, mekanisme penggunaan opcode OP_RETURN, memang dibutuhkan juga dalam proof of burn.
Pubkey Script: OP_RETURN <0 to 40 bytes of data>
Jika melihat script OP_RETURN di atas, dapat diketahui bahwa tidak ada script untuk digital signature. Sehingga OP_RETURN, akan menghasilkan output transaksi yang tidak dapat ditransaksikan kembali. Baca lebih jauh kegunaan OP_RETURN.
Diluar 5 standar transaksi tersebut, ada pula jenis-jenis transaksi bitcoin lain. Secara umum, sebagian besar jenis transaksi lainnya ini masih belum menjadi standar. Atau bisa juga sebagai hasil pengembangan bitcoin lanjutan.
Istilah ini kemudian disebut dengan Non Standard Transaction.
Non Standard Transaction
Secara umum, jaringan bitcoin masih memungkinkan untuk membaca jenis-jenis transaksi Non-Standard, selama masih menggunakan redeem script dalam output hash berupa P2SH. Hal ini karena penambang di jaringan hanya cukup dengan melihat hash saja. Sehingga, output transaksi kemudian bisa dianggap valid.
Oleh sebab itu, sebagian besar referensi tentang dokumentasi pengembang, tetap memasukkan jenis transaksi Non-Standar sebagai salah satu referensinya.
Pada pengambangan Bitcoin lebih jauh, terutama setelah Implementasi SEGWIT yang telah aktif, beberapa standar transaksi Bitcoin juga menyesuaikan berdasarkan Segwit. Dua jenis standat transaksi yang paling berpengaruh dan banyak digunakan untuk menyesuaikan Segwit adalah P2SH dan P2PKH. Berikut adaptasinya.
Native Segwit P2PKH – P2WPKH
Implementasi Segwit pada Bitcoin, berupaya untuk meringkas ukuran script transaksi menjadi lebih kecil, lebih padat, sehingga biaya transaksi yang diukur per byte juga menjadi lebih murah. Caranya adalah dengan tidak menyertakan digital signature, dan diganti dengan pola Witness. Secara lebih sederhana, digital signature pada dasarnya bukan berarti dihapus dan tidak dipergunakan, ada di tempat lain, namun tidak disertakan dalam script transaksi.
Sehingga jenis script P2PKH untuk Segwit (P2WPKH) menjadi:
ScriptPubKey: 0 <20-byte-PublicKeyHash>
ScriptSig: (empty)
Witness:<Signature> <Public Key>
Jika dibandingkan dengan standar P2PKH, ukuran script P2WPKH lebih kecil. Script Witness di atas, pada dasarnya tetap berisi informasi tentang digital signature, dan juga public key. Hanya saja, yang disertakan hanya berupa witness, saksi berisi informasi lebih singkat. Sementara, digital signature dan public key aslinya, hanya dipindah di stack witness data.
Perlu menjadi catatan penting, bahwa public key hash untuk Segwit, adalah menggunakan Bech32 (format base32), tak lagi berupa Base58. Umumnya, address Segwit juga ditandai dengan awalan “bc1 …”
Segwit P2WSH
Adaptasi jenis transaksi P2WSH ini lebih fokus untuk adaptasi P2SH, dengan script yang lebih kompleks. Bisa dikatakan, implementasi P2WSH untuk jenis script P2SH berbasis Segwit.
ScriptPubKey: 0 <32-byte-redeemScriptHash>
ScriptSig: (empty)
Witness: <witness items> <redeemScript>
RedeemScript: (any)
Jika dilihat script P2WSH di atas, kita bisa mengetahui bahwa redeem script sama seperti konsep redeem script di P2SH. Secara umum, redeem script bisa melalui modifikasi apa saja, asalkan tetap dikenali. Yang cukup penting untuk adaptasi P2SH di Segwit, adalah hash redeem script sesuai, dengan standar 32 byte.
P2WPKH Pada P2SH
Sama seperti standar P2PKH untuk P2SH, untuk adaptasi Segwit, script P2SH sama menggunakan 0 <20-byte-PublicKeyHash>.
ScriptPubKey: OP_HASH160 <20-byte-redeemScriptHash> OP_EQUAL
ScriptSig: <0 <20-byte-PublicKeyHash>>
Witness: <Signature> <PublicKey>
RedeemScript: 0 <20-byte-PublicKeyHash>