Perkenalan

Bitcoin terkadang disebut sebagai uang yang dapat diprogram. Karena sifat digitalnya, hal ini memberikan pengguna fleksibilitas yang tinggi dalam menentukan kondisi bagaimana dana dapat dibelanjakan.

Kami berbicara tentang dompet dan koin ketika mendiskusikan Bitcoin. Namun kita juga dapat 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 menyetor cek atau melihat berapa nilai brankas tersebut. Namun, hanya pemegang kunci yang dapat mengakses bagian dalamnya.

Ketika pemegang kunci ingin memberikan uang kepada orang lain, mereka membuka kunci kotaknya. Mereka membuat cek baru yang merujuk pada cek lama (yang kemudian dimusnahkan) dan menguncinya di dalam kotak yang dapat dibuka oleh penerima. Untuk membelanjakannya, penerima baru mengulangi prosesnya.

Pada artikel ini, kita akan melihat lebih dekat Script, bahasa pemrograman yang ditafsirkan oleh node di jaringan Bitcoin. Skrip inilah yang mengatur mekanisme penguncian/pembukaan yang disebutkan untuk brankas.


Bagaimana cara kerja Bitcoin?

Berdasarkan analogi kami di atas, Anda dapat mengatakan bahwa ada dua bagian dalam setiap transaksi – kunci (untuk membuka kunci kotak Anda) dan gembok. Anda menggunakan kunci Anda untuk membuka kotak yang berisi cek yang ingin Anda kirim, lalu Anda menambahkan yang baru ke kotak baru dengan kunci berbeda. Untuk mengeluarkan kotak baru, Anda memerlukan kunci lain.

Cukup sederhana. Anda juga bisa mendapatkan sedikit variasi pada jenis kunci dalam sistem. Mungkin beberapa brankas mengharuskan Anda memberikan beberapa kunci, dan mungkin yang lain memerlukan Anda untuk membuktikan bahwa Anda mengetahui suatu rahasia. Ada banyak ketentuan yang dapat ditetapkan orang.

Kunci kami adalah apa yang kami sebut scriptSig. Kuncinya adalah scriptPubKey kami. Jika kita melihat komponen tersebut lebih detail, kita akan menemukan bahwa komponen tersebut sebenarnya terdiri dari bit data dan blok kode. Ketika digabungkan, mereka membuat program kecil.

Saat Anda melakukan transaksi, Anda menyiarkan kombinasi tersebut ke jaringan. Setiap node yang menerimanya akan memeriksa program, yang memberitahukannya apakah transaksi tersebut valid. Jika tidak, maka dana tersebut akan dibuang begitu saja, dan Anda tidak akan dapat membelanjakan dana yang terkunci tersebut.

Cek (koin) yang Anda pegang disebut keluaran transaksi yang belum terpakai (UTXO). Dana tersebut dapat digunakan oleh siapa saja yang dapat memberikan kunci yang sesuai dengan gemboknya. Secara khusus, kuncinya adalah scriptSig dan kuncinya adalah scriptPubKey.

Jika UTXO ada di dompet Anda, mereka mungkin memiliki ketentuan yang menyatakan hanya orang yang dapat membuktikan kepemilikan kunci publik ini yang dapat membuka kunci dana ini. Untuk membukanya, Anda menyediakan scriptSig yang menyertakan tanda tangan digital, menggunakan kunci pribadi yang dipetakan ke kunci publik yang ditentukan dalam scriptPubKey. Ini semua akan segera menjadi jelas.


Memahami tumpukan Bitcoin

Skrip adalah apa yang dikenal sebagai bahasa berbasis tumpukan. Artinya, ketika kita membaca serangkaian instruksi, kita menempatkannya dalam kolom vertikal. Daftar A, B, C, misalnya, akan menghasilkan tumpukan dengan A di bagian bawah, dan C di bagian atas. Ketika instruksi memberitahu kita untuk melakukan sesuatu, kita mengoperasikan satu atau lebih elemen yang dimulai dari bagian atas tumpukan.


Elements A, B, and C being added and “popped” from the stack.

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


