Egy Bizalom nélküli Helyi Cserekereskedelmi Rendszer

This page is machine-translated.
Amitabh Saxena

2019. május 29.

A Helyi Cserekereskedelmi Rendszer (LETS) célja a helyi gazdaság fejlesztése, és általában egy hely közösségének tagjai használják. A LETS rövid áttekintéséhez lásd ezt a linket, amely egy bizottság által kezelt LETS ErgoScript megvalósítását is leírja. Az ilyen rendszert kezelt vagy engedélyezett rendszernek nevezzük, mivel egy megbízható tagokból álló bizottságra támaszkodik az új tagok LETS-be való felvételéhez.
Itt egy bizalom nélküli LETS-t írunk le, azaz egyet, ahol nincs szükség menedzsment bizottságra a felvételhez.

Áttekintés

A LETS több felet foglal magában, akik egyfajta "helyi valutát" használnak, amely általában az ország fő valutájához 1:1 arányban van kötve. Tegyük fel, hogy a LETS egy európai országban működik, ahol a valuta euró, és a csere "helyi eurókban" történik, amelyek nemzeti eurónak felelnek meg.

Minden LETS felhasználónak van egy fiókja, amely tartalmazza a felhasználó LETS egyenlegét (helyi eurókban). A csatlakozáskor minden felhasználónak nulla egyenlege van. Az egyenleg egy (esetleg decentralizált) főkönyvben van tárolva. A LETS egyik érdekes jellemzője, hogy egy nulla egyenlegű felhasználó is "kivehet" pénzt, de csak egy másik LETS felhasználó kifizetésére. Bármikor a felhasználók LETS egyenlegének összege nulla.

Például Alice, akinek nulla egyenlege van, szeretne vásárolni egy liter tejet 2 euróért Bobtól, aki szintén a LETS tagja és nulla egyenlege van. Ő 2 eurót utal át a fiókjából Bob fiókjába, így az ő egyenlege -2, Bobé pedig +2. Bob ezután átutalhatja egyes vagy az összes egyenlegét egy másik LETS felhasználónak áruk vagy szolgáltatások ellenében.

Bizalom nélküli LETS

Mivel bizalom nélküli LETS-t szeretnénk, nem támaszkodhatunk megbízható emberek csoportjára a felhasználók felvételére. Vegyük figyelembe, hogy továbbra is lesz egy bizottság, amely bizonyos feladatokat végez, például a LETS paramétereinek (helyi valuta, maximális taglétszám stb.) beállítását és a csatlakozási díj felhasználását.

Csak egy megbízható árfolyam oracle-t feltételezünk, amely megadja az eurók és ergok aktuális árfolyamát, amelyet egy globális azonosító (rateTokenID) azonosít, és egy singleton boxot, amely pontosan egy tokent tartalmaz ezzel az azonosítóval. A singleton box, amelyet itt írtunk le, egy singleton tokent tartalmaz, azaz egy tokent, amelyből csak egy mennyiség létezik. Ez a box tartalmazza az ergok és eurók árfolyamát bármely adott időszakban. Az árfolyam frissül, amikor ezt a boxot elköltjük, és létrehozunk egy másik singleton boxot az új árfolyammal.

Bármely pillanatban a LETS-t egy globális token box határozza meg, amely tartalmaz néhány tagsági tokent letsTokenID azonosítóval. Ez a box határozza meg a LETS paramétereit, mint például a helyszín, a valutaegység, rateTokenID stb. A token boxot kezdetben például 10000 tagsági tokennel indítjuk. A felhasználók ezt a boxot elkölthetik, és létrehozhatják saját egyéni LETS boxaikat a tranzakció kimeneteként, úgy, hogy minden ilyen kimenet pontosan egy tagsági tokent tartalmaz, a fennmaradó tagsági tokenek pedig egy újonnan létrehozott token boxba kerülnek.

A LETS box egy LETS tagot képvisel, és minden tranzakcióban használni kell. Az egyszerűség kedvéért ez a cikk minden LETS tranzakciót két tagra korlátoz, az egyik a küldő, a másik a fogadó, úgy, hogy a küldő egy pozitív mennyiségű LETS valutát (helyi eurót) utal át a fogadónak. Az ilyen tranzakció felhasználja a tag boxait, és újra létrehozza őket a frissített egyenleggel.

