İçeriğe geçin
buybitcoinsmart

Sözlük / Geliştirici başvuru kaynağı

OP_EQUAL

OP_EQUAL nedir?
OP_EQUAL, yığının en üstündeki iki öğeyi bayt bayt karşılaştırır ve doğru ya da yanlış bir sonucu yığına iter; her pay-to-script-hash çıktısındaki son opcode budur.

0x87 baytı, Bitcoin'in gerçekten ihtiyaç duyduğu tek karşılaştırmayı yapar: bu iki veri bloğu birebir aynı mı? Karşılaştırma sayılar üzerinde değil ham baytlar üzerinde yapılır; dilin aritmetik eşitlik için ayrı bir opcode taşımasının nedeni budur. 3 ile başlayan bir adrese şimdiye kadar gönderdiğiniz her ödeme, betiğini bu tek komutla bitirir.

Nasıl çalışır

Yığından iki öğe çıkar, yerine bir öğe konur: eşleşirlerse tek bir 0x01 baytı, eşleşmezlerse boş bir öğe. Bitcoin boş bir öğeyi yanlış sayar, böylece sonucu izleyen her şey sınayabilir.

Bayt karşılaştırması kulağa geldiğinden daha katıdır. Bir kişinin aynı sayı diyeceği iki değer, farklı bayt dizileri olabilir ve bu opcode onları eşit olmayan sayar. Bu, gerçek işi için doğru davranıştır: herhangi bir farkın başarısız olması gereken hash ve öngörüntü karşılaştırmaları. Aritmetik sonuçların bunun yerine OP_NUMEQUAL ile karşılaştırılmasının nedeni de budur.

İlginç olan özellik, yapmadığı şeydir: bir sonuç üzerinde işlem yapmak yerine sonucu bırakır. Bir betik yalnızca en üstte kalan öğe doğru olduğunda başarıyla biter; bu yüzden bu opcode ile biten bir betik bir soru sorar ve sonucun yanıt olarak kalmasına izin verir. Bitcoin Core yazılımının cleanstack kuralı buna, geride başka hiçbir şeyin kalmaması gerektiğini ekler; bir betik hash harcamasında bu, tam olarak tek bir doğru değer ve başka hiçbir şey demektir.

Bu son ayrıntı göründüğünden daha önemlidir. Pay-to-script-hash, hashlenmiş betikler hakkında genel bir kural değildir; tek bir tam 23 baytlık desen hakkında bir kuraldır: bir hash opcode, 20 baytlık bir veri itme ve sonunda bu opcode. Aynı mantığı birleşik doğrulama biçimiyle yazarsanız özel işlem uygulanmaz, kullanım betiği hiçbir zaman çıkarılmaz veya yürütülmez ve çıktı, öngörüntüyü tahmin eden herkesin harcayabileceği sıradan bir hash bilmecesi gibi davranır.

Nerede görülür

3 ile başlayan bir adresteki her harcanmamış çıktı, bir blok gezgininde üç öğeden oluşan aynı dizilimi gösterir ve burada biter. Bir borsanın size gönderdiği her sarmalanmış SegWit çekimi de öyledir.

Hash kilitli sözleşmelerde de görülür. Lightning ödeme betikleri bir sırrı hashler ve sonucu sabit bir değerle karşılaştırır; bu sayede alıcı 32 baytlık bir öngörüntüyü açıkladığı anda ödeme birkaç atlama boyunca sonuçlanabilir. Zincirler arası atomik takaslar da aynı yapıyı kullanır.

OP_EQUAL vs OP_EQUALVERIFY

OP_EQUALVERIFY, sınaması içine gömülü OP_EQUAL'dır. 0x88 baytı aynı karşılaştırmayı yapar ve yanıt yanlışsa betiği hemen iptal eder; başarılı olduğunda yığın üzerinde hiçbir şey bırakmaz. İkisi arasında seçim, sırada ne olduğu sorusudur. Karşılaştırma betiğin son yanıtıysa, pay-to-script-hash'te olduğu gibi, düz biçimi kullanın. Karşılaştırma birkaç koşuldan biriyse ve yürütme sürmeliyse, eski tek anahtarlı şablonun imza kontrolünden önce yaptığı gibi, doğrulama biçimini kullanın. Doğrulama biçimi ayrıca karşılaştırmayı ve ayrı bir doğrulama komutunu yazmaya göre bir bayt tasarrufu sağlar; bu, bir betiğin her baytı tanık verisi olmayan bölümde, her biri dört ağırlık birimiyle yer aldığında çok daha önemliydi.

Karıştırılmaması gerekenler

Sık sorulan sorular

OP_EQUAL ile OP_EQUALVERIFY arasındaki fark nedir?

Düz biçim, başka bir şeyin okuması için yığın üzerinde doğru ya da yanlış bırakır; doğrulama biçimi ise iki öğe farklıysa betiği hemen iptal eder. Pay-to-script-hash düz biçimi kullanır çünkü karşılaştırma betiğin son yanıtıdır.

Sayıları mı yoksa baytları mı karşılaştırır?

Baytları, hiçbir yorum yapmadan. Aynı sayıyı temsil eden iki kodlama burada eşit değildir; hash karşılaştırırken tam olarak istenen budur ve aritmetik karşılaştırmaların ayrı bir opcode kullanmasının nedeni de budur.

İlgili terimler

Daha fazlası: Geliştirici başvuru kaynağı

Bu sayfayı İngilizce okuyun