Kita dapat membedakan antara data (seperti tanda tangan, hash, dan kunci publik) dan instruksi (atau opcode). Instruksi menghapus data dan melakukan sesuatu dengannya. Berikut ini contoh yang sangat sederhana tentang tampilan skrip:

<xyz> <md5 hasher> <d16fb36f0911f878998c136191af705e> <periksa apakah sama>

Yang berwarna merah, kami memiliki data, dan yang berwarna biru, kami memiliki opcode. Kita membaca dari kiri ke kanan, jadi pertama-tama kita masukkan string <xyz> ke dalam tumpukan. Selanjutnya adalah opcode hasher <md5>. Yang ini tidak ada di Bitcoin, tapi katakanlah ia menghapus elemen teratas tumpukan (<xyz>) dan melakukan hashing menggunakan algoritma MD5. Kemudian, hasilnya ditambahkan kembali ke tumpukan. Outputnya di sini adalah d16fb36f0911f878998c136191af705e.

Kebetulan sekali! Elemen berikutnya yang kita tambahkan adalah <d16fb36f0911f878998c136191af705e>, jadi sekarang tumpukan kita memiliki dua elemen yang identik. Terakhir, <check if equal> memunculkan dua elemen di atas dan memeriksa apakah keduanya sama. Jika ya, itu menambahkan <1> ke tumpukan. Jika tidak, ia menambahkan <0>.

Kita sudah sampai pada akhir daftar instruksi kita. Skrip kita bisa saja gagal dalam dua cara – jika elemen yang tersisa adalah nol, atau jika salah satu operator menyebabkannya gagal ketika beberapa kondisi tidak terpenuhi. Kami tidak memiliki operator seperti itu dalam contoh ini, dan kami mendapatkan elemen bukan nol (<1>), jadi skrip kami valid. Aturan ini juga berlaku untuk transaksi Bitcoin nyata.

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


Bayar ke Pubkey (P2PK)

Pay-to-Pubkey (P2PK) sangat mudah. Ini melibatkan penguncian dana ke kunci publik tertentu. Jika Anda ingin menerima dana dengan cara ini, Anda harus memberikan kunci publik Anda kepada pengirim, bukan alamat Bitcoin.

Transaksi pertama antara Satoshi Nakamoto dan Hal Finney pada tahun 2009 adalah transaksi P2PK. Struktur ini banyak digunakan pada masa-masa awal Bitcoin, namun saat ini, Pay-to-Pubkey-Hash (P2PKH) telah banyak menggantikannya.

Skrip penguncian transaksi P2PK mengikuti format <public key> OP_CHECKSIG. Cukup sederhana. Anda mungkin sudah menebak bahwa OP_CHECKSIG memeriksa tanda tangan terhadap kunci publik yang disediakan. Dengan demikian, scriptSig kita akan menjadi <signature> sederhana. Ingat, scriptSig adalah kunci gemboknya.


A signature gets added to the stack, followed by a public key. OP_CHECKSIG pops them both and verifies the signature against the public key. If they match, it adds a <1> to the stack. Otherwise, it adds a <0>


Tidak ada yang lebih sederhana dari ini. Tanda tangan akan ditambahkan ke tumpukan, diikuti dengan kunci publik. OP_CHECKSIG memunculkan keduanya dan memverifikasi tanda tangan terhadap kunci publik. Jika cocok, maka <1> akan ditambahkan ke tumpukan. Jika tidak, ia akan menambahkan <0>.

Karena alasan yang akan kami uraikan di bagian selanjutnya, P2PK sudah tidak digunakan lagi.


Bayar-ke-Pubkey-Hash (P2PKH)

Pay-to-Pubkey-Hash (P2PKH) kini menjadi jenis transaksi yang paling umum. Kecuali jika Anda berusaha keras untuk mengunduh perangkat lunak kuno, dompet Anda kemungkinan melakukan hal ini secara default.

ScriptPubKey di P2PKH adalah sebagai berikut:

OP_DUP OP_HASH160 <hash kunci publik> OP_EQUALVERIFY OP_CHECKSIG

Sebelum kami memperkenalkan scriptSig, mari kita uraikan apa yang akan dilakukan opcode baru:


