Güvensiz Yerel Değişim Ticaret Sistemi

This page is machine-translated.
Amitabh Saxena

29 Mayıs 2019

Yerel Değişim Ticaret Sistemi (LETS), yerel ekonomiyi geliştirmeyi amaçlar ve genellikle birbirine yakın bir yerel halk tarafından kullanılır. LETS hakkında kısa bir genel bakış için bu bağlantıya bakabilirsiniz; bu bağlantı, bir komite tarafından yönetilen LETS'in ErgoScript uygulamasını da tanımlar. Böyle bir sisteme yönetilen veya izinli diyoruz, çünkü yeni üyeleri LETS'e kaydetmek için güvenilir üyelerden oluşan bir komiteye bağımlıdır.
Burada güvensiz bir LETS'i tanımlıyoruz, yani kaydolmak için herhangi bir yönetim komitesine ihtiyaç duyulmayan bir sistemi.

Genel Bakış

LETS, genellikle ülkenin ana para birimine 1:1 oranında sabitlenmiş bir "yerel para birimi" kullanmayı kabul eden birkaç tarafı içerir. LETS'imizin Euro'nun kullanıldığı bir Avrupa ülkesinde olduğunu varsayalım ve değişim "yerel Euro" cinsinden yapılır; bu da ulusal Euro'ya eşdeğer kabul edilir.

LETS'teki her kullanıcının, o kullanıcının LETS bakiyesini (Yerel Euro cinsinden) içeren bir hesabı vardır. Katıldığında, her kullanıcının bakiyesi sıfırdır. Bakiye, (muhtemelen merkeziyetsiz) bir defterde saklanır. LETS'in ilginç bir özelliği, sıfır bakiyeye sahip bir kullanıcının da başka bir LETS kullanıcısına ödeme yapmak için para "çekebilmesidir". Herhangi bir zamanda, tüm kullanıcıların LETS bakiyelerinin toplamı sıfırdır.

Örneğin, sıfır bakiyesi olan Alice, sıfır bakiyesi olan LETS üyesi Bob'dan 2 Euro karşılığında bir litre süt satın almak ister. Hesabından Bob'un hesabına 2 Euro transfer eder, böylece bakiyesi -2, Bob'un bakiyesi ise +2 olur. Bob, ardından bakiyesinin bir kısmını veya tamamını başka bir LETS kullanıcısına mal veya hizmet karşılığında transfer edebilir.

Güvensiz LETS

Güvensiz bir LETS istediğimiz için, kullanıcıları kabul etmek için güvenilir bir grup insana bağımlı olamayız. Yine de, LETS parametrelerini (yerel para birimi, maksimum üye sayısı vb.) ayarlamak ve herhangi bir katılım ücretini tüketmek gibi bazı görevleri yerine getirmek için bir komitemiz olacak.

Sadece, bazı küresel kimlik (rateTokenID) ile tanımlanan erglere karşılık gelen mevcut euro oranını veren güvenilir bir fiyat oracle'ı varsayacağız ve bu kimlikle tam olarak bir token içeren bir singleton kutusu olacaktır. Bir singleton kutusu, burada tanımlandığı gibi, yalnızca bir miktar var olan bir singleton token içeren bir kutudur. Bu kutu, belirli bir zaman diliminde erglere karşı euro oranını da içerir. Oran, bu kutuyu harcayarak ve yeni oranla başka bir singleton kutusu oluşturarak güncellenir.

Herhangi bir anda, LETS'imiz, letsTokenID kimliğine sahip bazı üyelik tokenları içeren küresel bir token kutusu ile benzersiz bir şekilde tanımlanır. Bu kutu, LETS parametrelerini (konum, para birimi birimi, rateTokenID vb.) tanımlar. Token kutusu başlangıçta, diyelim ki, 10000 üyelik tokeni ile başlatılır. Kullanıcılar, bu kutuyu harcayabilir ve her bir çıktının tam olarak bir üyelik tokeni ve bakiye üyelik tokenlerinin yeni oluşturulan bir token kutusuna konulmasıyla kendi bireysel LETS kutularını oluşturabilir.

Bir LETS kutusu, bir LETS üyesini temsil eder ve her işlemde kullanılmalıdır. Basitlik açısından, bu makale tüm LETS işlemlerinin tam olarak iki üye içermesi gerektiğini kısıtlar; biri gönderici, diğeri alıcıdır, böylece gönderici, alıcıya LETS para biriminden (yerel euro) pozitif bir miktar transfer eder. Böyle bir işlem, üyenin kutularını tüketir ve güncellenmiş bakiye ile çıktılar olarak yeniden oluşturur.

