Connect with us

Academy

Memahami Bitcoin Script: Bahasa Program yang Mengatur Transaksi

Published

on

Memahami Bitcoin Script: Bahasa Program yang Mengatur Transaksi. Sumber: Binance Academy.

Untuk memahami Bitcoin Script, penting untuk memahami bahwa ini adalah bahasa pemrograman yang digunakan di dalam jaringan Bitcoin untuk mengontrol transaksi. Bitcoin Script berfungsi sebagai panduan untuk menentukan bagaimana dana yang terkunci dalam alamat Bitcoin dapat dibelanjakan.

Bitcoin sering dijuluki sebagai uang yang dapat diprogram atau “programmable money.” Keunikan sifat digitalnya memberikan pengguna fleksibilitas tinggi dalam mengatur bagaimana dana dapat dibelanjakan.

Dalam percakapan sehari-hari, kita sering menyebut tentang dompet dan koin Bitcoin. Namun, kita dapat memandangnya dengan cara yang lebih teknis: dompet sebagai kunci, koin sebagai cek, dan blockchain sebagai barisan brankas yang terkunci. Setiap brankas memiliki slot tipis di dalamnya yang memungkinkan seseorang untuk memasukkan cek atau melihat jumlah nilai yang disimpan di dalamnya, tetapi hanya pemilik kunci yang memiliki akses ke dalamnya.

Pemilik kunci, ketika ingin mentransfer uang kepada orang lain, akan membuka brankas. Mereka membuat cek baru yang menggantikan cek lama (yang kemudian dihancurkan) dan mengunci cek baru itu di dalam brankas penerima. Ketika penerima ingin menggunakan uang tersebut, ia akan mengulangi proses yang sama.

Dalam artikel ini, kami akan mengulas lebih dalam mengenai “Script” Bitcoin, bahasa pemrograman yang digunakan oleh node-node dalam jaringan Bitcoin. Script mengatur mekanisme penguncian dan pembukaan brankas, seperti yang telah dijelaskan sebelumnya.

Cara Bitcoin Bekerja

Secara analogi, setiap transaksi Bitcoin dapat dibagi menjadi dua bagian utama: kunci (yang digunakan untuk membuka brankas) dan gembok. Anda menggunakan kunci untuk membuka brankas yang berisi cek yang ingin Anda kirim, dan kemudian Anda menambahkan cek yang baru ke dalam brankas baru dengan gembok yang berbeda.

Pada dasarnya, ini terlihat sederhana, tetapi ada variasi pada jenis kunci yang dapat digunakan dalam sistem. Beberapa brankas mungkin mengharuskan Anda memiliki beberapa kunci, sementara brankas lainnya mungkin mengharuskan Anda membuktikan bahwa Anda memiliki pengetahuan tertentu. Ada banyak kondisi lain yang dapat diatur.

Advertisement

Dalam konteks ini, kunci disebut sebagai “scriptSig,” sementara gembok disebut sebagai “scriptPubKey.” Jika kita melihat komponen-komponen ini dengan lebih rinci, kita akan menemukan bahwa semuanya terdiri dari data dan kode. Ketika digabungkan, ini menciptakan sebuah program kecil.

Saat Anda melakukan transaksi, Anda menyebarkan kombinasi dari scriptSig dan scriptPubKey ke jaringan. Setiap node yang menerima transaksi tersebut akan memeriksa program tersebut untuk memastikan apakah transaksi itu sah atau tidak. Jika tidak sah, transaksi akan ditolak, dan Anda tidak akan dapat menghabiskan dana yang dikunci.

Cek (atau koin) yang Anda miliki dikenal sebagai “output transaksi yang belum dibelanjakan” atau “unspent transaction outputs (UTXO).” Dana ini dapat digunakan oleh siapa saja yang dapat menyediakan kunci yang cocok dengan gemboknya, yaitu scriptSig dan scriptPubKey.

