Helyi Cserekereskedelmi Rendszer Az Ergo Alapján
2019. április 22.

A helyi cserekereskedelmi rendszer (LETS) egy helyi kölcsönös hitel társulás, amelynek tagjai egyéni alapon hozhatnak létre közös
hitelt, a rendszerben végzett összes tranzakciót egy közös főkönyvbe írják.
Például tegyük fel, hogy Alice, akinek nulla egyenlege van, hajlandó vásárolni egy liter nyers tejet Bobtól.
Először megállapodnak egy árban, például tegyük fel, hogy az ár körülbelül 2 Euro (mivel Alice és Bob
Írországban élnek). Miután a tranzakciót beírták a főkönyvbe, Alice egyenlege -2 (mínusz
kettő) Euro lesz, Bob egyenlege pedig 2 Euro. Ezután Bob elköltheti a 2 Euro-ját, például
házi sörre Charlie-tól. Gyakran az ilyen rendszerek korlátozásokat szabnak a negatív egyenlegekre, és néha
még a pozitívokra is, hogy elősegítsék a közösségen belüli cserét.
Történelmileg az ilyen rendszerek válságidőszakokban váltak népszerűvé. Az első rendszert Michael Linton alapította
a kanadai városban, amely a depresszióval küzdött 1981-ben. A helyi cserekereskedelmi rendszerek rendkívül népszerűek voltak
a 1998-2002-es argentin nagy depresszió alatt. A legtöbb LETS csoport 50 és 250 tag között mozog, papíralapú hiteljegyekkel és
főkönyvvel, amelyet egy magbizottság tart fenn. Azonban a papíralapú LETS valuták néhány problémát mutattak, mint például
hamisítványok, a rendszerkezelők lehetséges rosszindulatú viselkedése, és így tovább. Ezért a blokklánc-alapú LETS felülmúlhatja
a régi rendszereket. További információk a LETS-ről találhatók a
"A Pénz Ökológiája" könyvben (Richard Douthwaite-től) és
Wikipedia.
Ebben a cikkben bemutatjuk, hogyan lehet a LETS-t megvalósítani az Ergo alapjain. Tudomásunk szerint ez az
első ilyen közösségi valuta megvalósítása blokklánc alapjain.
Referencia megvalósításunk
simple és két szerződésből áll, nevezetesen egy menedzsment szerződésből és egy csere szerződésből.
Átugorjuk az Ergo előkészületeit, ezért kérjük, olvassa el
a ICO cikket és
ErgoScript oktatóanyagokat (alap és
haladó) kezdőknek.
Mindazonáltal be fogunk vezetni néhány új kifejezést a következő mondatokban.
Ha egy tokent egyenlő mennyiségben bocsátanak ki, azt singleton tokennek nevezzük. Hasonlóképpen,
a dobozt, amely tartalmazza a singleton tokent, singleton doboznak nevezzük.
A menedzsment szerződés egy singleton dobozt irányít, amely a LETS rendszer tagjait tartalmazza.
A szerződés lehetővé teszi új tagok hozzáadását egy tranzakciónként egy tag ütemezésével. A doboz
nem tárolja a tagokat, hanem csak egy kis összefoglalót az azonosított adatstruktúráról, amely a
tagok könyvtárán alapul. Egy tag egy singleton tokenhez kapcsolódik, amelyet egy tranzakció bocsátott ki, amely
hozzáadja a tagot a könyvtárhoz. A tranzakció létrehoz egy új tag dobozt, amely tartalmazza
a tag singleton tokenjét. A tag doboza védve van a csere szerződés által. Ezenkívül az újonnan
létrehozott tag doboz kezdeti egyenlege a R4 regiszterbe van beírva, és az egyenleg
egyenlő nullával a példánkban. Az új tag létrehozására irányuló tranzakciónak bizonyítékot kell szolgáltatnia a
könyvtár átalakításának helyességéről.
A menedzsment szerződés dobozát általában egy bizottság irányítja, és a bizottság idővel fejlődhet. Ennek támogatására
engedjük meg, hogy a bizottsági logika a R5 regiszterben található.
Például tegyük fel, hogy egy új bizottsági tagot adtak hozzá egy új LETS taggal együtt,
a bemeneti menedzsment szerződés dobozának 2-ből 3 aláírást kell kérnie, és a kimeneti doboznak 3-ból 4 aláírást kell kérnie.
Ebben az esetben az R5 regiszter tartalma a bemeneti és a kimeneti dobozban eltérne.
Az ErgoScript menedzsment szerződés kódja megjegyzésekkel együtt az alábbiakban található. Kérjük, vegye figyelembe, hogy
"userContractHash" a csere szerződés hash-éről szól.
val selfOut = OUTPUTS(0)
// Menedzsment szkript
val managementScript = selfOut.R5[SigmaProp].get
// A menedzsment szkript sablon megismétli önmagát, és a menedzsment szkript teljesül
val scriptCorrect = (selfOut.propositionBytes == SELF.propositionBytes) && managementScript
// Egy költési tranzakció dobozokat hoz létre a könyvtárhoz, felhasználóhoz, díjhoz.
val outsSizeCorrect = OUTPUTS.size == 3
// Ellenőrzi, hogy a menedzsment címke token megismétli önmagát
val outTokenCorrect = (selfOut.tokens.size == 1) && (selfOut.tokens(0)._1 == letsToken)
// Ellenőrzi, hogy új token került kibocsátásra, és annak mennyisége helyes
// OUTPUTS(0) tokenek már ellenőrizve az outtokenCorrect által
val issuedTokenId = INPUTS(0).id
val userOut = OUTPUTS(1)
val correctTokenAmounts =
(userOut.tokens.size == 1 &&
userOut.tokens(0)._1 == issuedTokenId &&
userOut.tokens(0)._2 == 1 &&
OUTPUTS(2).tokens.size == 0 &&
outTokenCorrect)
// Ellenőrzi, hogy az új felhasználó nulla egyenleggel jött létre
val zeroUserBalance = userOut.R4[Long].get == 0
val properUserScript = blake2b256(userOut.propositionBytes) == userContractHash
// Ellenőrzi, hogy az új token azonosító hozzá lett adva a könyvtárhoz
val selfTree = SELF.R4[AvlTree].get
val toAdd: Coll[(Coll[Byte], Coll[Byte])] = Coll((issuedTokenId, Coll[Byte]()))
val proof = getVar[Coll[Byte]](1).get
val modifiedTree = selfTree.insert(toAdd, proof).get
val expectedTree = selfOut.R4[AvlTree].get
val treeCorrect = modifiedTree == expectedTree
correctTokenAmounts && scriptCorrect && treeCorrect && zeroUserBalance && properUserScript
correctTokenAmounts && scriptCorrect && treeCorrect && zeroUserBalance && properUserScript correctTokenAmounts && scriptCorrect && treeCorrect && zeroUserBalance && properUserScript
A csere szerződés szkriptje meglehetősen egyszerű, és az alábbiakban található, megjegyzésekkel, amelyek leírják a logikáját. A
szerződésben feltételezzük, hogy egy költési tranzakció egy csere szerződés dobozhoz legalább két bemenetet kap,
a két első bemenetet a csere szerződés szkriptje védi, és LETS tag tokeneket kell tartalmaznia. Annak ellenőrzésére,
hogy a bemeneti singleton tag tokenek valóban a LETS rendszerhez tartoznak, egy költési tranzakció a menedzsment
szerződés dobozát adja meg első olvasásra, és bizonyítékot kell szolgáltatnia arra, hogy a tag tokenek valóban a
könyvtárhoz tartoznak, amelyet a menedzsment szerződés doboz R4 regisztere hitelesít. A "letsToken" a szkriptben a
menedzsment doboz singleton tokenjéről szól.
// Minimális egyenleg, amely megengedett a LETS kereskedő számára
val minBalance = -20000
val lookupProof = getVar[Coll[Byte]](1).get
// Az olvasásra szánt doboz, amely tartalmazza a LETS tagok könyvtárát
val treeHolderBox = CONTEXT.dataInputs(0)
val properLetsToken = treeHolderBox.tokens(0)._1 == letsToken
val membersTree = treeHolderBox.R4[AvlTree].get
// Egy költési tranzakció két LETS tag dobozát veszi, akik hajlandóak üzletet kötni,
// és módosított egyenlegű dobozokat ad vissza.
val participant0 = INPUTS(0)
val participant1 = INPUTS(1)
val participantOut0 = OUTPUTS(0)
val participantOut1 = OUTPUTS(1)
// Ellenőrzi, hogy a tagok valóban a LETS-hez tartoznak-e
val token0 = participant0.tokens(0)._1
val token1 = participant1.tokens(0)._1
val memberTokens = Coll(token0, token1)
val membersExist = membersTree.getMany(memberTokens, lookupProof).forall({ (o: Option[Coll[Byte]]) => o.isDefined })
// Ellenőrzi, hogy a LETS tag egyenlegének változása az üzlet során helyes-e
val initialBalance0 = participant0.R4[Long].get
val initialBalance1 = participant1.R4[Long].get
val finishBalance0 = participantOut0.R4[Long].get
val finishBalance1 = participantOut1.R4[Long].get
val diff0 = finishBalance0 - initialBalance0
val diff1 = finishBalance1 - initialBalance1
val diffCorrect = diff0 == -diff1
val balancesCorrect = (finishBalance0 > minBalance) && (finishBalance1 > minBalance) && diffCorrect
// Ellenőrzi, hogy a tag dobozok megőrzik-e a szkriptjeiket.
// todo: optimalizálás itt lehetséges
val script0Saved = participantOut0.propositionBytes == participant0.propositionBytes
val script1Saved = participantOut1.propositionBytes == participant1.propositionBytes
val scriptsSaved = script0Saved && script1Saved
// Tag-specifikus dobozvédelem
val selfPubKey = SELF.R5[SigmaProp].get
selfPubKey && properLetsToken && membersExist && diffCorrect && scriptsSaved
Ne feledje, hogy mindkét szerződés sokféleképpen módosítható, hogy új rendszereket kapjunk különböző tulajdonságokkal. Remélhetőleg
a jövőben ez a cikk folytatódik!
Share post
2025. augusztus 13.
2025. augusztus 12.
2025. július 9.
2025. május 12.