Temel Varyant

Spam ve DDoS saldırılarını önlemek için, yeni oluşturulan üyenin kutusunda en az bir miktar erg (minErgsToJoin) kilitlenmiş olmalıdır. Erglere, en az minWithdrawTime blok sayısı çıkarılana kadar kilitlenmiş kalacaktır. Bir kutunun, kilitlenmiş erglere karşılık gelen miktara kadar negatif bir LETS bakiyesine sahip olmasına izin verilir (ticaret anındaki oran kullanılarak).

// bir tokenBox, üyelik tokenlerini saklar ve bu script'e sahiptir
val tokenBox = OUTPUTS(0) // ilk çıktı da bir tokenBox olmalıdır
// ilk çıktı kalan LETS tokenlerini içerir

def isLets(b:Box) = { // b bir LETS kutusuysa true döner
   // Bir LETS kutusu, tokens(0)'da tam olarak 1 üyelik tokenine sahip olmalıdır
   b.tokens(0)._1 == letsTokenID && b.tokens(0)._2 == 1 &&
   blake2b256(b.propositionBytes) == memberBoxScriptHash &&
   SELF.R4[Long].get == 0 && // kutuyu sıfır LETS bakiyesi ile başlat
   b.value >= minErgsToJoin && // kutu en az bir miktar erg içermelidir
   b.R6[Long].get <= HEIGHT // oluşturma yüksekliğini R6'da sakla
}

// tx'de kaç lets kutusu oluşturuldu
val numLetsBoxes = OUTPUTS.filter({(b:Box) => isLets(b)}).size

// İşlemde aşağıdaki, token kutusu için korunur ...
tokenBox.tokens(0)._1 == SELF.tokens(0)._1 &&                //  token kimliği
tokenBox.tokens(0)._2 == SELF.tokens(0)._2 - numLetsBoxes && //  miktar
tokenBox.propositionBytes == SELF.propositionBytes           //  script

Bir LETS üyesinin kutusu, yukarıda kullanılan memberBoxScriptHash ile korunan aşağıdaki script ile korunur. Script, her işlem için tam olarak bir (gönderici, alıcı) çiftini gerektirir.

val validRateOracle = CONTEXT.dataInputs(0).tokens(0)._1 == rateTokenID
val rate = CONTEXT.dataInputs(0).R4[Int].get
val inBalance = SELF.R4[Long].get    // mevcut girdinin LETS bakiyesi
val pubKey = SELF.R5[SigmaProp].get  // mevcut girdinin sahibi
val createdAt = SELF.R6[Long].get    // mevcut girdinin çıkarıldığı yükseklik

val index = getVar[Int](0).get       // karşılık gelen çıktının indeksi
val out = OUTPUTS(index)
val outBalance = out.R4[Long].get    // çıktının LETS bakiyesi

// Bir LETS kutusu, mevcut kutu ile aynı script'e sahip olandır
val isMemberBox = {(b:Box) => b.propositionBytes == SELF.propositionBytes}
val letsInputs = INPUTS.filter(isMemberBox)    // tüm LETS giriş kutuları
val letsOutputs = OUTPUTS.filter(isMemberBox)  // tüm LETS çıkış kutuları

// Mevcut girdi, LETS bakiyesi artarsa alıcıya aittir
// Alıcının giriş kutusunda bazı erglere sahip olabileceğini unutmamalıyız. 
// Alıcının çıkış kutusunun da girişle aynı miktarda erg içermesini sağlamalıyız
val receiver = outBalance > inBalance && out.value == SELF.value

val getBalance = {(b:Box) => b.R4[Long].get} // bir kutunun LETS bakiyesini döner

val letsBalIn = letsInputs.map(getBalance).fold(0L, {(l:Long, r:Long) => l + r})
val letsBalOut = letsOutputs.map(getBalance).fold(0L, {(l:Long, r:Long) => l + r})

// gönderici kutusu daha az miktarda erg içerebilir (gönderici, 
// çıkıştaki herhangi bir negatif LETS bakiyesi yeterli ergle destekleniyorsa erg çekebilir)
val correctErgs = out.value >= -outBalance * rate && (
  out.value >= SELF.value || SELF.R6[Long].get + minWithdrawTime > HEIGHT
)