Jika ada UTXO di dompet Anda, biasanya akan ada kondisi yang menyatakan bahwa hanya orang yang dapat membuktikan kepemilikan kunci publik ini yang dapat membuka dana tersebut. Untuk membukanya, Anda harus menyediakan scriptSig yang mencakup tanda tangan digital, menggunakan kunci pribadi yang sesuai dengan kunci publik yang ditentukan dalam scriptPubKey. Semua ini akan kami bahas lebih rinci.

Pahami Bitcoin Script

Script dikenal sebagai bahasa pemrograman yang berbasis “stack.” Ini berarti ketika kita membaca serangkaian instruksi, kita menempatkannya dalam tumpukan vertikal. Misalnya, daftar A, B, C akan menghasilkan tumpukan dengan A di bagian bawah dan C di bagian atas. Instruksi beroperasi pada satu atau lebih elemen yang dimulai dari bagian atas tumpukan.

Elemen A, B, dan C ditambahkan dan “muncul” dari tumpukan.
Elemen A, B, dan C ditambahkan dan “muncul” dari tumpukan. Sumber: Binance Academy.

Dalam script, kita dapat membedakan antara data seperti tanda tangan, hash, dan kunci publik, dengan instruksi atau “opcode” yang melakukan operasi pada data tersebut. Berikut adalah contoh skrip yang sangat sederhana:

<xyz> <md5 hasher <d16fb36f0911f878998c136191af705e> <check if equal>

Dalam contoh ini, elemen berwarna merah adalah data, sementara elemen berwarna biru adalah opcode. Skrip ini dibaca dari kiri ke kanan. Pertama, kita meletakkan string <xyz> ke dalam tumpukan. Selanjutnya, kita memiliki opcode <md5 hasher>. Walaupun opcode ini tidak ada dalam Bitcoin, misalnya, katakanlah ini menghapus elemen teratas dari tumpukan (<xyz>) dan melakukan hashing menggunakan algoritma MD5. Hasil hash tersebut kemudian ditambahkan kembali ke dalam tumpukan.

Advertisement

Elemen berikutnya adalah <d16fb36f0911f878998c136191af705e>, sehingga sekarang tumpukan memiliki dua elemen yang identik. Terakhir, opcode <check if equal> mengambil dua elemen teratas dari tumpukan dan memeriksa apakah keduanya sama. Jika iya, <1> akan ditambahkan ke dalam tumpukan; jika tidak, <0> akan ditambahkan.

Dengan demikian, kita mencapai akhir daftar instruksi. Script dapat gagal dalam dua cara: jika elemen yang tersisa adalah nol atau jika salah satu opcode mengakibatkan kegagalan ketika beberapa kondisi tidak terpenuhi. Tidak ada opcode seperti itu dalam contoh ini, sehingga skrip dianggap sah. Prinsip-prinsip ini juga berlaku dalam transaksi Bitcoin sebenarnya.

Itu hanya program yang disederhanakan. Sekarang, mari kita lihat beberapa contoh program yang digunakan dalam dunia nyata.

Pay-to-Pubkey (P2PK): Penguncian Dana dengan Simplicity

Pay-to-Pubkey (P2PK) adalah pendekatan yang sangat sederhana dalam dunia Bitcoin. Ini melibatkan penguncian dana ke dalam sebuah kunci publik tertentu. Jika Anda ingin menerima dana dengan cara ini, yang perlu Anda lakukan adalah memberikan kunci publik Anda kepada pengirim, bukan alamat Bitcoin.

Transaksi pertama antara Satoshi Nakamoto dan Hal Finney pada tahun 2009 adalah contoh nyata dari transaksi P2PK. Pada awal perkembangan Bitcoin, metode P2PK sering digunakan, tetapi seiring berjalannya waktu, Pay-to-Pubkey-Hash (P2PKH) telah menggantikannya secara luas.