OP_DUP

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


OP_HASH160

Ini memunculkan elemen pertama dan melakukan hash dua kali. Putaran pertama akan di-hash dengan algoritma SHA-256. Output SHA-256 kemudian di-hash dengan algoritma RIPEMD-160. Output yang dihasilkan ditambahkan kembali ke tumpukan.


OP_SAMAKANVERIFIKASI

OP_EQUALVERIFY menggabungkan dua operator lain – OP_EQUAL dan OP_VERIFY. OP_EQUAL memunculkan dua elemen dan memeriksa apakah keduanya identik. Jika ya, itu menambahkan 1 ke tumpukan. Jika tidak, ia menambahkan 0. OP_VERIFY memunculkan elemen teratas dan memeriksa apakah elemen tersebut Benar (yaitu, bukan nol). Jika tidak, transaksi gagal. Jika digabungkan, OP_EQUALVERIFY menyebabkan transaksi gagal jika dua elemen teratas tidak cocok.

Kali ini, scriptSig terlihat seperti ini:

<tanda tangan> <kunci publik>

Anda perlu memberikan tanda tangan dan kunci publik yang sesuai untuk membuka kunci keluaran P2PKH.


We’re just adding an extra step to check that the public key matches the hash in the script


Anda dapat melihat apa yang terjadi pada GIF di atas. Tidak jauh berbeda dengan script P2PK. Kami hanya menambahkan langkah ekstra untuk memeriksa apakah kunci publik cocok dengan hash dalam skrip.

Namun ada sesuatu yang perlu diperhatikan. Dalam skrip penguncian P2PKH, kunci publik tidak terlihat – kita hanya dapat melihat hashnya. Jika kita membuka penjelajah blockchain dan melihat keluaran P2PKH yang belum dibelanjakan, kita tidak dapat menentukan kunci publiknya. Itu baru terungkap ketika penerima memutuskan untuk mentransfer dana.

Ini memiliki beberapa manfaat. Yang pertama adalah hash kunci publik lebih mudah untuk disebarkan dibandingkan kunci publik penuh. Satoshi meluncurkannya pada tahun 2009 karena alasan ini. Hash kunci publik inilah yang kita kenal sebagai alamat Bitcoin saat ini.

Manfaat kedua adalah hash kunci publik dapat memberikan lapisan keamanan tambahan terhadap komputasi kuantum. Karena kunci publik kita tidak diketahui sampai kita membelanjakan dananya, semakin sulit bagi orang lain untuk menghitung kunci privatnya. Mereka harus membalikkan dua putaran hashing (RIPEMD-160 dan SHA-256) untuk mendapatkannya.


➠ Ingin memulai dengan mata uang kripto? Beli Bitcoin di Binance!


Bayar-ke-Script-Hash (P2SH)

Pay-to-Script-Hash (P2SH) adalah perkembangan yang sangat menarik untuk Bitcoin. Hal ini memungkinkan pengirim untuk mengunci dana ke hash skrip – mereka tidak perlu mengetahui apa yang sebenarnya dilakukan skrip tersebut. Ambil hash SHA-256 berikut:

e145fe9ed5c23aa71fdb443de00c7d9b4a69f8a27a2e4fbb1fe1d0dbfb6583f1

Anda tidak perlu mengetahui masukan hash untuk mengunci dana ke dalamnya. Namun, pembelanja perlu menyediakan skrip yang digunakan untuk melakukan hash dan harus memenuhi ketentuan skrip tersebut.

Hash di atas dibuat dari skrip berikut:

<kalikan dengan 2> <4> <periksa apakah sama>

Jika Anda ingin membelanjakan koin yang terkait dengan scriptPubKey tersebut, Anda tidak hanya memberikan perintah tersebut. Anda juga memerlukan scriptSig yang membuat skrip yang telah selesai bernilai True. Dalam contoh ini, itu adalah elemen yang Anda <kalikan dengan 2> untuk memberikan hasil <4>. Tentu saja, itu berarti scriptSig kita hanya <2>.

Dalam kehidupan nyata, scriptPubKey untuk keluaran P2SH adalah:

