Sözlük / Geliştirici başvuru kaynağı
Opcode
Diğer adları: Veri iten opcode, Veri itmeyen opcode.
- Opcode nedir?
- Opcode, Bitcoin Script'in tek bir baytıdır ve doğrulama yapan bir düğüme sırada ne yapacağını, yani veriyi yığına mı iteceğini yoksa yığında zaten bulunan veri üzerinde tek bir işlem mi gerçekleştireceğini söyler.
Bitcoin Script'in sabit bir sözlüğü vardır: 256 olası bayt değeri, bunlar da literal veri iten opcode'lar ile zaten itilmiş veri üzerinde işlem yapan opcode'lar arasında dağılır. Eski bir script en fazla 201 işlem yapan opcode çalıştırabilir ve 10.000 baytı aşamaz. Bitcoin satın alan biri için bu küçük sözlük, bir cüzdanın ücreti yayınlamadan önce bildirebilmesinin ve Bitcoin'in kontrolden çıkan sözleşme hatalarına yüzey sunmamasının nedenidir.
Nasıl çalışır
Doğrulama yapan bir düğüm bir script'i bayt bayt okur ve her baytı sabit bir tabloda arar. 0x01 ile 0x4b arasındaki değerler talimat değildir: her biri, sonraki N baytın literal veri olduğunu ve yığına ait olduğunu söyler; bu yüzden 33 baytlık sıkıştırılmış bir genel anahtar bir script'te 0x21 ve ardından anahtarın kendisi olarak görünür. Üç itme kodu daha, OP_PUSHDATA1, OP_PUSHDATA2 ve OP_PUSHDATA4, daha uzun öğeleri kapsar; 0x51 ile 0x60 arasındaki değerler ise yeter sayılarında görülen 1 ile 16 arasındaki küçük tam sayıları iter.
0x60'ın üzerindeki her şey veri taşımak yerine iş yapar ve Bitcoin'in saydığı bunlardır. Taproot öncesi bir script en fazla 201 tane içerebilir, 520 bayttan büyük hiçbir yığın öğesi tutamaz, yığınlarında 1.000 öğeden fazlasını tutamaz ve toplamda 10.000 baytı aşamaz. Dört rakamın hepsi Bitcoin Core içindeki script.h dosyasından çıkar ve dördü de bir düğüm işletmecisinin gevşetebileceği tercihler değil, uzlaşma kurallarıdır.
On beş opcode tabloda listelenir ama ölüdür. OP_CAT, OP_MUL, OP_LSHIFT ve on iki tanesi daha, bir çökme hatasının ardından 2010 yılında kapatıldı ve bunlardan birini yalnızca içeren bir script, hiç çalışmayan bir dal içinde olsa bile başarısız olur. Hiçbiri bir daha etkinleştirilmedi. Bu tek karar, Bitcoin'in script yapısının “programlanabilir” sözcüğünün insanlarda uyandırdığı beklentiden daha dar olmasının en büyük nedenidir.
Tapscript, Taproot harcamalarının muhasebesini yeniden yazdı. Kasım 2021'de 709.632 bloğundan itibaren yürürlükte olan BIP-342, hem 201 talimatlık üst sınırı hem de 10.000 baytlık boyut sınırını kaldırdı ve yerine bir imza bütçesi koydu: işlem, script'in kontrol ettiği her imza için 50 ağırlık birimi taşımalıdır. Ayrıca tanımsız bayt değerlerinden oluşan bir bloğu OP_SUCCESS kodlarına dönüştürdü, böylece bunlardan birini içeren bir script hiç çalıştırılmadan geçerli olur. Bu, gelecekteki yükseltmeler için bilerek bırakılmış alandır.
Bitcoin satın alırken bu neden önemli
Opcode'lar para çekme işleminizin nelere mal olacağını belirler. Eski bir çıktı, 25 bayt içinde 20 baytlık bir hash çevresinde dört çalışan talimat yazar; yerel SegWit karşılığı bir sürüm baytı ve bir itmedir, 22 bayt; bir Taproot çıktısı ise 34 bayttır. SegWit kilidi açan tarafı ağırlığın dörtte biri karşılığında witness'a taşıdığı için, bir bech32 çıktısını harcamak aynı ödemenin eski sürümü için yaklaşık 148 bayta karşı yaklaşık 68 sanal bayt tutar. Para çekme sırasında, borsa sunduğu her yerde bech32 veya bech32m seçmek, bu sözlükteki en ucuz kararlara yakındır.
Opcode'lar ayrıca imzalama cihazınızın gerçekte neyi işleyebileceğini belirler. Yalnızca standart tek anahtarlı şablonları tanıyan bir donanım cüzdanı, zaman kilitli bir kasayı veya alışılmadık bir politikayı birlikte imzalayamaz; bu yüzden miras planlaması veya çoklu imza planlarınızın herhangi bir yerinde varsa, cihazı satın almadan önce, bitcoinler cihaza yerleştirildikten sonra değil, incelemelerde script desteğini kontrol edin.
Bu darlık bir eksiklik değil, bir güvenlik özelliğidir. Döngü yok, başka bir işlemi okumanın yolu yok ve harcamalar arasında kalıcı bir durum yok; dolayısıyla programlanabilir zincirlerden milyarlarca dolarlık kayba yol açan arıza biçiminin, yani bir sözleşmenin yazarının hiç düşünmediği girdilerle doğru davranmasının, oluşabileceği bir yer yoktur. Bitcoin kayıpları borsalardan, oltalamadan (phishing) ve kaybolan yedeklerden gelir, script motorunun yanlış ateşlemesinden değil.
Uygulamalı örnek: OP_NOP2'nin artık bir iş yapmaya başladığı gün
OP_NOP2, 0xb1 baytıydı ve hiçbir şey yapmıyordu; tabloda sonraki kullanım için bırakılmış numaralandırılmış on no-op'tan biriydi. BIP-65 ona bir iş verdi: işlemin locktime değerinin geçtiğini doğrulamak ve geçmediyse script'i başarısız kılmak. Zorunluluk 2015 yılının 14 Aralık günü 388.381 bloğunda başladı ve opcode o günden beri OP_CHECKLOCKTIMEVERIFY olarak anılıyor.
İşin püf noktası, eski yazılımın hâlâ hiçbir şey yapmayan bir bayt görmesiydi, bu yüzden yeni işlemleri yine geçerli sayıyordu. Zaman kilidini yalnızca yükseltilmiş düğümler uyguladı. Bir yumuşak çatalı yumuşak yapan bu asimetridir ve aynı yolla OP_NOP3, Temmuz 2016'da 419.328 bloğunda OP_CHECKSEQUENCEVERIFY oldu. Sekiz ayrılmış no-op yuvası kaldı; bu, Taproot öncesi kurallar altında Bitcoin'in kalan yükseltme alanının çoğu ve tasarım dikkatinin bu kadarının Tapscript'in oluşturduğu OP_SUCCESS değerlerine kaymasının büyük bir nedenidir.
Opcode vs Bitcoin Script
Bitcoin Script dildir ve bir opcode onun sözlüğündeki tek bir sözcüktür. Bu ayrım, Bitcoin'in ne yapabildiği veya yapamadığına dair iddiaları okurken önemlidir, çünkü son on yılın neredeyse tüm ciddi önerileri, etrafındaki dili değiştirmek değil, yeni tek bir opcode tanımlamak önerisiydi. OP_CHECKTEMPLATEVERIFY, OP_CAT ve OP_CHECKSIGADD'in her biri tek bir işi olan tek bir bayttır ve covenant'lar veya kasalar hakkındaki kamuya açık tartışmalar, belirli bir baytın bir şey ifade etmesine izin verilip verilmemesi tartışmalarıdır. Yeni bir opcode geldiğinde yığın, sınırlar ve döngülerin yokluğu tam olarak olduğu gibi kalır.