Bitcoinde Transferler ve UTXO Yapısı

Emek
7 min readOct 30, 2018

--

Yeni ekonomi devriminin ilk adımı olarak ortaya çıkan, bir çok teknolojiye ve sektöre etki eden Bitcoin son yılların en popüler konularından biri. Biz de bu yazıda Bitcoin transferlerinin nasıl gerçekleştiğini ve UTXO yapsını inceleyeceğiz.

Yazının ilk kısmı daha genel bir dille yazılmış olup herhangi bir ön bilgi gerektirmemektedir. İkinci kısım ise kriptoloji ve bilgisayar bilimi ile ilgilenen kişilere yöneliktir.

1. Kısım: Transferler ve UTXO Kavramı

Transfer: Alıcı ve satıcı arasında malların, servislerin, finansal enstrümanların değişimi üzerine yapılan anlaşma. — Investopedia

Bitcoin transferi yapabilmek için en temel koşul gönderen hesabın yeterince BTC’ye sahip olmasıdır. Bir hesabın BTC’ye sahip olmasının iki yolu vardır: yeni bir blok üretmiş olmak (yazının yazıldığı tarihte ödül 12,5 BTC + Transfer Bahşişleri) veya hesaba geçmiş tarihlerde bir transfer ile BTC gönderilmiş olması.

Bir transfer işlemi gerçekleştiğinde alıcı hesabın harcayabileceği BTC miktarı artarken gönderen hesaptan da bu miktarın düşülmesi gerekir. Bu durum, günlük hayatta yaptığımız transferlerde kendiliğinden gerçekleşen bir şey olmasına rağmen dijital bir sistemde gerçeklemeye çalıştığımızda bazı zorluklar ile karşılaşıyoruz.

Günümüzde bu sorunlara üretilen çözümler çeşitlilik kazanmış olsa da Bitcoin bunu UTXO yapısı kullanarak çözmüştür. UTXO, ‘Unspent Transaction Output’ yani Harcanmamış Transfer Çıktısı demektir.

Her bir UTXO’yu birer banknot olarak düşünebiliriz ancak alışık olduğumuz 5 TL, 10 TL gibi kesin sınırları yoktur. 0.00000001 BTC (1 Satoshi)’nin katı olmak koşuluyla herhangi bir miktarda değere sahip olabilirler.

Transfer İşlemi

Bu kısımda banknotları biraz geliştireceğiz.

Bugün kullandığımız banknotlar kimin cebindeyse ona ‘aittir’. Üzerlerinde kime ait oldukları yazmaz, sahiplerinin imzaları bulunmaz. Şimdi biz banknotlara bu özelliği ekleyerek sahiplerinden bir parça iliştirelim ki sahibinden başka kimse harcayamasın. Bu parçayı da şimdilik bir parola olarak düşünelim. Her harcama yapmak istediğimde parayı çıkarıyorum, parolayı giriyorum ve bingo! Banknotlarımın parolasını sadece ben bildiğim için sadece ben harcayabiliyorum, kulağa güzel geliyor.

Bir başka yeni özellik olarak da ayarlanabilen miktar ekleyelim. Banknotlarımızın artık 5, 10, 20 gibi net sınırları olmasın da 13 liralık veya 4.35 liralık banknotlarım olabilsin.

Şimdi Ahmet Amca’dan aldığım yoğurdu parolalı banknotlarım ile ödeyeceğim. Cebimde dün minibüsten para üstü olarak aldığım 2 TL ve nereden kaldığını bile hatırlayamadığım 5 TL var. İkisini de parolamı girerek masaya koydum ve 7 TL’lik bir transferi başlattım. Yoğurt 6 TL olduğu için 1 TL de para üstü almam gerekiyor. İşte burada biraz sihir devreye girecek. Bu banknotları birkaç sihirli sözcükle 6 TL ve 1 TL’lik iki banknot haline getirdim. Üstelik artık 6 TL’lik banknot Ahmet Amcanın parolası ile, 1 TL’lik banknot ise benim parolam ile açılabiliyor.Ahmet Amcamın parasını verdiğime göre yoğurdu ve 1 TL’lik baknotumu alıp eve gidebilirim. Artık benim yoğurdum, Ahmet Amca’nın ise toptancıdan mal alırken kullanabileceği 6 TL’si var.