Struktur script penguncian dalam transaksi P2PK sederhana: <public key> OP_CHECKSIG. Seperti yang bisa Anda duga, OP_CHECKSIG memeriksa tanda tangan terhadap kunci publik yang diberikan. Maka dari itu, scriptSig kita menjadi hanya <signature> sederhana. Penting untuk diingat bahwa scriptSig ini adalah kunci untuk membuka gembok.

Tanda tangan ditempatkan dalam stack, diikuti oleh kunci publik. Kemudian, opcode OP_CHECKSIG berperan untuk memunculkan keduanya dan memverifikasi tanda tangan terhadap kunci publik. Jika tanda tangan sesuai, maka <0> akan ditambahkan ke stack. Sebaliknya, jika tanda tangan tidak cocok, maka <1> yang akan ditambahkan.

Meskipun sederhana, P2PK tidak lagi banyak digunakan dalam transaksi Bitcoin. Berikut adalah beberapa alasan mengapa.

Advertisement

Pay-to-Pubkey-Hash (P2PKH): Standar Transaksi yang Umum

Pay-to-Pubkey-Hash (P2PKH) saat ini adalah jenis transaksi yang paling umum digunakan dalam ekosistem Bitcoin. Kecuali jika Anda menggunakan perangkat lunak kuno, dompet Anda kemungkinan besar akan menggunakan metode ini secara default.

Struktur scriptPubKey dalam P2PKH terdiri dari langkah-langkah berikut:

OP_DUP OP_HASH160 <public key hash> OP_EQUALVERIFY OP_CHECKSIG

Sebelum kita memahami scriptSig, mari kita bahas apa yang dilakukan oleh beberapa opcode baru ini:

OP_DUP

OP_DUP digunakan untuk menduplikat elemen pertama di stack dan menambahkan kedua salinannya kembali ke stack. Ini biasanya digunakan untuk menjalankan operasi terhadap duplikat elemen tanpa memengaruhi elemen asli.

OP_HASH160

OP_HASH160 mengambil elemen pertama di stack dan melakukan dua kali hashing. Pertama, dengan algoritma SHA-256, kemudian hashing kedua dilakukan pada hasil output SHA-256 menggunakan algoritma RIPEMD-160. Hasil akhirnya ditambahkan kembali ke stack.

OP_EQUALVERIFY

OP_EQUALVERIFY menggabungkan dua operator, yaitu OP_EQUAL dan OP_VERIFY. OP_EQUAL mengambil dua elemen dari stack dan memeriksa apakah keduanya identik. Jika benar, maka <1> akan ditambahkan ke stack. Jika tidak, maka <0> akan ditambahkan. 

Advertisement

OP_VERIFY memeriksa elemen paling atas dari stack dan memastikan itu adalah True (yaitu, bukan-nol). Jika tidak, transaksi akan gagal. Secara keseluruhan, OP_EQUALVERIFY memaksa transaksi untuk gagal jika dua elemen teratas tidak cocok.

Kali ini, scriptSig terlihat seperti ini: <signature> <public key>. Anda harus menyediakan tanda tangan dan kunci publik yang sesuai untuk membuka output P2PKH.

Apa yang perlu dicatat adalah dalam script penguncian P2PKH, public key sebenarnya tidak terlihat – yang terlihat hanya hash dari public key tersebut. Bahkan saat kita melihat output P2PKH yang belum dibelanjakan di penjelajah blockchain, kita tidak akan dapat menemukan public key yang sesungguhnya. Ini hanya akan terungkap ketika pemiliknya memutuskan untuk menghabiskan dana tersebut.

Konsep ini memiliki beberapa manfaat. Yang pertama adalah bahwa hash dari public key lebih mudah dibagikan daripada public key sebenarnya. Satoshi memutuskan untuk mengadopsinya pada tahun 2009 dengan alasan ini. Hash dari public key adalah yang kita kenal sebagai alamat Bitcoin saat ini.

Manfaat kedua adalah bahwa hash dari public key dapat memberikan tingkat keamanan tambahan terhadap komputasi kuantum. Karena public key tidak diketahui sebelum dana dihabiskan, sulit bagi pihak lain untuk menentukan private key. Dua tahap hashing (RIPEMD-160 dan SHA-256) harus dibalikkan untuk mengungkapkannya.

