Mengenal Bitcoin Script
Beranda
Artikel
Mengenal Bitcoin Script

Mengenal Bitcoin Script

Tingkat Lanjut
Diterbitkan Jul 10, 2020Diperbarui Jan 18, 2022
13m

Daftar isi


Pengantar

Bitcoin kadang-kadang disebut sebagai uang yang dapat diprogram atau programmable money. Karena sifat digitalnya, memungkinkan pengguna memiliki fleksibilitas yang tinggi dalam mengatur kondisi bagaimana dana dapat dibelanjakan. 
Kita berbicara mengenai dompet dan koin ketika membahas Bitcoin. Tetapi kita juga bisa menganggap dompet sebagai kunci, koin sebagai cek, dan blockchain sebagai deretan brankas yang terkunci. Setiap brankas memiliki slot tipis di dalamnya, sehingga siapa pun dapat memasukkan cek atau melihat seberapa besar nilai yang disimpan. Namun, hanya pemilik kunci yang dapat mengakses ke dalam.

Jika pemilik kunci ingin memberikan uang kepada orang lain, ia membuka brankas. Membuat cek baru yang merujuk ke cek lama (yang kemudian dihancurkan) dan memasukkan dan menguncinya ke dalam brankas yang dapat dibuka penerima. Untuk membelanjakannya, penerima baru akan mengulangi proses yang sama.

Dalam artikel ini, kita akan melihat Script lebih dekat, bahasa pemrograman yang diterjemahkan oleh node pada jaringan Bitcoin. Script mengatur mekanisme penguncian/pembukaan brankas seperti yang digambarkan sebelumnya.


Bagaimana cara kerja Bitcoin?

Mengikuti analogi sebelumnya, bisa dikatakan bahwa ada dua bagian dalam setiap transaksi – kunci (untuk membuka brankas Anda) dan gembok. Anda menggunakan kunci untuk membuka brankas berisi cek yang ingin Anda kirim, dan kemudian Anda menambahkan cek yang baru ke dalam brankas baru dengan gembok yang berbeda. Untuk membelanjakan cek dari brankas baru, Anda membutuhkan kunci lain.
Tampak sederhana. Anda juga bisa mendapatkan sedikit variasi pada jenis kunci di dalam sistem. Mungkin beberapa brankas mengharuskan Anda memiliki beberapa kunci, sedangkan brankas yang lain mengharuskan Anda untuk membuktikan bahwa Anda mengetahui rahasia tertentu. Ada banyak kondisi lainnya yang dapat diatur. 
Kunci di sini disebut scriptSig. Gemboknya adalah scriptPubKey. Jika kita melihat komponen-komponen ini dengan sedikit lebih detail, kita akan menemukan bahwa semua sebenarnya terdiri dari bit data dan blok kode. Ketika digabungkan, menghasilkan program kecil.

Saat Anda melakukan transaksi, Anda menyiarkan kombinasi keduanya ke jaringan. Setiap node yang menerima akan memeriksa program, yang memberi tahu apakah transaksi tersebut valid atau tidak. Jika tidak, akan dibuang, Anda tidak akan bisa membelanjakan dana yang terkunci.

Cek (koin) yang Anda miliki disebut output transaksi yang tidak dibelanjakan atau unspent transaction outputs (UTXO). Dana dapat digunakan oleh siapa saja yang dapat menyediakan kunci yang cocok dengan gembok. Kuncinya adalah scriptSig dan gemboknya scriptPubKey.
Jika UTXO ada di dompet Anda, kemungkinan akan memiliki kondisi yang menyatakan hanya orang yang dapat membuktikan kepemilikan public key ini yang dapat membuka dana. Untuk membukanya, Anda menyediakan scriptSig yang menyertakan tanda tangan digital, menggunakan private key yang memetakan public key yang ditentukan dalam scriptPubKey. Kita akan membahas ini semua dengan lebih jelas.


Memahami Bitcoin stack

