Sözlük / Geliştirici başvuru kaynağı
Bitcoin Script
Diğer adları: Script.
- Bitcoin Script nedir?
- Bitcoin Script, her Bitcoin çıktısının taşıdığı ve o bitcoinlerin yeniden harcanabilmesi için birinin yerine getirmesi gereken koşulları belirleyen küçük, yığın tabanlı dildir.
Bitcoinler kişilere gönderilmez. Kısa bir programın arkasına kilitlenirler ve harcamak, programın yığının tepesinde doğru bir değerle bitmesini sağlayan veriyi sunmak anlamına gelir. Dilin döngüsü ve özyinelemesi yoktur ve eski bir script 10.000 bayt ile 201 işlemde durur, böylece doğrulayıcı işin her zaman sona ereceğini bilir. Bitcoin'in hiçbir zaman kontrolden çıkmış bir sözleşmesi olmamasının nedeni budur.
Nasıl çalışır
Bitcoin Script, soldan sağa okuyan ve başka hiçbir şey yapmayan bir yığın makinesidir.
Veri itmeleri bir yığına gider; işlemler argümanlarını yığından çıkarır ve sonuçları geri iter. Değişken yoktur, geriye sıçrama yoktur ve doğrulanan işlemin dışından hiçbir şey okumanın yolu yoktur. Bir script, yürütme hatasız tamamlandığında ve tepede doğru bir değer bıraktığında başarılı olur.
Harcama anında iki parça bir araya gelir. Harcanan çıktı, pubkey script adı verilen kilidi taşır. Onu harcayan girdi, eski çıktılarda signature script, segwit çıktılarda ise witness adı verilen kanıtı taşır. Yığın ikisi arasında taşınarak sırayla çalışırlar ve asla tek bir programa birleştirilmezler; bu ayrım, kilitleyen tarafa işlem kodu enjekte edebilen bir harcayanın koşulları yeniden yazabileceği anlaşılınca erken dönemde getirilmiştir.
Bitcoin tarihinin en yaygın scripti baştan sona okumaya değer. Bir pay-to-public-key-hash çıktısı OP_DUP, OP_HASH160, 20 baytlık bir hash, OP_EQUALVERIFY ve OP_CHECKSIG içerir. Harcayan bir imza ve bir genel anahtar sunar. Yürütme ikisini de yığına iter, genel anahtarı çoğaltır, kopyayı 20 bayta indirerek hashler, beklenen hash'i iter, ikisini karşılaştırır ve farklıysa iptal eder, ardından imzayı işlemin kendisinin bir serileştirmesine karşı kontrol eder. Altı adım ve eski bir adresin tüm güvenliği bunlara dayanır.
Sınırlar kasıtlı ve kesindir. Eski bir script veya P2SH scripti 10.000 baytı veya 201 itme dışı işlemi aşamaz. Yığındaki tek bir öğe 520 baytı aşamaz. Yığın 1.000 öğeden fazlasını tutamaz. Bir OP_CHECKMULTISIG 20'den fazla genel anahtar adlandıramaz. Her sınır, kim ne yazarsa yazsın bir bloğu doğrulama maliyetinin sınırlı kalması için vardır.
Dil iki kez büyümüştür, bunu ayrılmış işlevsiz kodlara gerçek anlam vererek yapmıştır. BIP65, Aralık 2015'te OP_CHECKLOCKTIMEVERIFY işlemini tanımladı ve bir çıktının belirtilen bir zamandan veya yükseklikten önce hareket etmeyi reddetmesini sağladı. BIP112 aynısını OP_CHECKSEQUENCEVERIFY için yaptı; bu işlem Temmuz 2016'da 419.328 numaralı bloktan itibaren etkindir ve çıktının onaylandığı andan ölçülen göreli zaman kilitleri ekler. Lightning kanalları, son tarihli emanet (escrow) ve zaman kilitli miras düzenlerinin var olabilmesinin nedeni bu iki işlem kodudur.
Bitcoin satın alırken bu neden önemli
Para çektiğiniz adres bir script türüdür ve bu seçim bir sonraki ücretinizde görünür.
Eski bir pay-to-public-key-hash girdisini harcamak yaklaşık 148 sanal bayt tutar. Yerel bir segwit girdisini harcamak yaklaşık 68 tutar, çünkü BIP141 ile getirilen witness indirimi witness verisini dörtte bir oranında ücretlendirir ve taproot anahtar yolu harcaması daha da küçüktür. 20 sat/vB ücret oranında bu fark, küçük bir para çekmenin maliyetinin çoğunu oluşturur ve bitcoinlerinizi her taşıdığınızda tekrarlanır. Bir borsa para çektiğiniz adres biçimini seçmenize izin verdiğinde, modern olanı seçmek kalıcı bir indirimdir.
Script aynı zamanda bir multisig kasasının gerçekte ne olduğudur. 3'te 2'lik bir düzenleme, üç genel anahtar adlandıran ve iki imza talep eden bir scripttir; belirli bir cihazın bunu dürüstçe gösterip imzalayıp imzalayamayacağı, donanım cüzdanı incelememizin doğrudan ele aldığı bir sorudur. Aynısı zaman kilidine dayanan her miras planı için de geçerlidir: bitcoinler ancak biri hâlâ scripte sahipse kurtarılabilir, bu yüzden onu yeniden oluşturmanın düz metin tarifi olan çıktı tanımlayıcıları, kurtarma ifadesinin yanında yedeğinizde yer almalıdır.
Bir pratik uyarı. Bir platform yapıştırdığınız adrese göndermeyi reddettiğinde, nedeni neredeyse her zaman para çekme kodunun o script türünü kuramamasıdır, adresinizin yanlış olması değil. Önem verdiğiniz bir bakiyeyi taşımadan önce tanımadığınız her adres biçimini küçük bir tutarla test edin.
184 milyar Bitcoin hatası ve Satoshi'nin kapattığı işlem kodları
15 Ağustos 2010 tarihinde 74.638 numaralı blok, her biri yaklaşık 92,2 milyar olan iki çıktıya bölünmüş 184.467.440.737,09551616 Bitcoin oluşturan bir işlem taşıyordu.
Bir işlemin çıktılarının girdilerini aşmadığı kontrolü sabit genişlikli işaretli aritmetik kullanıyordu ve bu aritmetiği taşıracak kadar büyük çıktılar negatif bir sayıya toplanıyordu, bu yüzden test geçiyordu. Yaklaşık beş saat içinde yamalı bir istemci ortaya çıktı ve dürüst zincir 74.691 yüksekliğinde kötü olanı geçti. O bitcoinler herkesin kullandığı zincirde hiç var olmadı.
Bu olay, metin ve aritmetik işlemlerindeki ilgili bir hata ailesiyle birlikte, on beş işlem kodunun kalıcı olarak devre dışı bırakılmasının nedenidir: OP_CAT, OP_SUBSTR, OP_LEFT, OP_RIGHT, OP_INVERT, OP_AND, OP_OR, OP_XOR, OP_2MUL, OP_2DIV, OP_MUL, OP_DIV, OP_MOD, OP_LSHIFT ve OP_RSHIFT. Scripti bunlardan yalnızca birini içeren bir işlem, çalıştırılsın ya da çalıştırılmasın geçersizdir. Devre dışı bırakma, zaman baskısı altında uygulanmış kaba bir araçtı ve bunun bir kısmını geri almak sürmekte olan bir çalışmadır: BIP347, OP_CAT işleminin tapscript içinde geri getirilmesini önerir; yeni sınırlar orada onu kötüye kullanmayı çok daha zorlaştırır.
Bitcoin Script vs tapscript
Tapscript, kuralları yeniden çizilmiş Bitcoin Script'tir ve yalnızca bir taproot script yolu harcamasının içinde geçerlidir. BIP342 hem 10.000 baytlık script boyutu sınırını hem de 201 işlem sınırını kaldırdı, OP_CHECKMULTISIG ve OP_CHECKMULTISIGVERIFY işlemlerini devre dışı bıraktı ve çok imzalı politikaların toplu doğrulanabilmesi için yerlerine OP_CHECKSIGADD ekledi. İmza kontrolleri sayılmak yerine ölçülür: her girdi 50 artı witness'ının serileştirilmiş boyutu kadar bir bütçe alır ve yürütülen her imza kontrolü bunun 50'sini harcar. Aynı yığın makinesi, farklı muhasebe.
Bitcoin Script vs bir pubkey script
Bitcoin Script dildir; bir pubkey script onunla yazılmış tek bir programdır. Bir çıktı, kilit olan bir pubkey script içerir. Onu harcayan girdi, anahtar olan bir signature script veya bir witness içerir. İkisi de Bitcoin Script'tir ve ham bir işlemi okurken en yaygın karışıklık kaynağı, ikisinden birine yalnızca "script" denmesidir, çünkü iki yarı ayrı ayrı değerlendirilir ve bitcoinler alındığında yalnızca biri taahhüt edilmişti.