Script Bitcoin – Cara Kerja Bitcoin Bagian Kedua
Script Bitcoin. Selamat berjumpa kembali di seri Edukasi Bitcoin tentang Cara Kerja Bitcoin. Bahasan sebelumnya kita telah menguraikan proses transaksi Bitcoin. Nah, di bagian kali ini, akan lebih spesifik bagaimana Script Bitcoin akan berperan dalam proses transaksi Bitcoin. Jadi sudah dimengerti bukan keterkaitannya.
Mari kita memulai pembahasannya. Dalam setiap output transaksi Bitcoin, tidak hanya akan menentukan public key dengan lebih spesifik. Namun juga akan menentukan Script yang digunakan. Apa itu script Bitcoin? Dan mengapa Bitcoin membutuhkan Script?
Secara umum, pada transaksi Bitcoin berfungsi untuk menebus output transaksi sebelumnya dengan cara menandatanganinya menggunakan key yang valid. Jadi sampai disini masih ingat bukan bahwa transaksi Bitcoin akan saling terkait dengan transaksi sebelum-sebelumnya. Sehingga output transaksinya akan menyatakan kurang lebih seperti ini:
Transaksi ini ditebus oleh tanda tangan digital dari pemilik address “X”.
Ingat, bahwa “X” disini adalah hash dari public key. Silahkan dibuka lagi pada pembahasan Public Key Sebagai Identitas.
Maka, jika hanya dengan menentukan alamat X, tidak akan memberitahu public key nya. Selain itu, tidak memberitahukan juga bagaimana cara untuk bisa memeriksa tandatangan digitalnya (signature). Seharusnya, pada output transaksi, setidaknya akan bisa menyatakan sebagai berikut:
Transaksi ini bisa ditebus oleh hash dari public key milik X, bersama dengan signature pemilik public key
Dibawah ini adalah bentuk umum script Bitcoin.
OP_DUP
OP_HASH160
69e02e18 . . .
OP_EQUALVERIFY
OP_CHECKSIG
Sampai di sini, akan ada sejumlah pertanyaan yang muncul. Siapa yang menjalankan script ini? Bagaimana urutan intruksinya untuk bisa menjalankan pernyataan dari script diatas? Untuk bisa menjawabnya, maka script sebenarnya juga terdapat pada input sebagai pengganti tanda tangan digital.
Untuk memvalidasi penebusan output transaksi sebelumnya secara benar dan valid, perlu digabungkan script input transaksi baru dengan script output transaksi sebelumnya. Agar transaksi dapat berjalan, kedua script itu perlu disatukan. Dan penggabungan kedua script itu disebut dengan scriptPubKey dan scriptSig.
Pada transaksi yang paling sederhana, output script hanya akan menetapkan public key, dan script input menetapkan signature dengan public key. Berikut adalah penggabungan scriptnya:
<sig>
<pubKey>
– – – – – – – – – – – – – –
OP_DUP
OP_HASH160
<pubKeyHash?>
OP_EQUALVERIFY
OP_CHECKSIG
Bahasa Script Bitcoin
Dalam Bitcoin, bahasa script ini disusun secara khusus. Hanya saja cukup disebut dengan “Script Bitcoin”. Ada banyak kemiripan dalam bahasa pemprograman. Jika dalam istilah yang lama disebut dengan “Forth”. Kalau dalam istilah yang sederhana disebut dengan “stack-based”. Namun dalam Bitcoin, desain key Scriptnya bertujuan untuk lebih sederhana tapi bisa digunakan secara bersama-sama dalam operasi kriptografi. Misalnya saja, ada beberapa petunjuk khusus untuk komputasi fungsi hash, memverifikasi signature.
Stack-Based, maksudnya bahwa setiap instruksi akan dijalankan tepat hanya sekali saja, secara linier. Secara khusus, tidak ada proses “loop” dalam bahasa script Bitcoin. Sehingga jumlah angka intruksi dalam Script akan memberikan batasan waktu berapa lama waktu yang dibutuhkan, dan juga berapa banyak memori yang digunakan.
Turing-complete, maksudnya script tidak memiliki kemampuan untuk mengkomputasi secara seenaknya pada sebuah fungsi yang kuat (powerful function). Jadi desain script ini, mengharuskan para penambang untuk menjalankan script. Dan dijalankan oleh siapapun didalam jaringan Bitcoin. Namun, tidak memberikan mereka peluang untuk mengirim script yang mungkin bisa memiliki “loop” secara tidak terbatas (infinite loop).
Mari kita tengok pada penggabungan script diatas. Untuk memeriksa penebusan output transaksi sebelumnya tersebut, ditambahkan scriptPubKey (dibawah) yang mereferensikan output transaksi, kepada penebusan transaksi scriptSig (atas). Sedangkan pada <pubKeyHash?> mempunyai notasi “?”. Maksudnya untuk memberikan penanda bahwa selanjutnya akan diperiksa lebih lanjut untuk bisa mengkonfirmasi bahwa pada transaksi ini sama dengan hash public key seperti pada script penebusan transaksi (atas).
Hasil dari eksekusi script Bitcoin akan menghasilkan dua kemungkinan:
Pertama, script Bitcoin akan berhasil dieksekusi secara benar tanpa ada kesalahan, dan menandakan bahwa transaksi tersebut adalah valid.
Kedua, eksekusi script Bitcoin pada transaksi tersebut terjadi kesalahan. Sehingga seluruh transaksi akan jadi tidak valid. Dan itu berarti transaksi itu tidak dapat diterima dan tidak bisa dimasukkan kedalam rantai blok.
Yang perlu dipahami disini, adalah bahasa script Bitcoin cukup kecil. Hanya ada 256 intruksi. Masing-masingnya mewakili 1 byte. Pada 256 itu, 15 diantaranya dinonaktifkan, dan 75 untuk dicadangkan. Kode intruksi belum menetapkan arti secara spesifik. Namun intruksi itu akan ditambahkan diwaktu depan.
Dalam bahasa pemprograman ada banyak instruksi dasar. Ada dasar aritmatika, logika dasar seperti “if” dan “then”, dan lainnya. Semantara ada petunjuk dasar kriptografi yang meliputi fungsi hash. Seperti pada intruksi dalam verifikasi signature. Dan juga intruksi khusus dan penting yang disebut dengan CHECKMULTISIG. Instruksi khusus ini memungkinkan seseorang untuk bisa memeriksa beberapa signature hanya dengan satu instruksi saja.
Instruksi CHECKMULTISIG memerlukan untuk menentukan “n” public key. Selain itu parameter “t” untuk thresholdnya. Dan instruksi CHECKMULTISIG akan mengeksekusi secara valid. Setidaknya harus ada t signature dari output t pada n public key yang valid.
Ada bug dalam pelaksanaan multisignature. Pada instruksi CHEKMULTISIG, muncul data nilai tambahan dari tumpukan data, namun mengabaikan nilai tambahan itu. Dalam pelaksanaan aslinya, dan juga biaya untuk memperbaikinya lebih tinggi daripada akibat kerusakannya. Namun dibagian lain akan diketahui bahwa bug ini menjadi sebuah fitur di Bitcoin.
Berikut adalah instruksi script umum dan fungsinya:
OP_DUP >>> duplikasi item dibagian atas stack
OP_HASH160 >>> dua kali hashes, menggunakan SHA-256 dan kemudian RIPEMD-160
OP_EQUALVERIFY >>> menghasilkan “true” jika inputnya sama. Menghasilkan “false” jika sebaliknya. Dan menandai bahwa transaksi itu tidak valid.
OP_CHECKSIG >>> memeriksa validitas input signature, menggunakan input public key pada hash transaksinya.
OP_CHECKMULTISIG >>> memeriksa k signature pada transaksi, apakah k signature tersebut valid dan berasal dari k public key yang bersangkutan.
Menjalankan Script
Dalam menjalankan script bahasa pemprograman yang berbasis stack (stack-based), maka akan dibutuhkan stack yang bisa di push maupun pop data. Namun tidak ada momori maupun variabel lain. Dan hal inilah mengapa bisa membuat komputasinya begitu sederhana. Karena ada dua jenis instruksi, yakni instruksi data dan opcodes. Jadi, pada saat instruksi data tersebut muncul dalam script, data itu di dorong bagian atas stack. Sedangkan opcodes melakukan beberapa fungsi, seringkali sebagai input data di bagian atas stack.
Selanjutnya adalah bagaimana untuk push beberapa data lagi keatas stack. Untuk bisa melakukannya dengan menggunakan perintah EQUALVERIFY. Pada instruksi ini, akan menghasilkan “true” jika inputnya sama. Dan menghasilkan “false” jika sebaliknya. Dan menandai bahwa transaksi itu tidak valid. Instruksi ini juga akan menggunakan dua item data di bagian atas stack. Dua item di atas stack itu adalah signature dan public key.
Setelah memeriksa bahwa pada public key itu mereferensikan public key pada transaksi yang ditentukan, maka selanjutnya adalah untuk memeriksa validitas signaturenya. Hal ini juga adalah contoh tentang bagusnya script Bitcoin yang dibangun dengan kriptografi. Meski bisa dibilang sederhana, namun ada instruksi yang cukup kuat, seperti pada instruksi OP_CHECKSIG. Instruksi tunggal ini muncul dari dua nilai stack, lalu memverifikasi signature secara keseluruhan dalam satu kali.
Sementara dalam kaitannya dengan signature, tenyata hanya ada satu hal yang bisa ditandatangani dalam Bitcoin pada keseluruhan transaksi. Jadi, instruksi CHECKSIG memunculkan dua nilai, yakni public key dan juga signature dari stack. Lalu memverifikasinya dengan signature yang valid pada keseluruhan transaksi menggunakan public key. Karena sudah mengeksekusi setiap instruksi dalam script, maka tidak ada lagi yang tersisa di stack. Jika ada kesalahan, output script ini hanya akan menunjukkan transaksi yang valid saja.
Bagaimana? Cukup lumayan bikin mumet juga ya pembahasan cara kerja Bitcoin bagian kedua tentang script Bitcoin kali ini. Ada baiknya mungkin jika disiapkan secangkir kopi sambil melanjutkan membaca secara keseluruhan.
Mari kita lanjutkan kembali pembahasan cara kerja Bitcoin bagian ketua tentang script Bitcoin. Sejauh ini sebagian besar script Bitcoin yang digunakan juga sama seperti pada contoh diatas. Secara keseluruhan script menetapkan satu public key dan membutuhkan sebuah signature pada public key tersebut untuk bisa mentransaksikan koin atau melakukan pembayaran.
Masih ada beberapa instruksi lagi yang juga dipergunakan. Penggunaan MULTISIG, digunakan pada tipe script khusus yang disebut dengan Pay-to-Script-Hash. Sedangkan node Bitcoin, umumnya memiliki standar whitelist script. Node umumnya akan menolak menggunakan script yang tidak ada dalam daftar whitelist tersebut. Namun bukan berarti mereka tidak menggunakan script itu sepenuhnya. Namun karena mereka beranggapan akan menjadi lebih sulit saat menggunakan script itu.
Berikut adalah beberapa skript lainnya:
Proof of Burn
Proof of burn adalah sebuah script yang tidak pernah bisa di reedem. Mengirim sejumlah koin menggunakan proof of burn akan menetapkan bahwa mereka telah jadi hancur karena tidak ada cara yang memungkinkan bagi mereka untuk bisa dipergunakan atau dibelanjakan. Fungsi penggunaan proof of burn ini adalah sebagai alternatif, dengan cara memaksa orang untuk menghancurkan Bitcoinnya, agar bisa mendapatkan koin baru, namun dalam sebuah sistem yang baru.
Penerapan Proof of Burn cukup simpel. OP_RETURN opcode akan menghasilkan error jika itu terjadi. Tidak masalah meski berapapun nilai yang diinput sebelum penempatan OP_RETURN, karena instruksi ini saat dijalankan akan menghasilkan false.
Karena berhasil menunjukkan error, data pada script yang muncul setelah OP_RETURN tidak akan diproses. Sehingga bisa menjadi peluang bagi seseorang untuk bisa menempatkan data apapun kedalam script, dan kedalam blockchain. Dalam beberapa alasan lain, jika anda ingin menuliskan nama anda, atau jika anda ingin menempatkan timestamp sebagai bukti bahwa anda mengetahui beberapa data pada beberapa waktu secara spesifik, maka anda bisa membuat transaksi dengan nilai Bitcoin yang cukup rendah. Anda juga bisa menghancurkan sejumlah kecil Bitcoin, namun akan tetep harus dituliskan kedalam blockchain. Sehingga akan tetap tersimpan.
Pay-to-Script-Hash
Satu konsekuensi dari bekerjanya script Bitcoin adalah, bahwa sender harus menentukan script dengan jelas. Kadangkala bisa dengan cara yang cukup aneh. Misalnya, anda belanja sesuatu secara online. Lalu anda memesan suatu barang dan mengatakan bahwa anda siap untuk membayar barang tersebut. Anda pun meminta alamat tujuan pembayaran anda. Sementara, penjual tempat anda memesan barang tersebut menggunakan address MULTISIG. Karena untuk bisa membelanjakan koin harus menentukan secara tepat, penjual itu lalu berkata, bahwa saat ini mereka menggunakan MULTISIG. Penjual meminta anda untuk mengirimkan koin dengan menggunakan beberapa script yang rumit.
Karena anda tidak terbiasa dengan hal itu, maka anda pun menjawab bahwa anda tidak mengetahui bagaimana cara melakukannya. Karena memang hal tersebut terlalu sulit. Sebagai konsumen, anda tentu hanya menginginkan bisa melakukan ke alamat seperti biasa tanpa melalui proses yang rumit.
Bitcoin bisa mengatasi hal ini, dan tidak hanya untuk Multi-Sig, tapi juga pada beberapa kondisi yang lebih rumit pada saat koin hendak dibelanjakan. Misalkan saja penjual akan berkata, “kirimkan koin anda ke hash dari public key ini”. Maka penjual tersebut bisa mengganti perkataannya dengan berkata, “kirimkan koin anda ke hash dari script ini”. Dengan cara itu akan bisa memaksa untuk menebus uang atau koin mereka. Selanjutnya, memberikan data yang membuat script bisa mengevaluasi dengan benar. Dan pengirim atau pembeli pada transaksi ini bisa menggunakan script Pay-to-Script-Hash.
Secara khusus, script Pay-to-Script-Hash hanya akan melakukan hashing pada bagian atas stack. Memastikan apakah sesuai dengan nilai hash, lalu mengeksekusi langkah kedua dalam proses validasinya. Bahwa bagian atas stack bisa merepresentasikan urutan instruksi. Lalu mengeksekusi kedua kalinya sebagai sebuah script pada sisa stack lainnya sebagai input.
Meski demikian, mendapat support pada Pay-to-script-hash cukup rumit karena memang bukan merupakan bagian dari spesifikasi desain Bitcoin sejak awal. Namun fitur dari script ini menjadi penting untuk ditambahkan pada Bitcoin, meskipun tidak ada dalam spesifikasi aslinya. Karena akan bisa memecahkan beberapa masalah penting. Seperti pada contoh tadi, ketika seorang pembeli hendak melakukan pembayaran pada orang lain yang menggunakan MultiSig.
Selain itu, Pay-to-script-hash juga memiliki efisiensi yang bagus. Seorang penambang, harus melacak serangkaian output script yang belum ditebus (reedem). Caranya dengan menggunakan output pay-to-script-hash. Karena output script pay-to-script-hash lebih kecil hanya dedngan menentukan hash. Sehingga semua kompleksitas itu didorong dengan input script.
Nah, sekarang telah kita ketahui pembahasan cara kerja Bitcoin bagian kedua tentang Script Bitcoin ini. Selanjutnya di bahasan yang akan datang, kita akan lanjutkan seri pembahasan cara kerja Bitcoin bagian ketiga tentang aplikasi pada Script yang telah kita bahas kali ini.