Atomik Transferler

Spread the love

Bu bölümde Algo ile “Atomic Swap” yani Atomik Transfer işlemlerinin nasıl yapıldığını ele alacağız. Öncelikle, Atomic Swap nedir buna bakalım.

Geleneksel finansta, ticaret varlıkları genellikle her iki tarafın da kabul ettiklerini aldığından emin olmak için bir banka veya borsa gibi güvenilir bir aracı gerektirir. Bu banka veya borsa bir tür aracıdır. Algorand ekosisteminde bu aracıları ortadan kaldırmak için Atomic Swap işlemleri kullanılır.

Bu basitçe, transferin parçası olan işlemlerin tamamının başarılı veya başarısız olduğunu kontrol eden kriptografik bir aracıdır. Atomik transferler, insanların güvenilir bir aracıya ihtiyaç duymadan varlık ticareti yapmalarına izin verirken, her bir tarafın da kabul ettiklerini alacağını garanti eder.

İşlemler bir mal veya hizmet karşılığında bir alıcıdan satıcıya Algos transferine izin vermektedir. Burada karşımıza bir kavram çıkıyor:  “Hashed Time Locked Contract”

Bu yöntemde, alıcı ve satış fiyatı ile bir TEAL hesabına fon sağlar. Alıcı ayrıca bir gizli değer seçer ve TEAL programında bu değerin güvenli bir hash’ini kodlar. Satıcı programdaki hash’e karşılık gelen gizli değeri sağlayabiliyorsa, TEAL programı bakiyesini satıcıya aktaracaktır. Satıcı mal veya hizmeti alıcıya teslim ettiğinde, alıcı programdaki secret’i açıklar. Satıcı secret’i anında doğrulayabilir ve ödemeyi geri çekebilir.

Atomik Transferler  aşağıdaki gibi durumlarda kullanılabilmektedir:

  • Döngüsel ticaret –  Ali, Veliye ancak Veli’nin Ayşe’ye ödeme yapması durumunda ödeme yapar. Yani eğer ikinci kişi üçüncü kişiye ödeme yapmazsa, birinci kişi de ikinci kişiye ödeme yapmaz.
  • Grup ödemeleri – Herkesin ödemesi alınır veya hiç kimsenin alınmaz. Örneğin bu durum kitlesel fonlamalarda kullanılabilir.
  • Merkezi olmayan borsalar – Merkezi bir borsadan geçmeden bir varlığın diğeriyle ticaretinin yapılması.
  • Dağıtılmış ödemeler – Birden çok alıcıya yapılan ödemeler.

Şimdi örnek kodumuza geçelim. Bu kodların güvenlik açısından denetlenmediğini , deneysel aşamada olduğu için güvenlik riskleri barındırabileceğini de not düşelim. Amacımız bu mekanizmayı öğrenmek.

from pyteal import * diyerek tüm pyteal kütüphanesini içe aktarıyoruz.

Blockzincir sistemlerinde bir teamül var. Satıcı için Alice, para alan kişi için de Bob takma ismi kullanılıyor. Bu teamüle uymak için kodumuzda bu isimleri kullanıyoruz.

İlk olarak  bu iki kişinin hesap cüzdanlarını tanımlıyoruz.

alice = Addr(“6ZHGHH5Z5CTPCF5WCESXMGRSVK7QJETR63M3NY5FJCUYDHO57VTCMJOBGY”)

bob = Addr(“7Z5PWO2C6LFNQFGHWKSK5H47IQP5OJW2M3HA2QPXTY3WTNP5NU2MHBW27M”)

Ardından güvenlik kodu belirliyoruz.

secret = Bytes(“base32”, “23232323232323”)

timeout = 3000 diyerek işlem eğer 3 saniye içerisinde gerçekleşmezse iptal et diyoruz.

Şimdi bir fonksiyon tanımlayacağız. Önce fonksiyonun tamamını paylaşalım, ardından kodu yorumlayalım.

def htlc(tmpl_seller=alice,

        tmpl_buyer=bob,

        tmpl_fee=1000,

        tmpl_secret=secret,

        tmpl_hash_fn=Sha256,

        tmpl_timeout=timeout):

        fee_cond = Txn.fee() < Int(tmpl_fee)

        safety_cond = And(

            Txn.type_enum() == TxnType.Payment,

            Txn.close_remainder_to() == Global.zero_address(),

            Txn.rekey_to() == Global.zero_address(),

            ##global sıfır adrese ayarlandığını kontrol eder

            #(bu, işlemin adres bakiyesini kapatmayacağı anlamına gelir),

            #işlemin alıcısını istenen alıcıya ayarlar ve işlem miktarını istenen tutara

            # ayarlar

        )

        recv_cond = And(

            Txn.receiver() == tmpl_seller,

            tmpl_hash_fn(Arg(0)) == tmpl_secret

        )

        esc_cond = And(

            Txn.receiver() == tmpl_buyer,

            Txn.first_valid() > Int(tmpl_timeout)

        )

        return And(

            fee_cond,

            safety_cond,

            Or(recv_cond, esc_cond)

        )

tmpl_seller=alice,

tmpl_buyer=bob,

ile satıcı ve alıcı adreslerine atıfta bulunuyoruz.

tmpl_fee=1000,

tmpl_secret=secret,

tmpl_hash_fn=Sha256,