Az Alapváltozat

A spam és DDoS támadások megelőzése érdekében legalább néhány minimális mennyiségű ergot (minErgsToJoin) kell zárolni az újonnan létrehozott tag boxában. Az ergok zárolva maradnak, amíg legalább minWithdrawTime számú blokkot nem bányásznak. Egy boxnak megengedett, hogy negatív LETS egyenlege legyen a zárolt ergok által fedezett összegig (a kereskedelem időpontjában érvényes árfolyam alapján).

// a tokenBox tárolja a tagsági tokeneket és ezt a scriptet tartalmazza
val tokenBox = OUTPUTS(0) // az első kimenetnek is tokenBoxnak kell lennie
// az első kimenet tartalmazza a fennmaradó LETS tokeneket

def isLets(b:Box) = { // igazat ad vissza, ha b egy LETS box
   // A LETS boxnak pontosan 1 tagsági tokennel kell rendelkeznie a tokens(0)-ban
   b.tokens(0)._1 == letsTokenID && b.tokens(0)._2 == 1 &&
   blake2b256(b.propositionBytes) == memberBoxScriptHash &&
   SELF.R4[Long].get == 0 && // a boxot nullás LETS egyenleggel indítjuk
   b.value >= minErgsToJoin && // a boxnak tartalmaznia kell néhány minimális ergot
   b.R6[Long].get <= HEIGHT // tárolja a létrehozás magasságát az R6-ban
}

// hány lets boxot hoztak létre a tx-ben
val numLetsBoxes = OUTPUTS.filter({(b:Box) => isLets(b)}).size

// A tranzakcióban a következő megmarad a token box számára ...
tokenBox.tokens(0)._1 == SELF.tokens(0)._1 &&                //  token azonosító
tokenBox.tokens(0)._2 == SELF.tokens(0)._2 - numLetsBoxes && //  mennyiség
tokenBox.propositionBytes == SELF.propositionBytes           //  script

A LETS tag boxát az alábbi script védi, amelynek hash-e memberBoxScriptHash, és amelyet fent használtunk. A script pontosan egy (küldő, fogadó) párt igényel tranzakciónként.

val validRateOracle = CONTEXT.dataInputs(0).tokens(0)._1 == rateTokenID
val rate = CONTEXT.dataInputs(0).R4[Int].get
val inBalance = SELF.R4[Long].get    // a jelenlegi bemenet LETS egyenlege
val pubKey = SELF.R5[SigmaProp].get  // a jelenlegi bemenet tulajdonosa
val createdAt = SELF.R6[Long].get    // a magasság, amelyen a jelenlegi bemenetet bányászták

val index = getVar[Int](0).get       // a megfelelő kimenet indexe
val out = OUTPUTS(index)
val outBalance = out.R4[Long].get    // a kimenet LETS egyenlege

// A LETS box az, amelynek ugyanaz a scriptje, mint a jelenlegi boxnak
val isMemberBox = {(b:Box) => b.propositionBytes == SELF.propositionBytes}
val letsInputs = INPUTS.filter(isMemberBox)    // minden LETS bemeneti box
val letsOutputs = OUTPUTS.filter(isMemberBox)  // minden LETS kimeneti box

// A jelenlegi bemenet a fogadóhoz tartozik, ha a LETS egyenlege nő
// Lehet, hogy van néhány erg a fogadó bemeneti boxában. Biztosítanunk kell, hogy
// a fogadó kimeneti boxa is tartalmazza ugyanazt az erg mennyiséget, mint a bemenet
val receiver = outBalance > inBalance && out.value == SELF.value

val getBalance = {(b:Box) => b.R4[Long].get} // visszaadja a box LETS egyenlegét

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})

// a küldő box kevesebb ergot tartalmazhat (a küldő visszavonhat ergokat, feltéve, hogy
// a kimenetben a küldő bármely negatív LETS egyenlege elegendő ergokkal van fedezve)
val correctErgs = out.value >= -outBalance * rate && (
  out.value >= SELF.value || SELF.R6[Long].get + minWithdrawTime > HEIGHT
)