// alıcı için, erg bakiyesine dokunmuyoruz, 
// çünkü alıcı işlemde aktif olarak yer almaz

inBalance != outBalance && // bazı işlemler olmalı; bakiye değişmelidir
SELF.tokens(0)._1 == letsTokenID && // mevcut girdi doğru token'e sahip
out.tokens(0)._1 == letsTokenID && // karşılık gelen çıkış doğru token'e sahip
validRateOracle &&          // oran sağlayan oracle doğru "oran tokenı"na sahip
letsBalIn == letsBalOut &&  // toplam LETS bakiyesi işlemde korunur
letsInputs.size == 2 && letsOutputs.size == 2 &&  // yalnızca iki LETS girişi, çıkışı
out.propositionBytes == SELF.propositionBytes &&  // çıkış bir LETS kutusudur ...
out.R5[SigmaProp].get == pubKey &&                // ... doğru pub anahtarı ile
out.R6[Long].get == SELF.R6[Long].get &&          // ... ve oluşturma yüksekliği
(receiver ||              // ya mevcut girdi alıcıya aittir ...
  (pubKey && correctErgs) // ... ya da çıkış doğru erglere sahiptir ve işlem imzalanmıştır
)

Yukarıdaki script ile bir kutuyu harcayan işlem gerektirir:

  • Girdilerin ve çıktının LETS bakiyelerinin toplamı korunur
  • İki LETS girişi ve iki LETS çıkışı vardır
  • Kamu anahtarları (R5'te saklanır) karşılık gelen çıkışta korunur
  • Oluşturma yüksekliği (R6'da saklanır) karşılık gelen çıkışta korunur

Bir kamu anahtarının alıcı olduğunu söyleriz, eğer çıktısının LETS bakiyesi, girdisinin bakiyesinden daha yüksekse.

Son koşul, ya giriş ve çıkış kutularının alıcıya ait olmasını (erglerin korunması için), ya da göndericiye ait olmaları durumunda bir imza sağlanmasını ve çıkışın, LETS bakiyesi negatifse gerekli sayıda erg ile desteklenmesini gerektirir. Ayrıca, göndericinin erg bakiyesinin, erglere kilitlendikten sonra en az minWithdrawTime blok sayısı çıkarılana kadar azaltılamayacağını gerektirir.

Yönetilen LETS ile karşılaştırıldığında, yukarıdaki sistemin şu farklılıkları vardır:

  • Üyelik kaydı yok: Yönetilen LETS'in aksine, burada herhangi bir üyelik bilgisi saklamıyoruz.
  • Birden fazla kutu: Bir kişi birden fazla üyelik kutusu oluşturabilir, bu da izinlidir. Sadece herhangi bir negatif bakiyenin, içinde kilitlenmiş olan karşılık gelen sayıda erg ile desteklenmesini gerektiriyoruz.

LETS-1: Sıfır Toplam, Teminat

Yukarıdaki temel varyantı LETS-1 olarak adlandırıyoruz. Aşağıdaki özelliklere sahiptir:

  • Zaman Kilitli Katılım Ücreti: Spam saldırılarını önlemek için, bir üye katılırken belirli bir minimum ücreti ergle ödemelidir. Bu ücret iade edilebilir ancak yalnızca önceden tanımlanmış bir blok sayısından sonra.
  • Sıfır Toplam: Tüm üye kutularının LETS bakiyelerinin toplamı sıfırdır. Üye kutularının, belirli bir limit içinde negatif bir bakiyeye sahip olmalarına izin verilir.
  • Teminat: Göndericinin çıktısı için, mevcut döviz kuru üzerinden negatif LETS bakiyesini karşılamak için ergle teminat olarak kullanılır.

Aşağıdakiler, LETS-1'in bazı varyasyonlarıdır.

LETS-2: Sıfır Toplam, Teminat Yok

Bu, LETS-1'in hafif bir varyasyonudur:

  • İade Edilemeyen Katılım Ücreti: LETS-1'e benzer şekilde, spam saldırılarını önlemek için bir katılım ücreti gereklidir. Ancak, LETS-1'in aksine, bu ücret iade edilemez ve önceden tanımlanmış bir yönetim komitesine gönderilmelidir.
  • Sıfır Toplam: LETS-1'de olduğu gibi.

LETS-3: Pozitif Toplam, Teminat

Yukarıdaki iki varyant, toplam LETS bakiyesinin her zaman sıfır olmasını gerektirir. Burada bu toplam için pozitif bir değer dikkate alıyoruz. Özellikle, bu varyantın aşağıdaki özellikleri vardır:

  • Zaman Kilitli Katılım Ücreti: LETS-1'de olduğu gibi.
  • Pozitif Toplam: Her üyenin LETS bakiyesi her zaman negatif olmamalıdır. Bu, tüm üye kutularının LETS bakiyelerinin toplamının pozitif olmasını sağlar. Başlangıç LETS bakiyesi, mevcut orandaki katılım ücretine dayalı olarak pozitif bir değere ayarlanır ve belirli bir maksimum değere sınırlandırılır.
  • Teminat: Göndericinin erg bakiyesindeki herhangi bir azalma, mevcut döviz kuru üzerinden karşılık gelen LETS bakiyesinin azalmasıyla birlikte olmalıdır.

Ayrıca, bir işlem sırasında LETS bakiyesini artırmak için karşılık gelen miktarda erg eklemeye de izin verebiliriz.

LETS-4: Pozitif Toplam, Teminat Yok

Bu, LETS-3'e benzer ancak bazı küçük varyasyonlarla:

  • İade Edilemeyen Katılım Ücreti: LETS-2'de olduğu gibi
  • Pozitif Toplam: LETS-3'te olduğu gibi

Aşağıdaki tablo varyantları özetlemektedir:

Sıfır ToplamPozitif Toplam
TeminatLETS-1LETS-3
Teminat YokLETS-2LETS-4

Tek bir gönderici-alıcı çiftini içeren LETS işlemlerini inceledik. Daha gelişmiş modeller, birden fazla gönderici ve alıcıya izin verebilir ve çiftler halinde olmaları gerekmez.

Share post

Ergo Altyapı DAO: Ergo Ekosisteminin Omurgasını Merkeziyetsizleştirmek

Ergo Altyapı DAO: Ergo Ekosisteminin Omurgasını Merkeziyetsizleştirmek

Ergo’nun misyonu her zaman merkeziyetsizlikte kök salmıştır, sadece konsensüs katmanında değil, tüm yığın boyunca.

Ergo Platform

13 Ağustos 2025

Mew Finance: Ergo Ekosistemi için Eğlenceli Bir DeFi Araç Seti

Mew Finance: Ergo Ekosistemi için Eğlenceli Bir DeFi Araç Seti

Mew Finance, Ergo Blockchain üzerinde merkeziyetsiz bir uygulama setidir.

Ergo Platform

12 Ağustos 2025

Lithos: Madenciliği On-Chain Havuzlarla Merkeziyetsizleştirmek

Lithos: Madenciliği On-Chain Havuzlarla Merkeziyetsizleştirmek

Lithos, madencilik havuzlarının nasıl çalıştığını köklü bir şekilde değiştirmek için tasarlanmış yeni bir protokoldür; havuzları o.

Ergo Platform

24 Temmuz 2025

Sigma 6.0: Daha Akıllı, Daha Esnek Ergo

Sigma 6.0: Daha Akıllı, Daha Esnek Ergo

Sigma 6.0 Ergo blockchain için önerilen büyük bir güncellemedir.

Ergo Platform

23 Temmuz 2025

Rosen'ın Geleceğini Şekillendirmek: Beş Ana Hazine Teklifi Üzerine Topluluk Çağrısı

Rosen'ın Geleceğini Şekillendirmek: Beş Ana Hazine Teklifi Üzerine Topluluk Çağrısı

Rosen kurucu ortağı Armeanio, Rosen Hazine'sine beş yeni teklif sunmuştur.

Ergo Platform

9 Temmuz 2025

Ergo'nun Genişletilmiş UTXO'su ve Yapay Ekonomik Zekanın Yükselişi

Ergo'nun Genişletilmiş UTXO'su ve Yapay Ekonomik Zekanın Yükselişi

Otonom Ekonomik Ajanlar için Pratik Bir Vizyon Otonom ekonomik ajanlar, Ergo blok zincirinde gerçek bir dijital ekonomide faydalı.

Ergo Platform

12 Mayıs 2025

ErgoHACK X: Ergo Blok Zincirinde Yapay Zeka

ErgoHACK X: Ergo Blok Zincirinde Yapay Zeka

Dağıtık İnovasyonun Onuncu Yılı yıl dönümü ErgoHACK'e katılın ve Ergo blok zincirindeki AI devriminin ön saflarında yer alın! Yara.

Ergo Platform

10 Nisan 2025