Script dikenal sebagai bahasa berbasis stack. Artinya, ketika kita membaca sekumpulan instruksi, kita menempatkannya dalam semacam kolom vertikal. Daftar A, B, C, misalnya, akan menghasilkan tumpukan atau stack dengan A di bagian bawah, dan C di bagian atas. Ketika instruksi memberitahu kita untuk melakukan sesuatu, kita beroperasi pada satu atau lebih elemen yang dimulai dari tumpukan atas.


Elemen A, B, dan C ditambahkan dan “muncul” dari tumpukan.


Kita dapat membedakan antara data (hal-hal seperti tanda tangan, hash, dan public key) dengan instruksi (atau opcode). Instruksi menghapus data dan melakukan sesuatu terhadap data tersebut. Berikut ini contoh script yang sangat sederhana:
<xyz> <md5 hasher> <d16fb36f0911f878998c136191af705e> <check if equal>
Dalam warna merah, kita memiliki data, dan warna biru, kita memiliki opcode. Dibaca dari kiri ke kanan, jadi pertama-tama kita meletakkan string <xyz> ke stack. Selanjutnya adalah opcode <md5 hasher>. Yang ini tidak ada di Bitcoin, tetapi katakanlah itu menghapus elemen teratas dari stack (<xyz>) dan melakukan hashing terhadapnya menggunakan algoritma MD5. Kemudian, output ditambahkan kembali ke stack. Output di sini adalah d16fb36f0911f878998c136191af705e.
Kebetulan sekali! Elemen berikutnya yang akan ditambahkan adalah <d16fb36f0911f878998c136191af705e>, jadi sekarang stack kita memiliki dua elemen yang identik. Terakhir, <check if equal> memunculkan dua elemen di atas stack dan memeriksa apakah keduanya sama. Jika ya, <1> akan ditambakan ke stack. Jika tidak, <0> yang akan ditambahkan. 
Kita sampai di akhir daftar instruksi. Script bisa gagal dalam dua cara – jika elemen yang tersisa adalah nol, atau jika salah satu operator menyebabkannya gagal ketika beberapa kondisi tidak terpenuhi. Tidak ada operator seperti itu dalam contoh ini, dan kita berakhir dengan elemen bukan-nol (<1>), jadi, script valid. Aturan-aturan ini berlaku juga dalam transaksi Bitcoin yang sebenarnya.

Itu hanya program yang dibuat-buat. Mari kita melihat beberapa program yang sebenarnya.


Pay-to-Pubkey (P2PK)

Pay-to-Pubkey (P2PK) sangat mudah. Penguncian dana ke public key tertentu. Jika ingin menerima dana dengan cara ini, Anda akan memberi public key Anda kepada si pengirim, bukan alamat Bitcoin. 

Transaksi pertama  antara Satoshi Nakamoto dan Hal Finney di tahun 2009 merupakan transaksi P2PK. Struktur ini banyak digunakan pada masa-masa awal Bitcoin, tetapi saat ini, Pay-to-Pubkey-Hash (P2PKH) telah menggantikannya secara luas. 
Script penguncian untuk transaksi P2PK mengikuti format <public key> OP_CHECKSIG. Cukup sederhana. Anda mungkin sudah menduga bahwa OP_CHECKSIG memeriksa tanda tangan terhadap public key yang disediakan. Dengan demikian, scriptSig kita akan menjadi <signature> sederhana. Ingat, scriptSig adalah kunci terhadap gembok.



Sangat sederhana. Tanda tangan ditambahkan ke stack, diikuti oleh public key. OP_CHECKSIG memunculkan keduanya dan memverifikasi tanda tangan terhadap public key. Jika cocok, <1> ditambahkan ke stack. Jika tidak, <0> yang akan ditambahkan.

P2PK tidak lagi digunakan. Alasannya akan diuraikan selanjutnya.


Pay-to-Pubkey-Hash (P2PKH)