OP_HASH160 <redeemScript hash> OP_EQUAL

Tidak ada operator baru di sini. Namun, kami memiliki <redeemScript hash> sebagai elemen baru. Seperti namanya, ini adalah hash dari skrip yang perlu kita sediakan untuk menebus dana (disebut redemptionScript). ScriptSignya akan berubah tergantung pada apa yang ada di dalam redemptionScript. Namun secara umum, Anda akan menemukan bahwa itu adalah kombinasi tanda tangan dan kunci publik yang terlampir, diikuti oleh skrip penukaran (wajib):

<tanda tangan> <kunci publik> <redeemScript>

Evaluasi kami sedikit berbeda dari eksekusi tumpukan yang kami lihat sejauh ini. Itu terjadi dalam dua bagian. Yang pertama cukup memeriksa apakah Anda telah memberikan hash yang benar.


We’ve reached the end of this mini-program, and the top element is non-zero. That means it’s valid


Anda akan melihat bahwa kami tidak melakukan apa pun dengan elemen sebelum kode penukaran. Mereka tidak digunakan saat ini. Kita telah mencapai akhir dari program mini ini, dan elemen teratasnya bukan nol. Artinya itu valid.

Tapi kita belum selesai. Node jaringan mengenali struktur ini sebagai P2SH, sehingga mereka sebenarnya memiliki elemen scriptSig yang menunggu di tumpukan lain. Disitulah tanda tangan dan kunci publik akan digunakan.

Sejauh ini, kami memperlakukan redemptionScript sebagai sebuah elemen. Tapi sekarang, itu akan diartikan sebagai instruksi, bisa apa saja. Mari kita ambil contoh skrip penguncian P2PKH, yang mana kita harus menyediakan <signature> dan <public key> yang cocok dengan <public key hash> di dalam <redeemScript>.


Once your redeemScript has been expanded, you can see that we have a situation that looks exactly like a regular P2PKH transaction.


Setelah RedeemScript Anda diperluas, Anda dapat melihat bahwa kami menghadapi situasi yang persis seperti transaksi P2PKH biasa. Dari sana, Anda tinggal menjalankannya seperti biasa.

Kami telah mendemonstrasikan apa yang disebut skrip P2SH (P2PKH) di sini, namun kemungkinan besar Anda tidak akan menemukannya di alam liar. Tidak ada yang dapat menghentikan Anda untuk membuatnya, namun hal ini tidak memberi Anda manfaat tambahan dan pada akhirnya menghabiskan lebih banyak ruang dalam satu blok (dan, oleh karena itu, memerlukan biaya lebih banyak).

P2SH umumnya berguna untuk hal-hal seperti transaksi multisignature atau yang kompatibel dengan SegWit. Transaksi multisig bisa berukuran sangat besar karena mungkin memerlukan banyak kunci. Sebelum penerapan Pay-to-Script-Hash, pengirim harus mencantumkan semua kemungkinan kunci publik dalam skrip pengunciannya.

Namun dengan P2SH, tidak menjadi masalah betapa rumitnya kondisi pembelanjaan. Hash redemptionScript selalu berukuran tetap. Oleh karena itu, biaya dibebankan kepada pengguna yang ingin membuka kunci skrip penguncian.

Kompatibilitas SegWit adalah kasus lain di mana P2SH berguna (kita akan membahas detail perbedaan struktur transaksi di bagian selanjutnya). SegWit adalah soft fork yang menghasilkan perubahan format blok/transaksi. Karena ini merupakan peningkatan opt-in, tidak semua perangkat lunak dompet mengenali perubahan tersebut. Tidak masalah jika klien membungkus hash skrip SegWit di P2SH. Seperti halnya semua transaksi jenis ini, mereka tidak perlu mengetahui apa yang akan menjadi unlocking RedeScript.


Transaksi SegWit (P2WPKH dan P2WSH)

Untuk pengenalan SegWit yang lebih komprehensif, lihat Panduan Pemula untuk Segregated Witness.