tmpl_timeout=timeout

değişkenleriyle. Ödenecek ücret limitini, gizlilik değerini, bu gizlilik değeri için nasıl bir şifreleme kullanılacağını ve timeout ile ne zaman zaman aşımı gerçekleşeceğini belirliyoruz. Fonksiyona devam edelim.

fee_cond = Txn.fee() < Int(tmpl_fee) ile bir tutar kontrolü yapıyoruz. Buradaki tutar 1000 Algo’dan düşük mü diye bakıyoruz. Burada da aslında şöyle bir amaç var. Kişiler yanlışlıkla yüksek tutar girebilir. Bir sıfır fazla girebilir. Blockchain’de geri dönüş olmadığı için bu durum bir krize yol açabilecektir. Sınır koyarak nispeten bunun önüne geçiyoruz.

safety_cond = And(

            Txn.type_enum() == TxnType.Payment,

            Txn.close_remainder_to() == Global.zero_address(),

            Txn.rekey_to() == Global.zero_address(),)

Kısmında önceki uygulamamızda olduğu gibi bir AND yani, şu şu şartlar sağlansın diyoruz. Diyoruz ki buradaki enum tipi bir Payment yani ödeme olsun. Close remainder ve Rekey adresini de zero yani boş adrese eşitliyoruz. Bu sıfıra eşitleme, işlemin adres bakiyesini kapatmayacağı anlamına gelir. Bunlar bizim güvenlik şartlarımızdı.

Şimdi alım koşullarını yazıyoruz.

recv_cond = And(

            Txn.receiver() == tmpl_seller,

            tmpl_hash_fn(Arg(0)) == tmpl_secret

        )

Yukarıdaki kodda sadece alıcı fonksiyonuna satıcı bilgisini ve hash fonksiyonunun sıfırıncı argümanı için secret bilgisini girdik. Alıcıya neden satıcı bilgisi girdik diye düşünebilirsiniz. Alıcıdan kasıt parayı alan kişi olduğundan bu kişi satıcı oluyor. Şimdi diğer güvenlik koşulumuzu tanımlayalım. Burada da tam tersi bir durum olacak.

        esc_cond = And(

            Txn.receiver() == tmpl_buyer,

            Txn.first_valid() > Int(tmpl_timeout)

        )

Yukarıdaki koşulda da And işlemi için receiver yani mal veya hizmeti alan kişi, alıcıya eşitlenmiş. İlk durumda parayı alan satıcı var ikinci durumda ise mal veya hizmeti alan alıcı. Burayı karıştırmamak önemli.  Ayrıca alıcı için bir timeout süresi var. Karşı taraf şifreyi veriyor ve bu tarafta bir doğrulama oluyor. Eğer 3 saniye içerisinde bu olmazsa işlem iptal oluyor. Bu kısım güvenlik açısından önemli. Algorand’ın atomik transferlerinde vurguladığı  “ya hep ya hiç” mottosunun arkasında da koddaki tam bu kısım var.

Şimdi ödeme, güvenlik, alıcı ve satıcı koşullarını yazdık. Alt durumlarının tamamının sağlanmasını istediğimizden bunların kendi içlerinde AND kapısı kullandık. Şimdi de bu dört koşulu AND kapısıyla birleştiriyoruz. Fakat önemli bir ayrıntı var. Ödeme ile güvenlik koşulları her durumda sağlanması gerektiği için doğrudan And içerisine yazıyoruz. Satıcı ve alıcı durumlarından ise yalnızca biri sağlanması gerektiği için bunlardan bir tanesini seçecek şekilde Or kapısı kullanarak ana And kapısı içine ekliyoruz.

        return And(

            fee_cond,

            safety_cond,

            Or(recv_cond, esc_cond)

        )

İşte bu kadar !

Bu bizim htlc isimli özel bir fonksiyonumuzdu. Uygulamamızın ana fonksiyonuna birkaç satır kod yazarak bu htlc fonksiyonu üzerinden akıllı kontratımızı oluşturalım.

if __name__ == “__main__”:

    print(compileTeal(htlc(), Mode.Signature))

Ana fonksiyon olan main fonksiyonunda compileTeal diyerek bir derleme işlemi yaptık. Parametre olarak htlc fonksiyonunu ve Mode.Signature ile imzamızı girdik. Kodumuzu çalıştırdığımızda TEAL dilinde akıllı kontratımız aşağıdaki şekilde oluşuyor.

#pragma version 2

txn Fee

int 1000

txn TypeEnum

int pay

==

txn CloseRemainderTo

global ZeroAddress

==

&&

txn RekeyTo

global ZeroAddress

==

&&

&&

txn Receiver

addr 6ZHGHH5Z5CTPCF5WCESXMGRSVK7QJETR63M3NY5FJCUYDHO57VTCMJOBGY

==

arg 0

sha256

byte base32(23232323232323)

==

&&

txn Receiver

addr 7Z5PWO2C6LFNQFGHWKSK5H47IQP5OJW2M3HA2QPXTY3WTNP5NU2MHBW27M

==

txn FirstValid

int 3000

&&

||

&&

Bu sözleşmemizin içinde uygulamamızda kullandığımız; alıcı ve satıcı bilgileri, ödeme limiti, secret değeri, şifreleme türü gibi tüm değerler TEAL dilinde yazılmış durumda.

You may also like...