Pay-to-Pubkey-Hash (P2PKH) sekarang merupakan jenis transaksi yang paling umum. Kecuali jika Anda mengunduh perangkat lunak kuno, dompet Anda kemungkinan besar akan melakukan ini secara default.

ScriptPubKey dalam P2PKH adalah sebagai berikut:

OP_DUP OP_HASH160 <public key hash> OP_EQUALVERIFY OP_CHECKSIG

Sebelum mengenali scriptSig, mari kita uraikan apa yang akan dilakukan oleh opcode baru:


OP_DUP

OP_DUP memunculkan elemen pertama, dan menduplikasinya. Kemudian, menambahkan keduanya kembali ke stack. Biasanya, ini dilakukan agar kita dapat melakukan operasi terhadap duplikat tanpa mempengaruhi aslinya.


OP_HASH160

Memunculkan elemen pertama dan melakukan hash terhadap elemen tersebut dua kali. Tahap pertama, hash dilakukan dengan algoritma SHA-256. Kemudian hash akan dilakukan terhadap output SHA-256 dengan algoritma RIPEMD-160. Output yang dihasilkan ditambahkan kembali ke stack.


OP_EQUALVERIFY

OP_EQUALVERIFY menggabungkan dua operator lain – OP_EQUAL dan OP_VERIFY. OP_EQUAL memunculkan dua elemen dan memeriksa apakah keduanya identik. Jika ya, 1 akan ditambahkan ke stack. Jika tidak, 0 yang akan ditambahkan. OP_VERIFY memunculkan elemen atas dan memeriksa apakah itu True (yaitu bukan-nol). Jika tidak, transaksi gagal. Digabungkan, OP_EQUALVERIFY menyebabkan transaksi gagal jika dua elemen teratas tidak cocok.

Kali ini, scriptSig terlihat seperti ini:

<signature> <public key>

Anda harus menyediakan tanda tangan dan public key yang sesuai untuk membuka output P2PKH.



Anda dapat melihat apa yang terjadi di GIF di atas. Tidak terlalu berbeda dari script P2PK. Kita hanya menambahkan langkah ekstra untuk memeriksa apakah public key cocok dengan hash dalam script.

Namun, ada sesuatu yang perlu diperhatikan. Dalam script penguncian P2PKH, public key tidak terlihat – kita hanya bisa melihat hash-nya. Jika kita menuju eksplorer blockchain dan melihat output P2PKH yang belum dihabiskan, kita tidak dapat menentukan public key, hanya terungkap ketika penerima memutuskan untuk mentransfer dana.
Ini memiliki beberapa manfaat. Yang pertama adalah bahwa hash public key lebih mudah untuk dibagikan daripada public key lengkap. Satoshi meluncurkannya pada tahun 2009 karena alasan ini. Hash public key adalah apa yang kita kenal sebagai alamat Bitcoin hari ini.
Manfaat kedua adalah bahwa hash public key dapat memberikan lapisan keamanan tambahan terhadap komputasi kuantum. Karena public key tidak diketahui sampai kita membelanjakan dana, bahkan semakin sulit bagi orang lain untuk menentukan private key. Dua putaran hashing (RIPEMD-160 dan SHA-256) harus dibalikkan untuk mendapatkannya.



Pay-to-Script-Hash (P2SH)

Pay-to-Script-Hash (P2SH) merupakan pengembangan yang sangat menarik terhadap Bitcoin. Memungkinkan pengirim untuk mengunci dana ke hash script – mereka tidak perlu tahu apa yang sebenarnya dilakukan script. Coba lihat hash SHA-256 berikut:

e145fe9ed5c23aa71fdb443de00c7d9b4a69f8a27a2e4fbb1fe1d0dbfb6583f1

Anda tidak perlu mengetahui input hash untuk mengunci dana. Namun, pihak yang membelanjakan, perlu menyediakan script yang digunakan untuk melakukan hash dan perlu memenuhi persyaratan script tersebut.

Hash di atas dibuat dari script berikut:

<multiply by 2> <4> <check if equal>

