Subgraph Development, 2. rész: Tömbök kezelése és entitások azonosítása

(ProtoFire.io)

(1. rész ) | 2. rész

Ez a blogbejegyzés gyakorlati javaslatokat tartalmaz a tömbök hatékony használatáról és előállításáról Egyedi és hivatkozható entitásazonosítók.

A sorozat 1. részében áttekintést nyújtottunk az algráfokról, hogy a fejlesztők megértsék alapvető struktúrájukat. Ezenkívül megosztottuk az adatok feltérképezésével és összesítésével kapcsolatos ismereteinket is.

Ezúttal egy másik két témát fogunk megvitatni: tömbök kezelése és azonosítók létrehozása egyedi és könnyen hivatkozható entitások számára. A megbeszélés részeként megadjuk ajánlásainkat a tömbök hatékony kezelésére és az entitások megfelelő elnevezésére.

A tömbök hatékony kezelése

Tömbök hozzáadása az entitásokhoz bizonyos esetekben hasznos. Például vannak olyan esetek, amikor meg kell modelleznünk egy adatforrás címlistáját, vagy nyomon kell követnünk egy adott mező múltbeli változásait az idő előrehaladtával. tömbtípusú mező létrehozása az entitástípus-definíción (a schema.graphql fájlban) és egy üres tömb inicializálása, ha új, azonos típusú entitás jön létre. Ha új adatok kerülnek a tömbbe, akkor meg tudjuk tolni az adatokat és menteni tudjuk az entitást. Bár ez intuitívan hangzik, sajnos nem működik.

A tömbök kézi kezelése az algráfokon, különösképpen a fenti forgatókönyv szerint, tartalmaz néhány figyelmeztetést. Amikor egy entitás tömbjéhez fér hozzá, a tulajdonképpen a tömb másolatát kapja meg. Így ha új adatokat ad hozzá és elmenti az entitást, akkor az nem úgy működik, mint várnánk, mivel egyszerűen módosítja a tömb egy példányát, míg az eredeti változatlan marad.

A frissítés érdekében a tényleges tömböt, a tömb másolatát elhelyezhetjük egy változóban, majd módosíthatjuk az adatokat. Ezután beállíthatjuk a változót az entitás új tömbjeként. Így a régi tömböt felváltja a másolat. A tömb frissítésének ezt a folyamatát a következő kód példázza.

// This won"t work
entity.numbers.push(BigInt.fromI32(1))
entity.save()// This will work
let numbers = entity.numbers
numbers.push(BigInt.fromI32(1))
entity.numbers = numbers
entity.save()

Bár a tömböt a fent bemutatott módon frissítheti, ez nem ideális megoldás . A kényelmetlenség mellett van egy másik ok is arra, hogy ne kezeljük manuálisan a tömböket – időutazási lekérdezések. (Olvassa el a sorozat 1. részét, ha többet szeretne megtudni az időutazási lekérdezésekről.)

Csak időutazási lekérdezéseket lehet végrehajtani, mert az algráfok nyomon követik az összes entitás összes változását. idő. Ha sok entitás rendelkezik tömbmezőkkel, amelyek nagyok és gyakran frissülnek, akkor az összes tömb másolatát is tárolni kell. Ez megterheli az algráfot indexelő indexelők teljesítményét és lemezterületét.

Jelenleg a The Graph hosztolt szolgáltatása az egyetlen elérhető indexelő. A jövőben több indexelő csatlakozhat a The Graph decentralizált hálózatának hozzáadásával. Ezek az új indexelők kiválaszthatják, hogy melyik algráfokat indexeljék. Ha az algráfod a tömbök miatt rosszul van optimalizálva, valószínűleg egyetlen indexelő sem fogja felvenni.

A tömbjeink optimalizálásához használhatjuk a @derivedFrom annotáció. Ez a módszer lehetővé teszi, hogy az entitástípusban definiált bármely tömbmezőt automatikusan kitöltsék a meghatározott típusú összes entitás, amely az általunk definiált entitáshoz kapcsolódik. A következő példa a @derivedFrom kommentár használatát mutatja be.

type User @entity {
id: ID! positions: [Position!]! @derivedFrom(field: “user”)
}type Position @entity {
id: ID! user: User! # This is the ID String of the User
}

A fenti példában van egy felhasználó az Position entitások automatikusan létrehozott listájával. Amikor algráfunk kap egy lekérdezést, amely az User entitás pozíció mezőjét kéri, az algráf fordított keresést végez az összes Position típusú entitás számára a User entitáshoz kapcsolódik a user mezőben. Ily módon a kapcsolt entitások azok, amelyeknek az egyik mezőjében más entitások karakterlánc-azonosítója van.

A @derivedFrom kommentár használatával meghatározhatjuk az entitást. írja be a tömbadatainkhoz szükséges típust, határozza meg a tömb levezetésénél használt mezőt, és kapcsolja össze az eredeti entitással az azonosítójukon keresztül. Az is előnye, hogy több adatot (pl. Létrehozás vagy metaadatok frissítése) adhat hozzá a tömbadatokat képviselő entitásokhoz. Mivel ezek teljes értékű entitások, könnyedén frissíthetjük őket azáltal, hogy betöltjük az azonosítóikat ahelyett, hogy a tömbben keresnénk őket.