Pay-to-Script-Hash (P2SH): Penguncian Dana yang Lebih Lanjut

Pay-to-Script-Hash (P2SH) adalah perkembangan menarik dalam dunia Bitcoin yang memungkinkan pengirim untuk mengunci dana ke dalam hash dari sebuah script, tanpa perlu tahu detail dari apa yang sebenarnya dilakukan oleh script tersebut. Mari perhatikan contoh hash SHA-256 berikut:

E145fe9ed5c23aa71fdb443de00c7d9b4a69f8a27a2e4fbb1fe1d0dbfb6583f1

Untuk mengunci dana, pengirim tidak perlu tahu input hash yang sebenarnya. Namun, pihak yang ingin menghabiskan dana tersebut harus menyediakan script yang digunakan untuk melakukan hash dan memenuhi persyaratan dari script tersebut.

Advertisement

Hash di atas dihasilkan dari script berikut:

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

Jika Anda ingin menghabiskan koin yang terkait dengan scriptPubKey di atas, Anda tidak hanya perlu memberikan perintah tersebut, tetapi juga memerlukan scriptSig yang akan membuat script tersebut dievaluasi sebagai True. Dalam contoh ini, elemen yang Anda perlukan adalah <2>. Dengan kata lain, scriptSig Anda adalah <2>.

Dalam kehidupan nyata, scriptPubKey untuk output P2SH memiliki format berikut:

OP_HASH160 <redeemScript hash> OP_EQUAL

Tidak ada operator baru di sini, namun kita memiliki elemen baru, yaitu <redeemScript hash>. Sesuai namanya, ini adalah hash dari script yang diperlukan untuk menebus dana (disebut redeemScript). ScriptSig akan bervariasi tergantung pada apa yang ada di dalam redeemScript tersebut.

Namun, secara umum, scriptSig ini adalah kombinasi dari beberapa tanda tangan dan kunci publik, diikuti oleh redeemScript (yang wajib ada):

Advertisement

<signature> <public key> <redeemScript>

Evaluasi script ini sedikit berbeda dari eksekusi stack yang telah kita lihat sejauh ini. Proses ini terjadi dalam dua tahap. Tahap pertama hanya memeriksa bahwa Anda telah memberikan hash yang benar.

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

Namun, kita belum selesai. Node jaringan mengenali struktur ini sebagai P2SH, jadi node akan segera mendapatkan elemen scriptSig yang menunggu di stack lain, di mana tanda tangan dan kunci publik akan digunakan.

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

Artikel ini membahas apa yang dikenal sebagai script P2SH(P2PKH), meskipun sebagian besar kita tidak akan menemukannya di dunia nyata. Anda mungkin dapat membuatnya, tetapi itu mungkin tidak akan memberi Anda manfaat tambahan dan sebenarnya akan menghabiskan lebih banyak ruang dalam satu blok (yang berarti biaya lebih tinggi).

P2SH biasanya berguna dalam situasi seperti transaksi multisignature atau untuk transaksi yang kompatibel dengan SegWit. Transaksi multisig dapat sangat rumit karena melibatkan banyak kunci. 

Sebelum adanya Pay-to-Script-Hash, pengirim harus mencantumkan semua kunci publik yang mungkin terlibat dalam script penguncian. Dengan P2SH, tidak peduli seberapa rumit persyaratan pembelanjaan dana tersebut, hash dari redeemScript selalu memiliki ukuran tetap. Oleh karena itu, biaya transaksi ditanggung oleh pengguna yang ingin membuka script penguncian tersebut.

P2SH juga sangat berguna dalam konteks kompatibilitas SegWit, yang merupakan soft fork yang mengubah struktur blok/format transaksi. Karena SegWit adalah peningkatan opsional, tidak semua perangkat lunak dompet mendukungnya.