Burada ‘aitlik’ kavramına dikkatinizi çekmek istiyorum. 6 TL’lik banknotun Ahmet Amca’ya ait olmasını belirleyen tek şey parolayı onun bilmesi, tıpkı Facebook hesabınızın size ait olması gibi.

Bu benzetmeleri yapmamızın sebebi,miktarı ayarlanabilen parolalı banknotların Bitcoin’deki UTXO’lara çok benzemesi. Parolaya ihtiyacımız var, çünkü UTXO’lar gizli değil. Fiziksel bir şey olmadığı için cebimize de atamıyoruz. Dolayısıyla hangi UTXO’nun (banknotun) kime ait olduğunu bilmenin yolu onlara birer parola iliştirmek. Böylece sahipleri bazı harfleri ve sayıları (aslında sadece sayı ama buraya takılmayalım) doğru sıralamada bilmeleri sayesinde o UTXO’ların kendilerine ait olduklarını kanıtlayabiliyorlar. Bir kez daha, tıpkı Facebook hesabınız gibi :)

Bu sistemi gerçekleyebilmek için de bize yardım eden şey tahmin edebileceğiniz gibi matematik. Açık (Public) ve Kapalı (Private) anahtarları kullanarak banknotlarımda parola belirlemek yerine onları ‘şifreliyorum’.

Bkz: Asimetrik Şifreleme

Şifre : Bir veriyi değiştirerek anlaşılmaz hale getirme işlemi.

Parola: Kimlik doğrulama için kullanılan sözcük, metin.

Bir transferde herhangi bir miktarda girdi ve çıktı olabilir. Bu girdi ve çıktılar birer UTXO’dur. Bir transfer yapmak istendiğinde, gönderen hesaba tanımlı olan UTXO’lar transfere eklenmeli, gönderilmek istenen miktarlar da çıktı olarak alıcı adreslerine tanımlanmalıdır. Tanımlama, yukarıda bahsettiğimiz Açık ve Kapalı anahtarları kullanarak şifreleme işlemidir. Bu transfer onaylandıktan sonra girdi olarak kullanılan UTXO’lar geçerliliğini kaybedecek, çıktı kısmındaki UTXO’lar ise aktifleşecektir.

Bitcoin adresi dediğimiz sayılar aslında Açık Anahtarlar’ın biraz değiştirilmiş (RIPEMD160 ile özetlenmiş) halidir. Her bir UTXO bir adres ile şifrelendiği için, adrese ait kapalı anahtarı bilen kişi (sahibi?) haricinde kimse harcayamaz. Ancak UTXO’lar gizli değildir, görmek isteyen herkese açıktır. Hatta full-node olarak madencilik yapmak isteyenler bu UTXO veritabanının tamamını kendi sisteminde bulundurmaktadır. Bu sayede transferlerin doğruluğunu teyit edebilirler.

Bir transferin onaylanabilmesi için;
1. Dahil edilen UTXO’ların VAR olması gerekmektedir.
2. Dahil edilen UTXO’ların önceden harcanmamış olması gerekmektedir.
3. Transfere dahil edilen girdi miktarı çıktı miktarına eşit veya daha fazla olmalıdır.

Örneğin,
Arkadaşımız Ali’ye 5 BTC göndermek istiyoruz. Elimizde bize önceden gönderilmiş olan 2 BTC ve 4 BTC’lik iki tane UTXO bulunuyor. Bu işlem için izlememiz gereken yöntem;

Öncelikle iki UTXO da transfer yapısına eklenir. Bu da toplamda 6 BTC’lik bir girdi miktarımız olduğu anlamına geliyor. Burada gönderim yapmak istediğimiz tek adres Ali’nin adresi. Bu sebeple Ali’nin adresini kullanarak ona 5 BTC’lik yeni bir UTXO tanımlıyorum (cüzdan uygulamaları bu işlemleri sizin yerinize yapacaktır, adresi ve miktarı girmeniz yeterli). Bu birinci çıktım olacak. İkinci olarak ise kendi adresimi kullanarak yeni bir çıktı oluşturacağım ve artan miktarı kendi adresimi kullanarak tanımlayacağım. Yani kendi adresimle şifrelenmiş 1 BTC’lik yeni bir UTXO oluşturmuş olacağım. Aksi takdirde girdi ve çıktı değerleri arasındaki fark olan 1 BTC bahşiş olarak belirlenecek ve transferi bloğuna dahil eden madenciye gidecektir. (Bunlar tabi biraz karışık konular, belki bir sonraki yazıda detaylandırırız.)

