Bitcoin genellikle programlanabilir para olarak adlandırılır. Dijital doğası, kullanıcılara fonlarını kullanma koşullarını tanımlama konusunda artan esneklik sağlar.
Bitcoin'ı tartışırken, konuşmalar genellikle cüzdanlar ve paralar etrafında döner. Ancak, daha doğru bir kavramsallaştırma, cüzdanları anahtarlar, paraları çekler ve blokzinciri güvenli bir kasa olarak düşünmektir. Her kasa, çeklerin yerleştirilebileceği veya içeriğin incelenebileceği dar bir açılışa sahiptir. Kasaya erişim, yalnızca doğru anahtara sahip olanlarla sınırlıdır.
Bir anahtar sahibi fonları transfer etmek istediğinde, kasayı açar. Bu işlem, ( referansını içeren yeni bir çek oluşturmayı gerektirir, bu çek geçersiz hale gelir ) ve yalnızca hedef alıcı tarafından erişilebilen bir kasada güvence altına alınır. Yeni alıcı, bu fonları harcarken aynı adımları izler.
Bu makale, Bitcoin ağı üzerindeki düğümlerin bu dijital kasaların kilitleme ve kilidini açma mekanizmalarını kontrol etmek için kullandığı programlama dili Bitcoin Script'i incelemektedir.
Bitcoin'in İşlem Mekanikleri
Analojimizi takip ederek, her Bitcoin işlemi iki temel bileşenden oluşur: bir anahtar (kasaya erişim için ) ve bir kilit. Anahtar, transfer etmek istediğiniz çeki içeren kasayı açar, yeni çek ise farklı bir kilit ile güvence altına alınmış başka bir kasaya yerleştirilir. Bu yeni kasadan fonlara erişmek için başka bir özel anahtar gereklidir.
Bu sistem olağanüstü esneklik sunar. Ağ, çeşitli kilit türlerini destekler - bazı kasalar birden fazla anahtar gerektirebilir, diğerleri erişim için yetki kanıtı talep edebilir. Kullanıcılar, belirli gereksinimlerine göre birçok koşulu özelleştirebilir.
Teknik terimlerle, anahtar scriptSig olarak adlandırılırken, kilit scriptPubKey olarak adlandırılmaktadır. Daha yakından incelendiğinde, bu bileşenler veri parçaları ve kod bloklarının kombinasyonları olarak kendilerini gösterir ve birlikte kompakt bir program oluştururlar.
İşlem yürütülürken, bu kombinasyon ağ boyunca yayılır. Her alıcı düğüm işlem geçerliliğini doğrular. Başarısız doğrulama, fonların erişilemez olmasına neden olur.
Kontroller (coin), teknik olarak harcanmamış işlem çıktıları (UTXO'lar) olarak bilinir. Uygun bir anahtara sahip olan herhangi bir kullanıcı bu fonları kullanabilir. Özellikle, scriptSig anahtar işlevi görürken, scriptPubKey kilit görevi görür.
Cüzdanınız UTXO'lar içeriyorsa, muhtemelen yalnızca belirli bir genel anahtarın mülkiyetini kanıtlayabilen bireylerin ilgili fonları kilidini açabileceğini belirten bir koşul taşırlar. Bunları kilidini açmak için, scriptPubKey'de belirtilen genel anahtara karşılık gelen bir özel anahtarla dijital olarak imzalanmış bir scriptSig sağlamanız gerekir.
Bitcoin Yığın Temelleri
Script, yığın tabanlı bir dil olarak çalışır. Talimatlar, üstteki öğeden başlayarak yürütme ile birlikte dikey bir sütun halinde düzenlenmiştir. Örneğin, A, B ve C öğeleri, üstte C ve altta A olacak şekilde bir yığın oluşturur. Talimatları yürütürken, işlemler yığının üstündeki öğelerle başlar.
Yürütme sırasında yığına elemanlar eklenir ve "popped" yapılır.
Veri ögeleri ( imzalar, hash'ler ve genel anahtarlar) talimatlardan( veya opcode'lardan) farklıdır. Talimatlar verileri kaldırır ve üzerinde işlemler gerçekleştirir. Bu basitleştirilmiş örneği düşünün:
Veriler kırmızı, opcodlar mavi olarak görünmektedir. Soldan sağa okunduğunda, dize önce yığına girer. opcode (örnek için varsayımsal) ardından en üst yığın elemanını () çıkarır ve MD5 hashing uygular, sonucu yığına geri iter: d16fb36f0911f878998c136191af705e.
Sonra, yığına girer, bu da iki özdeş öğe ile sonuçlanır. Son olarak, üstteki iki öğeyi çıkarır ve karşılaştırır, eğer özdeşlerse <1> yığına, farklılarsa <0> ekler.
Talimat listesinin sonuna ulaşıldığında, script doğrulaması iki kurala tabidir: kalan eleman null ise veya bir talimat, yerine getirilmeyen koşullar nedeniyle başarısız olursa hata meydana gelir. Bu örnekte, hiçbir koşul uygulanmaz - elimizde null olmayan bir eleman var (<1>), bu da script geçerliliğini onaylar. Aynı kurallar gerçek Bitcoin işlemlerini de yönetir.
Pay-to-Pubkey (P2PK)
Pay-to-Pubkey (P2PK), en temel işlem biçimini temsil eder. Bu, fonları belirli bir genel anahtara kilitler. Bu yöntemle fon almak için alıcılar, göndericilere bir Bitcoin adresi yerine genel anahtarlarını sağlamalıdır.
2009 yılında Satoshi Nakamoto ve Hal Finney arasında yapılan ilk işlem P2PK kullandı. Bu yapı, Bitcoin'in ilk günlerinde yaygındı ancak büyük ölçüde Pay-to-Pubkey-Hash (P2PKH) ile değiştirilmiştir.
P2PK için kilitleme scripti basit bir formatı takip eder: OP_CHECKSIG. Adından da anlaşılacağı gibi, OP_CHECKSIG, imzayı sağlanan anahtara karşı doğrular. İlgili scriptSig sadece içerir.
İşlem süreci daha basit olamazdı: imza yığına girer, ardından genel anahtar gelir. OP_CHECKSIG her iki elementi inceler ve imzayı genel anahtara karşı doğrular. Bir eşleşme, yığına <1> eklenmesine neden olur; aksi takdirde, <0> görünür.
P2PK kullanılmaz hale geldi, nedenleri aşağıdaki bölümde incelenecektir.
Pay-to-Pubkey-Hash (P2PKH)
Pay-to-Pubkey-Hash (P2PKH), Bitcoin ağındaki en yaygın işlem türünü temsil etmektedir. Modern cüzdan yazılımları genellikle bu formatı varsayılan olarak uygular.
P2PKH scriptPubKey bu yapıyı takip eder:
OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG
İlgili scriptSig'i incelemeden önce, içinde yer alan op kodlarını anlayalım:
OP_DUP
OP_DUP, en üstteki elemanı çıkarır, bir kopya oluşturur ve her iki versiyonu da yığının üstüne geri ekler. Bu, orijinalini korurken kopya üzerinde işlem yapmayı sağlar.
OP_HASH160
Bu opcode, üstteki öğeyi kaldırır ve iki aşamalı hash uygulaması yapar: önce SHA-256, ardından SHA-256 çıktısına RIPEMD-160 uygular. Elde edilen hash yığına geri döner.
OP_EQUALVERIFY
OP_EQUALVERIFY, iki işlemi birleştirir: OP_EQUAL ve OP_VERIFY. OP_EQUAL, iki öğeyi kaldırır ve kimlik kontrolü yapar, eğer öğeler aynıysa <1>, farklıysa <0> iterek. OP_VERIFY, en üstteki öğeyi kaldırır ve onun doğruluk değerini doğrular (null). OP_EQUALVERIFY olarak birleştirildiğinde, bu, en üstteki iki öğe eşleşmiyorsa işlem başarısızlığına neden olur.
Karşılık gelen scriptSig yapısı şudur:
P2PKH çıktılarının kilidini açmak, geçerli bir imza ve ona karşılık gelen bir kamu anahtarı sağlamayı gerektirir.
Bu süreç, sağlanan genel anahtarın skripte gömülü olan hash ile eşleştiğini doğrulayarak P2PK yürütme akışını temel alır.
Önemli bir ayrım: P2PKH kilitleme scriptlerinde, genel anahtar gizli kalır - yalnızca hash'i görünür. Blockchain gezginlerinde harcanmamış bir P2PKH çıktısını incelemek, genel anahtar bilgisi vermez. Anahtar, alıcı fonları transfer ettiğinde yalnızca görünür hale gelir.
Bu yaklaşım birkaç avantaj sunmaktadır. Öncelikle, genel anahtar hash'leri, tam genel anahtarlardan daha kompakt bir iletim sağlar - bu, Satoshi'nin 2009'daki uygulamasını motive etmiştir. Bu genel anahtar hash'leri, kullanıcıların değiştirdiği Bitcoin adreslerini oluşturur.
İkincisi, açık anahtar hashing, kuantum hesaplama tehditlerine karşı ek bir güvenlik katmanı sunar. Açık anahtar harcama gerçekleşene kadar gizli kaldığı için, karşılık gelen özel anahtarın belirlenmesi önemli ölçüde daha zor hale gelir. Herhangi bir saldırı, iki ardışık hashing işlemini tersine çevirmeyi gerektirecektir (RIPEMD-160 ve SHA-256).
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
Bitcoin Script'i Çözümleme: Dijital Paranın Arkasındaki Programlama Dili
Giriş
Bitcoin genellikle programlanabilir para olarak adlandırılır. Dijital doğası, kullanıcılara fonlarını kullanma koşullarını tanımlama konusunda artan esneklik sağlar.
Bitcoin'ı tartışırken, konuşmalar genellikle cüzdanlar ve paralar etrafında döner. Ancak, daha doğru bir kavramsallaştırma, cüzdanları anahtarlar, paraları çekler ve blokzinciri güvenli bir kasa olarak düşünmektir. Her kasa, çeklerin yerleştirilebileceği veya içeriğin incelenebileceği dar bir açılışa sahiptir. Kasaya erişim, yalnızca doğru anahtara sahip olanlarla sınırlıdır.
Bir anahtar sahibi fonları transfer etmek istediğinde, kasayı açar. Bu işlem, ( referansını içeren yeni bir çek oluşturmayı gerektirir, bu çek geçersiz hale gelir ) ve yalnızca hedef alıcı tarafından erişilebilen bir kasada güvence altına alınır. Yeni alıcı, bu fonları harcarken aynı adımları izler.
Bu makale, Bitcoin ağı üzerindeki düğümlerin bu dijital kasaların kilitleme ve kilidini açma mekanizmalarını kontrol etmek için kullandığı programlama dili Bitcoin Script'i incelemektedir.
Bitcoin'in İşlem Mekanikleri
Analojimizi takip ederek, her Bitcoin işlemi iki temel bileşenden oluşur: bir anahtar (kasaya erişim için ) ve bir kilit. Anahtar, transfer etmek istediğiniz çeki içeren kasayı açar, yeni çek ise farklı bir kilit ile güvence altına alınmış başka bir kasaya yerleştirilir. Bu yeni kasadan fonlara erişmek için başka bir özel anahtar gereklidir.
Bu sistem olağanüstü esneklik sunar. Ağ, çeşitli kilit türlerini destekler - bazı kasalar birden fazla anahtar gerektirebilir, diğerleri erişim için yetki kanıtı talep edebilir. Kullanıcılar, belirli gereksinimlerine göre birçok koşulu özelleştirebilir.
Teknik terimlerle, anahtar scriptSig olarak adlandırılırken, kilit scriptPubKey olarak adlandırılmaktadır. Daha yakından incelendiğinde, bu bileşenler veri parçaları ve kod bloklarının kombinasyonları olarak kendilerini gösterir ve birlikte kompakt bir program oluştururlar.
İşlem yürütülürken, bu kombinasyon ağ boyunca yayılır. Her alıcı düğüm işlem geçerliliğini doğrular. Başarısız doğrulama, fonların erişilemez olmasına neden olur.
Kontroller (coin), teknik olarak harcanmamış işlem çıktıları (UTXO'lar) olarak bilinir. Uygun bir anahtara sahip olan herhangi bir kullanıcı bu fonları kullanabilir. Özellikle, scriptSig anahtar işlevi görürken, scriptPubKey kilit görevi görür.
Cüzdanınız UTXO'lar içeriyorsa, muhtemelen yalnızca belirli bir genel anahtarın mülkiyetini kanıtlayabilen bireylerin ilgili fonları kilidini açabileceğini belirten bir koşul taşırlar. Bunları kilidini açmak için, scriptPubKey'de belirtilen genel anahtara karşılık gelen bir özel anahtarla dijital olarak imzalanmış bir scriptSig sağlamanız gerekir.
Bitcoin Yığın Temelleri
Script, yığın tabanlı bir dil olarak çalışır. Talimatlar, üstteki öğeden başlayarak yürütme ile birlikte dikey bir sütun halinde düzenlenmiştir. Örneğin, A, B ve C öğeleri, üstte C ve altta A olacak şekilde bir yığın oluşturur. Talimatları yürütürken, işlemler yığının üstündeki öğelerle başlar.
Yürütme sırasında yığına elemanlar eklenir ve "popped" yapılır.
Veri ögeleri ( imzalar, hash'ler ve genel anahtarlar) talimatlardan( veya opcode'lardan) farklıdır. Talimatlar verileri kaldırır ve üzerinde işlemler gerçekleştirir. Bu basitleştirilmiş örneği düşünün:
Veriler kırmızı, opcodlar mavi olarak görünmektedir. Soldan sağa okunduğunda, dize önce yığına girer. opcode (örnek için varsayımsal) ardından en üst yığın elemanını () çıkarır ve MD5 hashing uygular, sonucu yığına geri iter: d16fb36f0911f878998c136191af705e.
Sonra, yığına girer, bu da iki özdeş öğe ile sonuçlanır. Son olarak, üstteki iki öğeyi çıkarır ve karşılaştırır, eğer özdeşlerse <1> yığına, farklılarsa <0> ekler.
Talimat listesinin sonuna ulaşıldığında, script doğrulaması iki kurala tabidir: kalan eleman null ise veya bir talimat, yerine getirilmeyen koşullar nedeniyle başarısız olursa hata meydana gelir. Bu örnekte, hiçbir koşul uygulanmaz - elimizde null olmayan bir eleman var (<1>), bu da script geçerliliğini onaylar. Aynı kurallar gerçek Bitcoin işlemlerini de yönetir.
Pay-to-Pubkey (P2PK)
Pay-to-Pubkey (P2PK), en temel işlem biçimini temsil eder. Bu, fonları belirli bir genel anahtara kilitler. Bu yöntemle fon almak için alıcılar, göndericilere bir Bitcoin adresi yerine genel anahtarlarını sağlamalıdır.
2009 yılında Satoshi Nakamoto ve Hal Finney arasında yapılan ilk işlem P2PK kullandı. Bu yapı, Bitcoin'in ilk günlerinde yaygındı ancak büyük ölçüde Pay-to-Pubkey-Hash (P2PKH) ile değiştirilmiştir.
P2PK için kilitleme scripti basit bir formatı takip eder: OP_CHECKSIG. Adından da anlaşılacağı gibi, OP_CHECKSIG, imzayı sağlanan anahtara karşı doğrular. İlgili scriptSig sadece içerir.
İşlem süreci daha basit olamazdı: imza yığına girer, ardından genel anahtar gelir. OP_CHECKSIG her iki elementi inceler ve imzayı genel anahtara karşı doğrular. Bir eşleşme, yığına <1> eklenmesine neden olur; aksi takdirde, <0> görünür.
P2PK kullanılmaz hale geldi, nedenleri aşağıdaki bölümde incelenecektir.
Pay-to-Pubkey-Hash (P2PKH)
Pay-to-Pubkey-Hash (P2PKH), Bitcoin ağındaki en yaygın işlem türünü temsil etmektedir. Modern cüzdan yazılımları genellikle bu formatı varsayılan olarak uygular.
P2PKH scriptPubKey bu yapıyı takip eder:
OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG
İlgili scriptSig'i incelemeden önce, içinde yer alan op kodlarını anlayalım:
OP_DUP
OP_DUP, en üstteki elemanı çıkarır, bir kopya oluşturur ve her iki versiyonu da yığının üstüne geri ekler. Bu, orijinalini korurken kopya üzerinde işlem yapmayı sağlar.
OP_HASH160
Bu opcode, üstteki öğeyi kaldırır ve iki aşamalı hash uygulaması yapar: önce SHA-256, ardından SHA-256 çıktısına RIPEMD-160 uygular. Elde edilen hash yığına geri döner.
OP_EQUALVERIFY
OP_EQUALVERIFY, iki işlemi birleştirir: OP_EQUAL ve OP_VERIFY. OP_EQUAL, iki öğeyi kaldırır ve kimlik kontrolü yapar, eğer öğeler aynıysa <1>, farklıysa <0> iterek. OP_VERIFY, en üstteki öğeyi kaldırır ve onun doğruluk değerini doğrular (null). OP_EQUALVERIFY olarak birleştirildiğinde, bu, en üstteki iki öğe eşleşmiyorsa işlem başarısızlığına neden olur.
Karşılık gelen scriptSig yapısı şudur:
P2PKH çıktılarının kilidini açmak, geçerli bir imza ve ona karşılık gelen bir kamu anahtarı sağlamayı gerektirir.
Bu süreç, sağlanan genel anahtarın skripte gömülü olan hash ile eşleştiğini doğrulayarak P2PK yürütme akışını temel alır.
Önemli bir ayrım: P2PKH kilitleme scriptlerinde, genel anahtar gizli kalır - yalnızca hash'i görünür. Blockchain gezginlerinde harcanmamış bir P2PKH çıktısını incelemek, genel anahtar bilgisi vermez. Anahtar, alıcı fonları transfer ettiğinde yalnızca görünür hale gelir.
Bu yaklaşım birkaç avantaj sunmaktadır. Öncelikle, genel anahtar hash'leri, tam genel anahtarlardan daha kompakt bir iletim sağlar - bu, Satoshi'nin 2009'daki uygulamasını motive etmiştir. Bu genel anahtar hash'leri, kullanıcıların değiştirdiği Bitcoin adreslerini oluşturur.
İkincisi, açık anahtar hashing, kuantum hesaplama tehditlerine karşı ek bir güvenlik katmanı sunar. Açık anahtar harcama gerçekleşene kadar gizli kaldığı için, karşılık gelen özel anahtarın belirlenmesi önemli ölçüde daha zor hale gelir. Herhangi bir saldırı, iki ardışık hashing işlemini tersine çevirmeyi gerektirecektir (RIPEMD-160 ve SHA-256).