Advertisement

Tidak masalah jika klien mengemas hash script SegWit ke dalam P2SH. Seperti transaksi P2SH lainnya, Anda tidak perlu tahu isi dari redeemScript yang akan dijalankan.

Transaksi SegWit (P2WPKH dan P2WSH): Menyelami Struktur Baru Bitcoin

Untuk memahami format transaksi Segregated Witness (SegWit), mari kita selami konsepnya dengan lebih mendalam. Sekarang, kita tidak hanya memiliki scriptSig dan scriptPubKey seperti sebelumnya. Dalam SegWit, ada elemen baru yang disebut “witness.” Data yang sebelumnya disimpan dalam scriptSig sekarang dialihkan ke witness, sehingga scriptSig menjadi kosong.

Jika Anda menemui alamat Bitcoin yang diawali dengan ‘bc1’, ini disebut 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 versi SegWit dari Pay-to-Pubkey-Hash (P2PKH). Witnessnya terdiri dari:

<signature> <public key>

Anda akan melihat bahwa ini mirip dengan scriptSig dalam P2PKH, tetapi pada P2WPKH, scriptSig kosong. Sementara itu, scriptPubKey memiliki format seperti berikut:

<OP_0> <public key hash>

Advertisement

Mungkin terlihat sedikit aneh karena tidak ada operator tambahan di sini yang membandingkan tanda tangan, public key, dan hash seperti pada P2PKH. Hal ini disebabkan oleh panjang dari <public key hash>. Meskipun tidak ada opcode tambahan, node yang menerima transaksi dapat memahami cara mengelolanya berdasarkan panjang <public key hash>. Panjangnya akan dihitung dan transaksi akan dievaluasi sesuai dengan aturan yang sama dengan transaksi P2PKH yang lebih tradisional.

Node yang tidak ditingkatkan untuk SegWit mungkin tidak tahu bagaimana memproses transaksi dengan cara baru ini, tetapi tidak ada masalah karena dalam aturan lama, tidak ada konsep witness. Oleh karena itu, node tersebut hanya akan melihat scriptSig kosong dan beberapa data lain, mengevaluasinya, dan menandainya sebagai valid – artinya siapa pun dapat menghabiskan output tersebut. Inilah mengapa SegWit dianggap sebagai soft fork yang kompatibel ke belakang.

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

Pay-to-Witness-Script Hash (P2WSH) adalah konsep baru yang setara dengan P2SH. Jika Anda telah sampai sejauh ini, Anda mungkin sudah mulai memahami bagaimana ini bekerja, tetapi mari kita bahas lebih lanjut. Witness biasanya dimasukkan ke dalam scriptSig. Misalnya, dalam P2WSH yang membungkus transaksi P2PKH, mungkin akan terlihat seperti ini:

<signature 1> <public key>

Sedangkan scriptPubKey-nya akan seperti ini:

<OP_0> <script hash>

Aturan yang sama berlaku di sini. Node SegWit membaca panjang hash dari script dan menentukannya sebagai output P2WSH, yang dievaluasi dengan cara yang mirip dengan P2SH. Node yang belum ditingkatkan hanya akan melihatnya sebagai output yang dapat dibelanjakan oleh siapa pun.

Advertisement

Penutup

Dalam artikel ini, kita telah menjelajahi struktur Bitcoin dengan lebih mendalam. Semakin kita menggali Bitcoin, semakin jelas kita akan melihat potensinya. 

Transaksi Bitcoin dapat terdiri dari berbagai komponen yang berbeda, dan dengan memahami konsep ini, pengguna memiliki fleksibilitas yang luar biasa dalam mengatur persyaratan bagaimana dan kapan dana dapat dibelanjakan.


Jika kamu ingin mengetahui lebih dalam mengenai aset kripto atau cryptocurrency, bisa baca artikel “Belajar Crypto untuk Pemula Mulai Dari Sini.”

Sumber: Binance Academy Indonesia

Popular