A @derivedFrom jelöléssel ellátott tömbök kezelése közben. könnyebb, még mindig figyelembe kell venni néhány szempontot.Először is, ez csak egy a sokhoz viszonyban működik. Sok-sok kapcsolatban továbbra is szükségünk van az egyenlet egyik oldalára a tömb kézi kezeléséhez. Másodszor, nem fogja tudni elérni a tömb adatait, miközben az algráf indexelése folyamatban van, mivel a tömb kitöltésre kerül, amikor lekérdezi.

Elnevezés létrehozása egyezmény az entitásazonosítókhoz

A schema.graphql fájlban definiált összes entitást azonosító mező azonosítja, amely karakterláncként ábrázolt ID! típusként deklarálva. Az ID mező fontos, mivel entitások betöltésére, létrehozására és mentésére szolgál.

Mivel az ID mező az entitás azonosításának elsődleges eszköze, mindig egyedi kell legyen. Ennek ellenére az igazolvány egyediségének garantálása nem nehéz. Az indexidő alatt jelen lévő adatok kombinálhatók egyedi azonosítók létrehozásához. A következő kód erre példa.

event.transaction.hash.toHex() + "-" + 
event.logIndex.toString()

Egy esemény (különféle tranzakciók esetén egyedi) tranzakciós kivonatának felvételével és a (z) az adott esemény (amely egy eseményt azonosít egy tranzakción belül), létrehozhatunk egyedi összetett azonosítót. Így azonosíthatunk egy adott entitást más azonos típusú entitások között, feltéve, hogy egyetlen eseményhez csak egyetlen entitás jön létre. Ha szükséges, további adatokat is csatolhatunk, hogy egyedileg azonosítsuk az azonos eseményben létrehozott tetszőleges számú entitást. Például beállíthatunk számlálót minden entitás létrehozásakor, és hozzáfűzhetjük az értéket az újonnan létrehozott entitáshoz.

Bár egyszerű módszer az egyedi azonosítók létrehozására az entitásaink számára, mégis kényelmesnek kell lennünk. törekedjen kiszámítható és hivatkozható azonosítók létrehozására. Ha vannak olyan domainjeink, amelyek a domainünk egy részéhez kapcsolódnak, amelyet valószínűleg a végfelhasználók kérdeznek az azonosítójukon keresztül, akkor létrehozhatunk egy azonosítót, amely hivatkozik arra a tartományra, amelyen dolgozunk.

Példaként vegye fontolóra egy forgatókönyv, ahol egy Account entitást hozunk létre egy DEX algráfon. Ez az Account entitás tárolja a felhasználó egyenlegét, valamint egyéb információkat. Ha az entitásazonosítót a tranzakciós kivonat alapján hozzuk létre, akkor a felhasználó elõször megkeresheti az azt létrehozó tranzakciót, és újra létrehozhatta, de nem lesz intuitív. Jobb alternatíva lenne egy azonosító létrehozása a felhasználó Ethereum címe alapján, és ha szükséges, kombinálná azt valami mással, ami a domain szempontjából releváns. Így egyedileg azonosíthatunk egy adott felhasználói fiókot ugyanazon felhasználó más fiókjaiból.

Összefoglalva, a domainspecifikus adatok nélküli általános egyedi azonosítók hasznosak lehetnek olyan entitások számára, amelyeket nem frissítenek folyamatosan. Ez ideális azon entitások számára, amelyek metaadatok mentésére készültek olyan tartományspecifikus eseményekhez, amelyeket egy fő entitás származtatott tömbjéből fogyasztanak el. Például az általános egyedi azonosítók jobban megfelelnek az átviteleknek, a pénzveréseknek, az írásoknak és a cseréknek.

Másrészt a tartományspecifikus azonosítók ideálisak a fő entitások és minden más entitás számára, amelyek gyakran frissülnek. Valószínűleg Ethereum-cím és néhány más tartományspecifikus azonosító kombinációját használja. A legtöbb esetben egy intelligens szerződés egyedi azonosítókat generál, és naplózza azokat az eseményeken. Ha nem ez a helyzet, tanulmányoznia kell az intelligens szerződést, és meg kell határoznia, hogy mi teszi egyedivé az entitását, és ezeket az adatokat felhasználva létrehozza az azonosítót.

Megjegyzésként a és toHexString() módszerek – amelyeket általában címekből vagy kivonatokból generálnak azonosítókhoz – kisbetűs karakterláncot adnak vissza. Ez azt jelenti, hogy amikor egy algráfból lekérdezzük az entitásokat, akkor a megadott azonosító karakterláncnak kisbetűsnek kell lennie, mivel a lekérdezés a kis- és nagybetűket érzékeli. ed5767194a “>

hivatalos dokumentáció . További részletek a projekt GitHub adattárában is megtalálhatók. A Grafikon aktív és növekvő közösséggel is rendelkezik, amely készen áll segíteni és megválaszolni a felmerülő kérdéseket. Arra bátorítjuk a saját részgráfjainak kidolgozásában érdekelteket, hogy csatlakozzanak a Graph diszkord szerveréhez .

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük