Sözlük / Protokol ve güncellemeler
OP_CHECKSIGADD
- OP_CHECKSIGADD nedir?
- OP_CHECKSIGADD, tapscript içinde imzaları her seferinde bir anahtar için sayar ve eski multisig opcode'unun yerine hem toplu doğrulamanın hem de gelecekteki anahtar türlerinin işleyebileceği bir kontrol koyar.
Tanımlandığı belge: BIP-342.
Opcode üç yığın öğesi alır: bir imza, birikimli bir sayı ve bir genel anahtar; sayıyı ya olduğu gibi ya da bir artırarak geri iter. BIP-342 ona 186 numaralı opcode'u atadı ve aynı hamlede OP_CHECKMULTISIG'i devre dışı bıraktı; bu yüzden her Taproot betiği multisig'i bu şekilde yazılır. Pratik kazanç, bir eşik politikasının artık 20 anahtarda durmamasıdır.
Nasıl çalışır
Tapscript'te bir eşik, aralarında taşınan bir sayımla art arda gelen imza kontrollerinden ve sonunda bir karşılaştırmadan oluşur.
Açıkça yazıldığında üçte iki şöyle okunur: birinci genel anahtarı itin, OP_CHECKSIG, ikinciyi itin, OP_CHECKSIGADD, üçüncüyü itin, OP_CHECKSIGADD, 2 itin, OP_NUMEQUAL. Yürütme soldan sağa ilerler. OP_CHECKSIG yığın üzerinde 1 ya da 0 bırakır ve her OP_CHECKSIGADD bir genel anahtarı, o birikimli toplamı ve bu anahtar için sunulan imzayı yığından çıkarır; imza doğrulandıysa toplamı 1 ekleyerek geri iter. Son karşılaştırma, yeterli sayıda imzanın doğrulanıp doğrulanmadığına karar verir.
Katılmayan bir imzalayan, imza yerine boş bir bayt dizisi verir. Opcode bunu görür, o yuvayı imzasız sayar ve sayımı değiştirmeden geri döndürür; bunun tanıkta maliyeti tek bayttır. Mekanizmanın tamamı budur ve OP_CHECKMULTISIG'in özgün uygulamadaki bir birim kayması (off-by-one) hatası yüzünden gerektirdiği sahte yığın öğesini ortadan kaldırır.
Bir anahtarın bir imzaya karşı kontrol edilmesinden iki sonuç doğar. Doğrulama toplu hale gelir: bir düğüm, aday anahtarları sırayla denemek yerine bloktaki her Schnorr imzasını tek bir toplu kontrole koyabilir; Taproot'un doğrulama hızlanmasının büyük bir kısmı budur. Anahtar sayısı da opcode'a yazılmış sabit bir üst sınırla değil, kontrol edilen her imza için 50 ağırlık birimi harcayan tapscript doğrulama bütçesiyle sınırlıdır.
Nerede görülür
OP_CHECKSIGADD, birden fazla imzalayan gerektiren her Taproot betiğinde görülür; cüzdan yazılımlarında bu genellikle ham betik değil bir tanımlayıcı anlamına gelir.
Bitcoin Core bunu bir tr() tanımlayıcısı içindeki multi_a ve sortedmulti_a parçaları olarak sunar; böylece üç anahtarlı bir yeter sayı tr(internalkey,multi_a(2,KEY1,KEY2,KEY3)) biçiminde yazılır ve opcode zincirini yazılım sizin için üretir. Miniscript de aynı şekilde ele alır ve Taproot politikalarını destekleyen donanım cihazları, düzeni önceden bilmeye gerek duymadan bu betikleri imzalar.
Tasarım ayrıca bir yeter sayının nasıl şekillendirilebileceğini değiştirir. Üç anahtarın hepsini tutan tek bir yaprak yerine bir taptree, olası her ikili için birer tane olmak üzere üç ayrı iki anahtarlı yaprak tutabilir ve bir harcama yalnızca gerçekten imzalayan ikiliyi açığa çıkarır. Bu, betik yaprakları açısından daha pahalıdır ve tanıkta bir genel anahtar tasarrufu sağlar; her harcamada tam anahtar kümesini yayımlamaya kıyasla gerçek bir gizlilik iyileştirmesidir.
OP_CHECKSIGADD vs OP_CHECKMULTISIG
OP_CHECKSIGADD ve OP_CHECKMULTISIG ikisi de bir anahtar kümesine karşı imzaları sayar ve yalnızca biri bir Taproot yaprağında çalışır. OP_CHECKMULTISIG eski (legacy) ve SegWit sürüm 0 betiklerde tamamen geçerli kalır; yani yıllardır kullanılan bc1q multisig etkilenmez ve geçiş gerektirmez.
Tapscript içinde OP_CHECKMULTISIG ve OP_CHECKMULTISIGVERIFY tamamen devre dışıdır. Nerede çalıştıklarının ötesinde üç fark önemlidir: eski opcode bir betiği 20 genel anahtarla sınırlar, yenide böyle bir sayı yoktur; eskisi yığın üzerinde ek bir sahte öğe gerektirir ve BIP-147 bunun daha sonra bir konsensüs kuralı olarak boş olmasını zorunlu kılmıştır; eskisi toplu doğrulanamaz çünkü bir doğrulayıcı her imzanın hangi anahtara ait olduğunu önceden bilemez.