Bu işlem gerçekleştikten sonra girdi olarak kullandığım tüm UTXO’lar ‘eski’ olarak işaretlenecek ve tekrar harcanması mümkün olmayacaktır. Çıktı olarak üretilen UTXO’lardan ise 5 BTC değere sahip olan Ali’nin adresi ile şifrelendiği için yalnızca Ali tarafından harcanabilecek, 1 BTC’lik çıktı ise benim adresimle şifrelendiği için bana ait olacaktır.

Bütün UTXO’lara bakarak Bitcoin ağının o anki durumunu görebiliriz. Hangi hesapta ne kadar BTC olduğu hesaplayabilir ve yine bu yapı sayesinde Bitcoindeki transfer işlemlerini gerçekleştiririz.

Buraya kadar olan kısımda transfer yapısını basitleştirilmiş bir şekilde anlatmaya çalıştım. İkinci kısımda transfer sürecini daha teknik olarak ele alacağız.

2. Kısım: Detaylı inceleme

Aşağıda bir transferin yapısı görselleştirilmiştir.

Bu görselde görünen;

Versiyon : Transferin yapıldığı andaki Bitcoin sürümü
Girdi Sayısı : Transfere dahil edilen UTXO’ların sayısı
Çıktı Sayısı : Transfer sonucu oluşan UTXO’ların sayısı
Blok Kilit Zamanı : Transferin bloğa eklenme önceliğini belirten bir değer
Girdi #m : m indeksli transfer girdisi
Çıktı #m : m indeksli transfer çıktısı

Buradaki kavramlarda şu an değinmediğimiz Blok Kilit Zamanı kavramı bulunuyor. Bu değer transferde bırakılan bahşiş miktarı ve girdi sayısı kullanılarak hesaplanan bir değerdir. Transferin bloğa eklenme önceliğini gösterir. Yüksek bahşişli transferlerin önceliği daha fazladır. Hiç bahşiş bırakmadan da bir transfer yapmak mümkündür ancak önceliği düşük olacağı için bir bloğa eklenmesi uzun sürecektir.

Onun dışındaki kısımlardan az çok yazının başında bahsetmiştik. Aşağıda ise bir UTXO’nun yapısı bulunuyor.

UTXO Yapısı

Burada görünen;
Önceki Transfer ID : Bu UTXO’nun üretildiği transferin özet halidir.
Önc. Trans. Çıktı Indeksi : Önceki transferin kaç numaralı çıktısını dahil etmek istediğimizin bilgisi.
Kilit Açma Kodu Uzunluğu : UTXO’yu harcayabilmek için kullandığım scriptin uzunluğu.
Kilit Açma Kodu : UTXO’yu harcayabilmek için üzerindeki kilit kodu ile uyumlu olarak çalışan ve gizli anahtar kullanılarak üretilen kod parçası.

Çıktı UTXO’larında ise;

BTC Miktarı : UTXO’nun sahip olmasını istediğim BTC miktarı
Kilit Kodu Uzunluğu : Kilitlemek için kullanılan script’in uzunluğu
Kilit Kodu : Kilitleme kodu. Bu kod oluşturulurken alıcının adresi kullanılır. Dolayısıyla bunu yalnızca o hesabın Gizli Anahtarına sahip olan kişi çözüp harcayabilir.

Bir BTC adresi, üretilen bir açık anahtarın 160-bitlik özeti alınmış halidir.

Bitcoin blokzinciri bilgisayarımızda çalışan bir sanal makinedir. Kendi talimat kümesini kullanır. Bu sanal makine üzerinde Script adı verilen dil ile program yazılabilir. Dolayısıyla bir transfer oluştururken bizim de bu talimat kümesinden bir program yazıp makinenin o anki durumunu değiştirmemiz gerekir. Ancak bu işi bizim yerimize Cüzdan adı verilen uygulamalar yapar. UTXO’larımızı kullanarak bizim için uygun formatta transferler oluşturur.

Cüzdan uygulamasına girip Ali’nin adresine 5 BTC gönder diye talimat verdiğim zaman arkada dönen işlemler aslında şunlardır;

