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özeli emberei 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 alapul, 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 nulla egyenleggel. Ő 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 egyenlegének egy részét vagy egészé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ó árképző orákulumot 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 dobozt, amely pontosan egy tokent tartalmaz ezzel az azonosítóval. A singleton doboz, amelyet itt írtunk le, egy singleton tokent tartalmaz, azaz egy tokent, amelyből csak egy mennyiség létezik. Ez a doboz az ergok és eurók árfolyamát is tartalmazza bármely adott időszakban. Az árfolyamot a doboz felhasználásával frissítjük, és egy új singleton dobozt hozunk létre az új árfolyammal.

Bármely pillanatban a LETS-t egy globális token doboz határozza meg, amely tartalmaz néhány tagsági tokent az letsTokenID azonosítóval. Ez a doboz határozza meg a LETS paramétereit, mint például a helyszín, a valutaegység, rateTokenID stb. A token doboz kezdetben például 10000 tagsági tokennel indul. A felhasználók felhasználhatják ezt a dobozt, és létrehozhatják saját egyéni LETS dobozaikat a tranzakció kimeneteként, úgy, hogy minden ilyen kimenet pontosan egy tagsági tokent tartalmaz, a fennmaradó tagsági tokeneket pedig egy újonnan létrehozott token dobozba helyezik.

A LETS doboz 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 arra korlátoz, hogy pontosan két tagot érintsen, 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 dobozait, é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 dobozában. Az ergok zárolva maradnak, amíg legalább minWithdrawTime számú blokkot nem bányásznak. Egy doboz megengedett, hogy negatív LETS egyenlege legyen, ameddig az a zárolt ergok által fedezhető (a kereskedelem időpontjában érvényes árfolyamot használva).

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

def isLets(b:Box) = { // igazat ad vissza, ha b egy LETS doboz
   // Egy LETS doboznak pontosan 1 tagsági tokent kell tartalmaznia a tokens(0)-ban
   b.tokens(0)._1 == letsTokenID && b.tokens(0)._2 == 1 &&
   blake2b256(b.propositionBytes) == memberBoxScriptHash &&
   SELF.R4[Long].get == 0 && // kezdje a dobozt nulla LETS egyenleggel
   b.value >= minErgsToJoin && // a doboznak 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 doboz jött létre a tx-ben
val numLetsBoxes = OUTPUTS.filter({(b:Box) => isLets(b)}).size

// A tranzakcióban a következő megmarad a token doboz 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           //  szkript

A LETS tag dobozát az alábbi szkript védi, amelynek hash-e memberBoxScriptHash, és amelyet fent használtunk. A szkript 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

// Egy LETS doboz az, amelynek ugyanaz a szkriptje, mint a jelenlegi doboznak
val isMemberBox = {(b:Box) => b.propositionBytes == SELF.propositionBytes}
val letsInputs = INPUTS.filter(isMemberBox)    // minden LETS bemeneti doboz
val letsOutputs = OUTPUTS.filter(isMemberBox)  // minden LETS kimeneti doboz

// A jelenlegi bemenet a fogadóhoz tartozik, ha a LETS egyenlege nő
// Lehet, hogy van néhány erg a fogadó bemeneti dobozában. Biztosítanunk kell, hogy
// a fogadó kimeneti doboza 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 doboz 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ő doboz 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ó számára 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 meg kell lennie a megfelelő token
out.tokens(0)._1 == letsTokenID && // a megfelelő kimenetnek meg kell lennie a megfelelő token
validRateOracle &&          // az árfolyamot biztosító orákulumnak meg kell lennie 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 doboz ...
out.R5[SigmaProp].get == pubKey &&                // ... a megfelelő nyilvános kulccsal
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 szkripttel rendelkező doboz felhasználásával végrehajtott 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 bemenetek és kimenetek dobozai 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 az ergok zárolása után.

A kezelt LETS-hez képest a fenti rendszernek a következő eltérései vannak:

  • Nincs tagsági nyilvántartás: A kezelt LETS-szel ellentétben itt nem tárolunk tagsági információt.
  • Több doboz: Egy személy több tagsági dobozt 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ített 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 tagsági dobozok LETS egyenlegének összege nulla. A tagsági dobozoknak megengedett, hogy negatív egyenlegük legyen, ameddig az egy bizonyos határon belül van.
  • Kölcsön: A küldő kimenetéhez az ergokat kölcsönként használják a negatív LETS egyenleg fedezésére az aktuális árfolyamon.

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 el kell küldeni egy előre meghatározott menedzsment bizottságnak.
  • 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 egy 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ített Csatlakozási Díj: Mint a LETS-1-ben.
  • Pozitív Összeg: Minden tagnak a LETS egyenlege mindig nem negatívnak kell lennie. Ez biztosítja, hogy a tagsági dobozok LETS egyenlegének összege pozitív legyen. A kezdeti LETS egyenleg egy pozitív értékre van beállítva a csatlakozási díj alapján az aktuális árfolyamon, egy maximális értékig korlátozva.
  • Kölcsön: A küldő erg egyenlegének bármilyen csökkentése mellett a megfelelő LETS egyenleg csökkentésének is meg kell történnie az aktuális árfolyamon.

A tranzakció során a LETS egyenleg feltöltése is megengedett 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.