Jika Anda ingin membelanjakan koin yang terkait dengan scriptPubKey tersebut, Anda tidak hanya menyediakan perintah itu, tetapi juga memerlukan scriptSig yang membuat script yang sudah selesai dievaluasi menjadi True. Dalam contoh ini, adalah elemen yang Anda <multiply by 2> untuk memberikan hasil <4>. Tentu saja, itu berarti scriptSig kita adalah <2>.

Dalam kehidupan nyata, scriptPubKey untuk output P2SH adalah:

OP_HASH160 <redeemScript hash> OP_EQUAL

Tidak terdapat operator baru di sini. Tetapi, kita memiliki <redeemScript hash>  sebagai elemen baru. Seperti namanya, ini adalah hash dari script yang perlu disediakan untuk menebus dana (disebut redeemScript). ScriptSig akan berubah tergantung pada apa yang ada di dalam redeemScript. Namun, secara umum, ini adalah kombinasi beberapa tanda tangan dan public key terlampir, diikuti oleh redeemScript (wajib):

<signature> <public key> <redeemScript>

Evaluasi kita sedikit berbeda dari eksekusi stack yang telah kita lihat sejauh ini. Itu terjadi dalam dua bagian. Yang pertama hanya memeriksa bahwa Anda telah memberikan hash yang benar. 



Anda akan perhatikan bahwa kita tidak melakukan apa pun terhadap elemen sebelum redeemScript. Elemen tersebut tidak digunakan pada saat ini. Kita telah mencapai bagian akhir dari program mini ini, dan elemen teratas adalah bukan-nol. Itu berarti valid.

Namun, kita belum selesai. Node jaringan mengenali struktur ini sebagai P2SH, sehingga node benar-benar mendapatkan elemen scriptSig menunggu di stack lain, di mana tanda tangan dan public key akan digunakan.
Sejauh ini, kita telah memperlakukan redeemScript sebagai elemen, tapi sekarang, akan ditafsirkan sebagai instruksi, yang bisa berupa apa saja. Mari kita ambil contoh script penguncian P2PKH, yang terhadapnya kita harus menyediakan <signature> dan <public key> yang cocok dengan <public key hash> di dalam <redeemScript>.



Setelah redeemScript diperluas, Anda dapat melihat bahwa kita memiliki situasi yang persis seperti transaksi P2PKH biasa. Dari sana, Anda hanya perlu menjalankannya seperti biasa.

Kita telah mendemonstrasikan apa yang disebut script P2SH(P2PKH) di sini, namun, kemungkinan Anda tidak akan menemukannya di alam bebas. Anda bisa saja membuatnya, tetapi itu tidak akan memberi Anda manfaat tambahan, justru pada akhirnya akan menghabiskan lebih banyak ruang dalam satu blok (dan, karenanya, membutuhkan biaya lebih banyak).

P2SH umumnya berguna dalam hal-hal seperti multisignature atau transaksi SegWit-compatible. Transaksi multisig bisa sangat besar karena mungkin memerlukan beberapa kunci. Sebelum implementasi Pay-to-Script-Hash, pengirim harus membuat daftar semua kunci publik yang mungkin ada dalam script penguncian. 

Namun, dengan P2SH, tidak masalah seberapa rumit persyaratan pembelanjaan dananya. Hash redeemScript selalu berukuran tetap. Karenanya, biaya dibebankan kepada pengguna yang ingin membuka script pengunciannya.

P2SH sangat berguna dalam kompatibilitas SegWit (kita akan membahas detail struktur transaksinya di bagian berikutnya). SegWit merupakan soft fork yang menghasilkan perubahan ke blok/format transaksi. Karena merupakan peningkatan opt-in, tidak semua perangkat lunak dompet mengenali perubahan ini.

Tidak masalah jika klien membungkus hash script SegWit ke dalam P2SH. Seperti semua transaksi jenis ini, kita tidak perlu tahu seperti apa redeemScript yang akan dibuka. 


Transaksi SegWit (P2WPKH dan P2WSH)