// a fogadó esetében nem érintjük az erg egyenleget, 
// mivel a fogadó nem vesz részt aktívan a tranzakcióban

inBalance != outBalance && // valamilyen tranzakciónak meg kell történnie; az egyenlegnek változnia kell
SELF.tokens(0)._1 == letsTokenID && // a jelenlegi bemenetnek megvan a megfelelő tokenje
out.tokens(0)._1 == letsTokenID && // a megfelelő kimenetnek megvan a megfelelő tokenje
validRateOracle &&          // az árfolyamot biztosító oracle-nak megvan a megfelelő "árfolyam token"
letsBalIn == letsBalOut &&  // a tranzakcióban a teljes LETS egyenleg megmarad
letsInputs.size == 2 && letsOutputs.size == 2 &&  // csak két LETS bemenet, kimenet
out.propositionBytes == SELF.propositionBytes &&  // a kimenet egy LETS box ...
out.R5[SigmaProp].get == pubKey &&                // ... a megfelelő pub key-jel
out.R6[Long].get == SELF.R6[Long].get &&          // ... és a létrehozás magasságával
(receiver ||              // vagy a jelenlegi bemenet a fogadóhoz tartozik ...
  (pubKey && correctErgs) // ... vagy a kimenetnek helyes ergjei vannak, és a tx-nek van aláírása
)

A fenti scriptet tartalmazó box elköltésére vonatkozó tranzakció megköveteli:

  • A bemenetek és kimenetek LETS egyenlegének összege megmarad
  • Két LETS bemenet és két LETS kimenet van
  • A nyilvános kulcsok (az R5-ben tárolva) megmaradnak a megfelelő kimenetben
  • A létrehozás magassága (az R6-ban tárolva) megmarad a megfelelő kimenetben

Azt mondjuk, hogy egy nyilvános kulcs a fogadó, ha a kimenetének LETS egyenlege magasabb, mint a bemenetéé.

Az utolsó feltétel megköveteli, hogy vagy a bemenet és a kimenet boxai a fogadóhoz tartozzanak (így az ergok megmaradnak), vagy, ha a küldőhöz tartoznak, aláírás szükséges, és a kimenetet a szükséges ergok számával kell fedezni, ha a LETS egyenlege negatív. Továbbá megköveteli, hogy a küldő erg egyenlege nem csökkenthető, amíg legalább minWithdrawTime számú blokkot nem bányásznak a zárolás után.

A kezelt LETS-hez képest a fenti rendszer a következő eltéréseket mutatja:

  • Nincs tagsági nyilvántartás: A kezelt LETS-szel ellentétben itt nem tárolunk tagsági információt.
  • Több box: Egy személy több tagsági boxot hozhat létre, ami megengedett. Csak azt követeljük meg, hogy bármely negatív egyenleget a megfelelő számú zárolt erg fedezze.

LETS-1: Zéró Összeg, Kölcsön

A fenti az alapváltozat, amelyet LETS-1-nek hívunk. A következő jellemzőkkel rendelkezik:

  • Időzáras Csatlakozási Díj: A spam támadások megelőzése érdekében a tagnak egy bizonyos minimális díjat kell fizetnie ergokban a csatlakozáskor. Ez a díj visszatéríthető, de csak egy előre meghatározott számú blokk után.
  • Zéró Összeg: A LETS egyenlegek összege minden tagsági boxban nulla. A tagsági boxoknak megengedett, hogy negatív egyenlegük legyen, amennyiben az egy bizonyos határon belül van.
  • Kölcsön: A küldő kimenetéhez az ergok kölcsönként használatosak a jelenlegi árfolyamon a negatív LETS egyenleg fedezésére.

A következők a LETS-1 néhány változata.

LETS-2: Zéró Összeg, Nincs Kölcsön

Ez a LETS-1 enyhe változata a következőképpen:

  • Nem visszatéríthető csatlakozási díj: A LETS-1-hez hasonlóan csatlakozási díj szükséges a spam támadások megelőzésére. Azonban a LETS-1-től eltérően ez a díj nem visszatéríthető, és egy előre meghatározott menedzsment bizottságnak kell elküldeni.
  • Zéró Összeg: Mint a LETS-1-ben.

LETS-3: Pozitív Összeg, Kölcsön