Öncelikle hesabıma tanımlı olan UTXO’lar arasından gönderilecek değer için yeterli olan (en uygun olan) UTXO kümesi seçilir. Örneğin 4 BTC , 5 BTC ve 6 BTC’lik 3 adet UTXO’m var ise 10 BTC’lik bir transfer için 4 ve 6’lık olanlar seçilir. (Bahşiş bırakmadığımızı varsayıyoruz).Transfer yapısında gerekli alanlar gerekli bilgiler ile cüzdan tarafından doldurulur. Burada kilit açma kodu aslında Script dili kullanılarak yazılan bir programdır. Bu kod parçası sayesinde UTXO’nun bize ait olduğunu kanıtlarız.

İşlem şu şekilde ilerler;

  1. Önceki transfer bulunur ve oradan şu an harcamak istediğim UTXO’yu oluşturan çıktı bulunarak alınır. Bu Çıktı’nın yapısı yukarıdaki çıktı UTXO’su yapısındakinin aynısıdır. Kilit kodu oluşturulurken benim adresim kullanıldığı için buna uygun olan kilit açma kod parçasını oluşturabilirim.
  2. Cüzdan uygulaması gizli anahtarımızı kullanarak bu kod parçasını oluşturur. Çıktının kilitlenmiş kısmını açabilmek için 2 komutluk bir kod parçası yeterli olmaktadır. Bunlardan üstte olanı gizli anahtarımız ile oluşturulmuş imzamız, diğeri ise açık anahtarımızdır. Sonrasında bu kod parçası kilit kod parçasının üstüne eklenir ve yığın işlemleri başlamış olur.

Yığın işlemleri şu şekilde ilerler:

  1. PUSHDATA komutu ile imzamız yığına eklenir. (Buradaki imza eliptik eğri dijital imza algoritması ile üretilmiştir.)

Yığın durumu: <IMZA>

2. PUSHDATA komutu ile açık anahtarımız yığına eklenir.

Yığın durumu: <IMZA> <ACIKANAHTAR>

3. OP_DUP ile üstte kalan, yani açık anahtarımız kopyalanır (çiftlenir).

Yığın durumu: <IMZA> <ACIKANAHTAR> <ACIKANAHTAR>

4. OP_HASH160 ile yığının en üstteki elemanının RIPEMD160 algoritması kullanılarak özet değeri hesaplanır.

Yığın durumu: <IMZA> <ACIKANAHTAR> <AçıkAnahtarHASH160>

5. PUSHDATA ile alıcının, yani UTXO sahibinin adresi yığına eklenir. Bu durumda UTXO sahibi biz olduğumuz için bu adresi bizim adresimiz olacaktır.

Yığın Durumu: <IMZA> <ACIKANAHTAR> <HASH160"ACIKANAHTAR”><GONDERENADRES>

6. OP_EQUALVERIFY ile yığının en üstünde bulunan iki değerin birbirine eşit olup olmadığına bakılır. Hatırlarsanız yazının başında BTC adreslerinin aslında açık anahtarların özeti olduğunu söylemiştik. Burada da sorgu bizim açık anahtarımızın özet değeri ve adresimiz arasında yapıldığı için bu değerlerin birbirini tutması gerekmektedir. Bu işlem True döndükten sonra,

Yığın Durumu: <IMZA> <ACIKANAHTAR>

7. OP_CHECKSIG iki parametre alır, sırasıyla açık anahtar ve imza. Bu işlem gerçekleştikten sonra kilit açma kodundaki imzanın geçerli olup olmadığı açık anahtarımız da kullanılarak teyit edilir. Eğer imzamız doğruysa bir True çıktısı döner ve transfer gerçekleşir.

Bu adımların herhangi birinde bir hata olması transferin gerçekleşmemesine sebep olur. Bir hata olmaması durumunda, BTC’ler yeni alıcılarına tanımlanmış olur ve UTXO’lar geçerliliğini kaybetmiş olur.

Bu transfer bütün Bitcoin ağına duyurulur. Transferin doğruluğunu onaylayan madenciler bunu kendi bloklarına dahil ederler. Bir bloğa dahil edilene kadar bir transfer ‘askıda’ olarak nitelendirilir. Ancak gereçli bir bloğa işlenen transfer onaylanmış, deftere yazılmıştır.

Okuduğunuz için teşekkürler.

--

--