Untuk pengantar SegWit yang lebih komprehensif, lihat Panduan Segregated Witness bagi Pemula.
Untuk memahami format transaksi SegWit, Anda hanya perlu tahu bahwa kita tidak lagi hanya memiliki scriptSig dan scriptPubKey. Sekarang, kita juga memiliki bidang baru yang disebut witness. Data yang digunakan untuk menyimpan di scriptSig dipindahkan ke witness, sehingga scriptSig kosong.

Jika Anda menemukan alamat yang diawali dengan ‘bc1’, kita menyebutnya SegWit-native (berbeda dengan SegWit-compatible, yang dimulai dengan ‘3’, yang merupakan alamat P2SH).


Pay-to-Witness-Pubkey-Hash (P2WPKH)

Pay-to-Witness-Pubkey-Hash (P2WPKH) adalah P2PKH versi SegWit. Witness terlihat seperti ini:

<signature> <public key>

Anda akan memperhatikan bahwa ini sama dengan scriptSig dari P2PKH. Di sini, scriptSig kosong. Sementara itu, scriptPubKey menyerupai yang berikut:

<OP_0> <public key hash>

Terlihat agak aneh, bukan? Di mana opcode, yang memungkinkan kita membandingkan tanda tangan, public key, dan hashnya?

Kita tidak menunjukkan operator tambahan di sini, karena node yang menerima transaksi mengetahui apa yang harus dilakukan dengannya berdasarkan panjang <public key hash>. Panjangnya akan dihitung dan harus dijalankan dengan gaya yang sama dengan transaksi P2PKH yang kuno.
Node yang tidak ditingkatkan tidak mengetahui bagaimana menerjemahkan transaksi dengan cara tersebut, tetapi itu tidak masalah. Di dalam aturan lama, tidak ada witness, jadi, node membaca scriptSig kosong dan beberapa data, mengevaluasi dan menandainya valid – siapa pun dapat membelanjakan output. Inilah sebabnya mengapa SegWit dianggap sebagai soft fork backward-compatible.


Pay-to-Witness-Script-Hash (P2WSH)

Pay-to-Witness-Script Hash (P2WSH) merupakan P2SH baru. Jika Anda sudah sampai sejauh ini, Anda mungkin bisa mencari tahu bagaimana ini terlihat, tetapi, kita akan tetap membahasnya. Witness biasanya dimasukkan ke dalam scriptSig. Misalnya, dalam P2WSH yang membungkus transaksi P2PKH, mungkin terlihat seperti ini:

<signature 1> <public key>

Ini scriptPubKey-nya:

<OP_0> <script hash>

Aturan yang sama berlaku. Node SegWit membaca panjang hash script dan menentukannya sebagai output P2WSH, yang dievaluasi mirip dengan P2SH. Sementara itu, node yang lama hanya melihatnya sebagai output yang dapat dibelanjakan oleh siapa saja.


Penutup

Dalam artikel ini, kita telah belajar sedikit mengenai blok-blok bangunan Bitcoin. Mari kita simpulkan dengan cepat:


Jenis scriptDeskripsi

Pay-to-Pubkey (P2PK)

Mengunci dana dengan public key tertentu

Pay-to-Pubkey-Hash (P2PKH)

Mengunci dana dengan hash public key tertentu (yaitu alamat)

Pay-to-Script-Hash (P2SH)

Mengunci dana dengan hash script yang dimiliki oleh penerima

Pay-to-Witness-Pubkey-Hash (P2WPKH)

P2PK versi SegWit

Pay-to-Witness-Script-Hash (P2WSH)

P2SH versi SegWit


Jika Anda menggali Bitcoin lebih dalam, Anda akan memahami mengapa Bitcoin memiliki begitu banyak potensi. Transaksi dapat terdiri dari berbagai komponen. Dengan memainkan blok bangunan ini, pengguna memiliki banyak fleksibilitas dalam pengaturan persyaratan bagaimana dan kapan dana dapat dibelanjakan.