Untuk memahami format transaksi di SegWit, Anda hanya perlu mengetahui bahwa kami tidak lagi hanya memiliki scriptSig dan scriptPubKey. Sekarang, kami juga memiliki bidang baru yang disebut saksi. Data yang biasa kita simpan di scriptSig dipindahkan ke saksi, sehingga scriptSig kosong.

Jika Anda menemukan alamat yang diawali dengan 'bc1', itulah yang kami sebut sebagai alamat asli SegWit (bukan hanya kompatibel dengan SegWit, yang diawali dengan angka 3 karena merupakan alamat P2SH).


Bayar-untuk-Saksi-Pubkey-Hash (P2WPKH)

Bayar-untuk-Saksi-Pubkey-Hash (P2WPKH) adalah versi SegWit dari P2PKH. Saksi kami terlihat seperti ini:

<tanda tangan> <kunci publik>

Anda akan melihat bahwa ini sama dengan scriptSig dari P2PKH. Di sini, scriptSig kosong. Sedangkan scriptPubKeynya seperti berikut:

<OP_0> <hash kunci publik>

Kelihatannya agak aneh, bukan? Di manakah opcode yang memungkinkan kita membandingkan tanda tangan, kunci publik, dan hashnya?

Kami tidak menampilkan operator tambahan di sini, karena node yang menerima transaksi mengetahui apa yang harus dilakukan berdasarkan panjang <public key hash>. Mereka akan menghitung panjangnya dan memahami bahwa transaksi tersebut harus dijalankan dengan cara yang sama seperti transaksi P2PKH kuno.

Node yang tidak diupgrade tidak tahu bagaimana menafsirkan transaksi dengan cara seperti itu, tapi itu tidak masalah. Berdasarkan aturan lama, tidak ada saksi, jadi mereka membaca scriptSig kosong dan beberapa data. Mereka mengevaluasinya dan menandainya sebagai valid – sejauh yang mereka ketahui, siapa pun dapat membelanjakan hasilnya. Inilah sebabnya mengapa SegWit dianggap sebagai soft fork yang kompatibel ke belakang.


Hash Naskah Bayar-untuk-Saksi (P2WSH)

Hash Naskah Bayar-untuk-Saksi (P2WSH) adalah P2SH baru. Jika Anda sudah sampai sejauh ini, Anda mungkin bisa mengetahui tampilannya, tapi kami akan tetap membahasnya. Saksi kita adalah apa yang biasa kita masukkan ke dalam scriptSig. Dalam P2WSH yang membungkus transaksi P2PKH, misalnya, tampilannya mungkin seperti ini:

<tanda tangan 1> <kunci publik>

Inilah skripPubKey kami:

<OP_0> <skrip hash>

Aturan yang sama juga berlaku. Node SegWit membaca panjang hash skrip dan menentukan bahwa itu adalah keluaran P2WSH, yang dievaluasi serupa dengan P2SH. Sementara itu, node lama hanya melihatnya sebagai output yang dapat dibelanjakan oleh siapa saja.


Dalam artikel ini, kita telah mempelajari sedikit tentang dasar-dasar Bitcoin. Mari kita rangkum dengan cepat:


Jenis skrip

Keterangan

Bayar ke Pubkey (P2PK)

Mengunci dana ke kunci publik tertentu

Bayar-ke-Pubkey-Hash (P2PKH)

Mengunci dana ke hash kunci publik tertentu (yaitu alamat)

Bayar-ke-Script-Hash (P2SH)

Mengunci dana ke hash skrip yang dapat diberikan oleh penerima

Bayar-untuk-Saksi-Pubkey-Hash (P2WPKH)

P2PK versi SegWit

Hash Naskah Bayar-untuk-Saksi (P2WSH)

P2SH versi SegWit


Setelah Anda menggali lebih dalam tentang Bitcoin, Anda mulai memahami mengapa Bitcoin memiliki begitu banyak potensi. Transaksi dapat terdiri dari banyak komponen berbeda. Dengan memanipulasi elemen dasar ini, pengguna memiliki fleksibilitas yang besar dalam menetapkan kondisi tentang bagaimana dan kapan dana dapat dibelanjakan.


➠ Ada pertanyaan tentang Skrip? Kunjungi Ask Academy!