Sözlük / İşlemler ve ücretler
SIGHASH_SINGLE
- SIGHASH_SINGLE nedir?
- SIGHASH_SINGLE, bir imzayı yalnızca tek bir çıktıya, yani listede imzalanan girdiyle aynı konumda duran çıktıya bağlayan bayraktır.
Sıfır numaralı girdi sıfır numaralı çıktıyla, bir numaralı girdi bir numaralı çıktıyla eşleşir ve işlemdeki diğer her şey imzasız bırakılır. Bu tasarım, birkaç tarafın tek bir ortak işlem içinde kendi ödemesini garanti altına almasını sağlar. Ayrıca Bitcoin'in en kötü şöhretli imzalama hatasını da taşır; bu hata eski (legacy) girdilerde hâlâ bulunur.
Nasıl çalışır
Özet (digest), imzalanan girdiyi, işlem sürümünü, locktime değerini ve tam olarak tek bir çıktıyı korur: indeksi girdinin indeksiyle eşleşen çıktıyı.
Bu indeksten sonraki çıktılar, hash hesaplanmadan önce kopyadan çıkarılır. Bundan önceki çıktılar yer tutucu olarak korunur ama boşaltılır; değerleri eksi bir yapılır ve betikleri boş bırakılır, böylece gerçek içerikleri de kapsanmaz. Diğer tüm girdilerdeki sıra numaraları, çıktısız bayrakta olduğu gibi sıfırlanır.
Sonra hata gelir. Orijinal algoritmada, imzalanan girdinin indeksi çıktı sayısına eşit veya ondan büyükse hash'lenecek eşleşen bir çıktı yoktur. Kod hata vermek yerine sabit bir özet döndürür: değeri bir olan 32 baytlık bir sayı. Bu konuma düşen her imzalayan, aynı özet üzerinde bir imza üretir; bu yüzden imza belirli bir işleme bağlı değildir ve aynı indekste bir girdi ayarlayabilen herkes tarafından alınıp yeniden oynatılabilir. Bu dal, onu silmek zincirde hâlihazırda duran coinlerin geçerliliğini değiştireceği için bugün hâlâ Bitcoin Core içinde varlığını sürdürür.
İmza hash algoritmasının iki yeniden yazımı da bu açığı kapattı. BIP143, eşleşen çıktısı olmayan bir segwit sürüm 0 girdisi için özetin çıktılar bölümünün 32 sıfır bayt olduğunu, özetin geri kalanının ise yine o belirli girdiye bağlı kaldığını belirtir; böylece hiçbir şey yeniden oynatılamaz. BIP341 daha ileri gider: bir Taproot girdisinde, çıktı sayısının ötesinde bir indekse sahip bu türden bir imza doğrulamada doğrudan başarısız olur.
Nerede görülür
Bayrak, bir imzanın sonunda 03 olarak görünür ve onu sıradan ödemelerden çok, neredeyse yalnızca önceden imzalanmış tekliflerin içinde bulursunuz.
Kalıp, davet olarak yayımlanan yarım bir işlemdir. Bir satıcı “bu girdim girer ve eşleşen indeksteki çıktı bana istediğim fiyatı öder” ifadesini imzalar, ardından işlemin geri kalanını bir alıcının doldurması için boş bırakır. Satıcının imzası diğer tüm girdileri ve çıktıları yok saydığı için alıcı kendi fonlarını, kendi para üstünü ve mempool'un talep ettiği oranda bir ücret ekleyebilir; satıcının garantisi yine de geçerli kalır. Ordinals ve runes pazar yerleri tam olarak bunun üzerine kuruludur, PSBT olarak dağıtılır ve bu, Bitcoin'in arada hiçbir üçüncü taraf olmadan desteklediği, gerçekten güven gerektirmeyen az sayıdaki işlemden biridir.
Neredeyse her zaman ANYONECANPAY ile birlikte kullanılır; çünkü tek başına bayrak yine girdilerin tam listesine bağlı kalır ve bu da işlemi bir başkasının tamamlaması için açık bırakma amacına aykırı düşer.
SIGHASH_SINGLE vs SIGHASH_ANYONECANPAY
SIGHASH_SINGLE bir temel moddur ve SIGHASH_ANYONECANPAY bir değiştiricidir, dolayısıyla farklı soruları yanıtlarlar. Temel mod, bir imzanın çıktı tarafının ne kadarını kapsadığına karar verir: tamamını, hiçbirini ya da eşleşen tek bir çıktıyı. Değiştirici ise girdi tarafının ne kadarını kapsadığına karar verir: her girdiyi ya da yalnızca imzalanan girdiyi. Bir temel mod seçersiniz, sonra değiştiricinin eklenip eklenmeyeceğine ayrıca karar verirsiniz; bu yüzden gerçek bir imzadaki bayrak baytı genellikle tek tek ikisinden biri değil, ikisinin toplamıdır.