Blockchain/Tahap IV · Kedalaman protokol/4.1 Script/Pelajaran 1
Skrip: bahasa tindanan
Tindanan yang memastikan pelaksanaan kekal terhad dan opcode yang dinyahaktifkan oleh Satoshi
BahanSehelai kertas dan penAkses kepada peneroka blok BitcoinHalaman ‘Script’ daripada Bitcoin Wiki
Ingin tahu
- Mengapa bahasa yang tiada gelung dapat melindungi setiap nod daripada pengiraan tak terhingga?
- Apakah pepijat khusus pada tahun 2010 yang membolehkan sesiapa sahaja membelanjakan syiling orang lain sebelum ia dibaiki?
- Bagaimanakah sesuatu output boleh ditandakan sebagai terbukti tidak boleh dibelanjakan sambil masih membawa data?
Teroka
- Bitcoin Script ialah bahasa kecil berasaskan tindanan dalam gaya Forth. Ia tidak mempunyai gelung dan rekursi, menjadikannya sengaja tidak lengkap Turing (Turing-complete). Reka bentuk ini memastikan kos pelaksanaan setiap skrip adalah terhad dan boleh diramalkan. Tiada skrip yang boleh berjalan tanpa henti atau menggunakan sumber tanpa had, sekali gus melindungi rangkaian daripada serangan penafian perkhidmatan (denial-of-service) yang sememangnya wujud dalam kod serba guna. Kesederhanaannya membolehkan mana-mana nod mengesahkan transaksi secara deterministik tanpa risiko kehabisan sumber.
- Setiap output membawa skrip penguncian (scriptPubKey) yang menentukan syarat perbelanjaan. Pihak yang membelanjakan menyediakan data pembuka kunci melalui scriptSig atau, sejak SegWit, data witness. Pelaksanaan menolak data ke atas tindanan dan menggunakan opcode dari kiri ke kanan. Perbelanjaan itu sah jika pelaksanaan selesai tanpa ralat dan meninggalkan nilai true di bahagian atas tindanan. Hasil binari ini melindungi bitcoin tanpa pernah mendedahkan kunci persendirian, dengan bergantung pada pengesahan kriptografi dan bukannya semakan identiti.
- Pada tahun 2010, Satoshi Nakamoto menyahaktifkan beberapa opcode, termasuk OP_CAT dan OP_MUL, sebagai langkah berjaga-jaga selepas pepijat ditemui; salah satunya (dalam OP_LSHIFT) boleh menyebabkan nod ranap. Kelemahan yang lebih serius terletak pada cara scriptSig dan scriptPubKey digabungkan dan dijalankan sebagai satu skrip: scriptSig yang berakhir dengan OP_RETURN boleh menamatkan pelaksanaan dengan nilai 'true' sebelum skrip penguncian sempat dijalankan, membolehkan sesiapa sahaja membelanjakan syiling sesiapa pun. Pembetulan pertama menjadikan OP_RETURN terus gagal; keluaran perisian yang kemudian pergi lebih jauh dan menjalankan scriptSig dan scriptPubKey sebagai skrip yang berasingan. Perubahan ini memperkukuh model keselamatan dan menghapuskan operasi berbahaya yang boleh dieksploitasi atau menyebabkan tingkah laku yang tidak dapat diramalkan.
- OP_RETURN menandakan sesuatu output sebagai terbukti tidak boleh dibelanjakan. Ia digunakan untuk menyisipkan sejumlah kecil data on-chain tanpa mewujudkan laluan perbelanjaan yang sah. Oleh sebab tiada tandatangan yang dapat memenuhi OP_RETURN, syiling tersebut terkunci selama-lamanya, tetapi data yang berkaitan kekal sebagai sebahagian daripada sejarah blockchain. Oleh sebab output sedemikian tidak boleh dibelanjakan sama sekali, nod mengecualikannya daripada set syiling yang boleh dibelanjakan.
- Untuk memahami mekanismenya, laksanakan '2 3 OP_ADD 5 OP_EQUAL' langkah demi langkah di atas kertas. Mulakan dengan tindanan kosong. Tolak 2, kemudian tolak 3. Gunakan OP_ADD untuk mengeluarkan kedua-duanya dan menolak hasil tambahnya (5). Tolak 5 sekali lagi. Gunakan OP_EQUAL untuk membandingkan dua item teratas; oleh sebab kedua-duanya sama, ia menolak nilai true (1). Tindanan berakhir dengan satu nilai true, yang memenuhi syarat kesahan. Aritmetik mudah ini menunjukkan bagaimana opcode memanipulasi tindanan untuk menilai syarat.
- Buka peneroka blok dan cari mana-mana transaksi standard. Kenal pasti scriptPubKey dalam bahagian output, yang bermula dengan OP_DUP bagi output P2PKH legacy, OP_0 bagi native SegWit, atau OP_1 bagi Taproot. Kemudian buka transaksi yang membelanjakan output sedemikian dan cari tandatangan serta kunci yang memenuhinya, sama ada dalam scriptSig bagi output legacy atau dalam witness bagi SegWit dan Taproot, sehingga meninggalkan nilai true pada tindanan pelaksanaan bagi semua nod yang mengesahkan.
Fakta utama
- Bitcoin Script bukan Turing-complete; ia tidak mempunyai gelung atau rekursi.
- Pada tahun 2010, Satoshi menyahaktifkan OP_CAT, OP_MUL dan opcode lain sebagai langkah berjaga-jaga selepas pepijat ditemui.
- Sejak tahun 2010, scriptSig dan scriptPubKey dilaksanakan secara berasingan dan bukannya digabungkan.
- OP_RETURN menandakan sesuatu output sebagai terbukti tidak boleh dibelanjakan bagi tujuan penyisipan data.
- Perbelanjaan yang sah meninggalkan nilai true di bahagian atas tindanan pelaksanaan.
- Kos setiap skrip adalah terhad disebabkan oleh ketiadaan pengiraan sewenang-wenangnya.
Latihan sembilan, enam, tiga, satu
9KumpulSenaraikan 9 opcode daripada Bitcoin Script. Nyatakan yang mana telah dinyahaktifkan, yang mana mengubah tindanan secara langsung, dan yang mana melakukan semakan kriptografi.
6KelompokkanKumpulkan 9 item tersebut kepada 6 kategori mengikut fungsi: aritmetik, perbandingan, manipulasi tindanan, pengesahan kriptografi, penyisipan data, atau yang sudah tidak digunakan/dihapuskan.
3SaringKurangkan 6 kategori itu kepada 3 sebab Script sengaja dikekalkan terhad.
1KristalkanTulis 1 ayat tentang bagaimana pelaksanaan yang terhad melindungi rangkaian daripada skrip berniat jahat.
Semakan fakta
Tarikh, angka dan dakwaan telah disemak berbanding dengan sumber yang diterbitkan yang disenaraikan di bawah.