A fenti két változat megköveteli, hogy a LETS egyenleg mindig nulla legyen. Itt pozitív értéket veszünk figyelembe erre az összegre. Különösen, ennek a változatnak a következő tulajdonságai vannak:

  • Időzáras Csatlakozási Díj: Mint a LETS-1-ben.
  • Pozitív Összeg: Minden tag LETS egyenlege mindig nem negatívnak kell lennie. Ez biztosítja, hogy a LETS egyenlegek összege minden tagsági boxban pozitív legyen. A kezdeti LETS egyenleg egy pozitív értékre van beállítva a csatlakozási díj alapján a jelenlegi árfolyamon, egy maximális értékig korlátozva.
  • Kölcsön: A küldő erg egyenlegének bármilyen csökkentése a jelenlegi árfolyamon a megfelelő LETS egyenleg csökkentésével kell, hogy járjon.

A LETS egyenleg feltöltése is megengedett egy tranzakció során az ergok megfelelő mennyiségének hozzáadásával.

LETS-4: Pozitív Összeg, Nincs Kölcsön

Ez hasonló a LETS-3-hoz, de néhány apró eltéréssel:

  • Nem visszatéríthető Csatlakozási Díj: Mint a LETS-2-ben
  • Pozitív Összeg: Mint a LETS-3-ban

A következő táblázat összegzi a változatokat:

Zéró ÖsszegPozitív Összeg
KölcsönLETS-1LETS-3
Nincs kölcsönLETS-2LETS-4

A LETS tranzakciókat egyetlen küldő-fogadó párra vonatkozóan vizsgáltuk. Fejlettebb modellek lehetővé tehetik több küldő és fogadó részvételét, és nem szükséges, hogy párokban legyenek.

Share post

Ergo Infrastructure DAO: Az Ergo Ökoszisztéma Gerincének Decentralizálása

Ergo Infrastructure DAO: Az Ergo Ökoszisztéma Gerincének Decentralizálása

Az Ergo küldetése mindig is a decentralizáción alapult, nemcsak a konszenzus rétegén, hanem az egész stack-en.

Ergo Platform

2025. augusztus 13.

Mew Finance: Egy Játékos DeFi Eszközkészlet az Ergo Ökoszisztémához

Mew Finance: Egy Játékos DeFi Eszközkészlet az Ergo Ökoszisztémához

A Mew Finance egy decentralizált alkalmazáscsomag az Ergo Blockchain-en.

Ergo Platform

2025. augusztus 12.

Lithos: A Bányászat Decentralizálása On-Chain Poolokkal

Lithos: A Bányászat Decentralizálása On-Chain Poolokkal

A Lithos egy új protokoll, amely a bányászati poolok működésének átalakítására készült azáltal, hogy azokat on-chain helyezi, telj.

Ergo Platform

2025. július 24.

Sigma 6.0: Egy Okosabb, Rugalmasabb Ergo

Sigma 6.0: Egy Okosabb, Rugalmasabb Ergo

Sigma 6.0 egy jelentős javasolt frissítés az Ergo blokklánc számára.

Ergo Platform

2025. július 23.

Rosen Jövőjének Formálása: Közösségi Felhívás Öt Kulcsfontosságú Kincstári Javaslatra

Rosen Jövőjének Formálása: Közösségi Felhívás Öt Kulcsfontosságú Kincstári Javaslatra

A Rosen társalapítója, Armeanio, öt új javaslatot nyújtott be a Rosen Kincstárhoz.

Ergo Platform

2025. július 9.

Ergo kibővített UTXO-ja és a mesterséges gazdasági intelligencia felemelkedése

Ergo kibővített UTXO-ja és a mesterséges gazdasági intelligencia felemelkedése

Gyakorlati vízió az autonóm gazdasági ügynökök számára Az autonóm gazdasági ügynökök az Ergo blokkláncon hasznos munkát végeznek .

Ergo Platform

2025. május 12.

ErgoHACK X: Mesterséges Intelligencia az Ergo Blockchain-en

ErgoHACK X: Mesterséges Intelligencia az Ergo Blockchain-en

Ünnepeljük a Decentralizált Innováció Egy Évtizedét Csatlakozz a 10.

Ergo Platform

2025. április 10.