Indexering
Reading time: 24 min
Indexerare är nodoperatörer i The Graph Network som satsar Graph Tokens (GRT) för att tillhandahålla indexering och frågebehandlingstjänster. Indexerare tjänar avgifter för frågor och indexering samt får frågebetalningar som återbetalas enligt en exponentiell återbetalningsfunktion.
GRT som satsas i protokollet är föremål för en tiningperiod och kan drabbas av strykning om indexerare är skadliga och tillhandahåller felaktiga data till applikationer eller om de indexerar felaktigt. Indexerare tjänar också belöningar för delegerat satsning från Delegater, för att bidra till nätverket.
Indexerare väljer subgrafer att indexera baserat på subgrafens kuratersignal, där Curators satsar GRT för att ange vilka subgrafer som är av hög kvalitet och bör prioriteras. Konsumenter (t.ex. applikationer) kan också ställa in parametrar för vilka indexerare som behandlar frågor för deras subgrafer och ange preferenser för pris på frågebetalning.
Teknisk nivå krävs
ADVANCED
Det minsta beloppet för en indexerare är för närvarande inställt på 100 000 GRT.
Frågebetalningsåterbetalningar - Betalningar för att servera frågor i nätverket. Dessa betalningar medieras via tillståndskanaler mellan en indexerare och en gateway. Varje frågebegäran från en gateway innehåller en betalning och det motsvarande svaret är en bevis på giltigheten av frågeresultatet.
Indexeringsbelöningar - Genererade genom en årlig protokollsbredd på 3%, fördelas indexerare som indexerar subgrafdepåer för nätverket.
Indexeringsbelöningar kommer från protokollsinflation som är inställd på en årlig emission på 3%. De fördelas över subgrafer baserat på andelen av all kuratersignal på varje subgraf, och fördelas sedan proportionellt till indexerare baserat på deras tilldelade insats på den subgrafen. En tilldelning måste avslutas med ett giltigt bevis på indexering (POI) som uppfyller de standarder som fastställts av skiljekommittéstadgan för att vara berättigad till belöningar.
Numerous tools have been created by the community for calculating rewards; you'll find a collection of them organized in the . You can also find an up to date list of tools in the #Delegators and #Indexers channels on the . Here we link a integrated with the indexer software stack.
POI:er används i nätverket för att verifiera att en indexerare indexerar de subgrafer de har tilldelat sig. Ett POI för det första blocket i den nuvarande epoken måste lämnas in när en tilldelning stängs för att vara berättigad till indexeringsbelöningar. Ett POI för ett block är en digest för alla entity store-transaktioner för en specifik subgrafdepå fram till och med det blocket.
Tilldelningar ackumulerar kontinuerligt belöningar medan de är aktiva och tilldelade inom 28 epoker. Belöningarna samlas in av indexerarna och distribueras när deras tilldelningar stängs. Det sker antingen manuellt, när indexeraren vill tvinga dem att stängas, eller efter 28 epoker kan en Delegat stänga tilldelningen för indexeraren, men detta resulterar inte i några belöningar. 28 epoker är den maximala tilldelningens livslängd (för närvarande varar en epok i cirka ~24h).
The RewardsManager contract has a read-only function that can be used to check the pending rewards for a specific allocation.
Många av gemenskapens egentillverkade instrument inkluderar värden för väntande belöningar och de kan enkelt kontrolleras manuellt genom att följa dessa steg:
query indexerAllocations {indexer(id: "<INDEXER_ADDRESS>") {allocations {activeForIndexer {allocations {id}}}}}
Använd Etherscan för att anropa getRewards()
:
- För att anropa
getRewards()
:- Expand the 9. getRewards dropdown.
- Ange allocationID i inmatningen.
- Klicka på Fråga-knappen.
Indexerares frågor och tilldelningar kan båda bli föremål för tvister på The Graph under tvisteperioden. Tvisteperioden varierar beroende på typen av tvist. Frågor/erkännanden har en tvistefönster på 7 epocher, medan tilldelningar har 56 epocher. Efter att dessa perioder har passerat kan inga tvister öppnas mot vare sig tilldelningar eller frågor. När en tvist öppnas krävs en insättning av minst 10 000 GRT av Fishermen, som kommer att vara låsta tills tvisten är avslutad och en resolution har lämnats. Fishermen är nätverksdeltagare som öppnar tvister.
Tvister har tre möjliga utfall, liksom insättningen från Fishermen.
- Om tvisten avvisas kommer den GRT som satts in av Fishermen att brännas, och den ifrågasatta Indexern kommer inte att bli straffad.
- Om tvisten avgörs som oavgjord kommer Fishermens insättning att återbetalas, och den ifrågasatta Indexern kommer inte att bli straffad.
- Om tvisten godkänns kommer den GRT som satts in av Fishermen att återbetalas, den ifrågasatta Indexern kommer att bli straffad, och Fishermen kommer att tjäna 50% av den straffade GRT.
Tvister kan ses i gränssnittet på en Indexers profil under fliken Tvister
.
Förfrågningsavgifter samlas in av gateway och fördelas till indexerare enligt den exponentiella rabattfunktionen (se GIP ). Den exponentiella rabattfunktionen föreslås som ett sätt att säkerställa att indexerare uppnår det bästa resultatet genom att troget servera förfrågningar. Den fungerar genom att ge indexerare incitament att allokerar en stor mängd insats (som kan beskäras om de begår fel när de serverar en förfrågan) i förhållande till den mängd förfrågningsavgifter de kan samla in.
När en tilldelning har avslutats är återbetalningarna tillgängliga för Indexern att hämta. Vid hämtning distribueras frågeavgiftsåterbetalningarna till Indexern och deras Delegatorer baserat på frågeavgiftsminskningen och den exponentiella rabattfunktionen.
Värdena queryFeeCut
och indexingRewardCut
är delegationparametrar som Indexern kan sätta tillsammans med cooldownBlocks
för att kontrollera distributionen av GRT mellan Indexern och deras Delegatorer. Se de sista stegen i för anvisningar om att ställa in delegationparametrarna.
-
queryFeeCut - andelen frågeavgiftsåterbetalningar som kommer att distribueras till Indexern. Om detta är inställt på 95% kommer Indexern att få 95% av de frågeavgifter som tjänas när en tilldelning avslutas, medan de andra 5% fördelas till Delegatorerna.
-
indexingRewardCut - andelen indexeringsbelöningar som kommer att distribueras till Indexern. Om detta är inställt på 95% kommer Indexern att få 95% av indexeringsbelöningarna när en tilldelning avslutas, och Delegatorerna kommer att dela de återstående 5%.
Indexers kan skilja sig åt genom att tillämpa avancerade tekniker för att fatta beslut om indexering av subgrafer, men för att ge en allmän idé kommer vi att diskutera flera viktiga metoder som används för att utvärdera subgrafer i nätverket:
-
Kureringssignal - Andelen nätverkskureringssignal som används för en specifik subgraf är en bra indikator på intresset för den subgrafen, särskilt under uppstartsfasen när frågevolymen ökar.
-
Inkassering av frågeavgifter - Historisk data för volymen av frågeavgifter som samlats in för en specifik subgraf är en bra indikator på framtida efterfrågan.
-
Insatsbelopp - Att övervaka beteendet hos andra Indexers eller att titta på andelar av total insats som allokerats till specifika subgrafer kan låta en Indexer övervaka tillgångssidan för subgrafsförfrågningar och identifiera subgrafer som nätverket visar förtroende för eller subgrafer som kan behöva mer tillgång.
-
Subgrafer utan indexeringsbelöningar - Vissa subgrafer genererar inte indexeringsbelöningar huvudsakligen eftersom de använder otillåtna funktioner som IPFS eller eftersom de frågar ett annat nätverk utanför mainnet. Du kommer att se ett meddelande på en subgraf om den inte genererar indexeringsbelöningar.
- Liten - Tillräckligt för att komma igång med att indexera flera subgrafer, kommer sannolikt att behöva utökas.
- Standard - Standardinställning, detta är vad som används i exempelvis k8s/terraform-implementeringsmanifesten.
- Medium - Produktionsindexer som stöder 100 subgrafer och 200-500 förfrågningar per sekund.
- Stor - Förberedd för att indexera alla för närvarande använda subgrafer och att ta emot förfrågningar för relaterad trafik.
Konfiguration | Postgres (CPU:er) | Postgres (minne i GB) | Postgres (disk i TB) | VM:er (CPU:er) | VM:er (minne i GB) |
---|---|---|---|---|---|
Liten | 4 | 8 | 1 | 4 | 16 |
Standard | 8 | 30 | 1 | 12 | 48 |
Medium | 16 | 64 | 2 | 32 | 64 |
Stor | 72 | 468 | 3,5 | 48 | 184 |
-
Operatörplånbok - Att skapa en operatörplånbok är en viktig försiktighetsåtgärd eftersom den möjliggör att en Indexer kan upprätthålla separation mellan sina nycklar som styr insatsen och de som är ansvariga för dagliga operationer. Se för anvisningar.
-
Brandvägg - Endast Indexertjänsten behöver vara offentligt exponerad och särskild uppmärksamhet bör ägnas åt att säkra administrativa portar och databasåtkomst: Graph Node JSON-RPC-gränssnittet (standardport: 8030), Indexerhanterings-API-gränssnittet (standardport: 18000) och PostgreSQL-databasgränssnittet (standardport: 5432) bör inte vara exponerade.
I centrum av en Indexers infrastruktur finns Graph Node, som övervakar de indexerade nätverken, extraherar och laddar data enligt en subgrafdefinition och serverar det som en . Graph Node måste vara ansluten till en endpoint som exponerar data från varje indexerat nätverk; en IPFS-nod för att hämta data; en PostgreSQL-databas för lagring; och Indexer-komponenter som underlättar dess interaktioner med nätverket.
-
PostgreSQL-databas - Huvudlagret för Graph Node, detta är där subgrafdata lagras. Indexertjänsten och agenten använder också databasen för att lagra state channel-data, kostnadsmodeller, indexeringsregler och tilldelningsåtgärder.
-
Dataendpoint - För EVM-kompatibla nätverk måste Graph Node vara ansluten till en endpoint som exponerar en EVM-kompatibel JSON-RPC-API. Detta kan ta form av en enskild klient eller det kan vara en mer komplex konfiguration som balanserar belastningen över flera. Det är viktigt att vara medveten om att vissa subgrafer kan kräva specifika klientfunktioner som arkivläge och/eller parity-spårnings-API.
-
IPFS-nod (version mindre än 5) - Metadata för subgrafdistribution lagras på IPFS-nätverket. Graph Node har huvudsakligen åtkomst till IPFS-noden under subgrafdistributionen för att hämta subgrafmanifestet och alla länkade filer. Nätverksindexer behöver inte hosta sin egen IPFS-nod, en IPFS-nod för nätverket är värd på .
-
Indexertjänst - Hanterar alla nödvändiga externa kommunikationer med nätverket. Delar kostnadsmodeller och indexeringsstatus, skickar frågebegäranden från gateways vidare till en Graph Node och hanterar frågebetalningar via tillståndskanaler med gatewayen.
-
Indexeragent - Underlättar Indexers interaktioner på kedjan, inklusive registrering i nätverket, hantering av subgrafdistributioner till sina Graph Node/noder och hantering av tilldelningar.
-
Prometheus-metrisk server - Graph Node och Indexer-komponenter loggar sina metriska data till metrisk servern.
Observera: För att stödja smidig skalning rekommenderas det att fråge- och indexeringsbekymmer separeras mellan olika uppsättningar noder: frågenoder och indexnoder.
Viktigt: Var försiktig med att offentligt exponera portar - administrativa portar bör vara säkra. Detta inkluderar JSON-RPC för Graph Node och Indexer-hanteringsendpunkterna som beskrivs nedan.
Port | Syfte | Vägar | CLI-argument | Miljövariabel |
---|---|---|---|---|
8000 | GraphQL HTTP-server (för subgraf-förfrågningar) | /subgraphs/id/... /subgraphs/name/.../... | --http-port | - |
8001 | GraphQL WS (för subgraf-prenumerationer) | /subgraphs/id/... /subgraphs/name/.../... | --ws-port | - |
8020 | JSON-RPC (för hantering av distributioner) | / | --admin-port | - |
8030 | Subgrafindexeringsstatus-API | /graphql | --index-node-port | - |
8040 | Prometheus-metrar | /metrics | --metrics-port | - |
Port | Syfte | Vägar | CLI-argument | Miljövariabel |
---|---|---|---|---|
7600 | GraphQL HTTP-server (för betalda subgraf-förfrågningar) | /subgraphs/id/... /status /channel-messages-inbox | --port | INDEXER_SERVICE_PORT |
7300 | Prometheus-metrar | /metrics | --metrics-port | - |
Port | Syfte | Vägar | CLI-argument | Miljövariabel |
---|---|---|---|---|
8000 | Indexerhanterings-API | / | --indexer-management-port | INDEXER_AGENT_INDEXER_MANAGEMENT_PORT |
Obs: Indexers kan alternativt använda AWS, Microsoft Azure eller Alibaba.
- SDK för Google Cloud
- Kubectl kommandoradsverktyg
- Terraform
-
Navigate to the
./terraform
directory, this is where all commands should be executed.
cd terraform
- Autentisera dig med Google Cloud och skapa ett nytt projekt.
gcloud auth loginproject=<PROJECT_NAME>gcloud projects create --enable-cloud-apis $project
-
Använd faktureringssidan i Google Cloud Console för att aktivera fakturering för det nya projektet.
-
Skapa en Google Cloud-konfiguration.
proj_id=$(gcloud projects list --format='get(project_id)' --filter="name=$project")gcloud config configurations create $projectgcloud config set project "$proj_id"gcloud config set compute/region us-central1gcloud config set compute/zone us-central1-a
- Aktivera nödvändiga API:er för Google Cloud.
gcloud services enable compute.googleapis.comgcloud services enable container.googleapis.comgcloud services enable servicenetworking.googleapis.comgcloud services enable sqladmin.googleapis.com
- Skapa ett servicekonto.
svc_name=<SERVICE_ACCOUNT_NAME>gcloud iam service-accounts create $svc_name \--description="Service account for Terraform" \--display-name="$svc_name"gcloud iam service-accounts list# Get the email of the service account from the listsvc=$(gcloud iam service-accounts list --format='get(email)'--filter="displayName=$svc_name")gcloud iam service-accounts keys create .gcloud-credentials.json \--iam-account="$svc"gcloud projects add-iam-policy-binding $proj_id \--member serviceAccount:$svc \--role roles/editor
- Aktivera peering mellan databasen och Kubernetes-klustret som kommer att skapas i nästa steg.
gcloud compute addresses create google-managed-services-default \--prefix-length=20 \--purpose=VPC_PEERING \--network default \--global \--description 'IP Range for peer networks.'gcloud services vpc-peerings connect \--network=default \--ranges=google-managed-services-default
- Skapa en minimal konfigurationsfil för terraformen (uppdatera vid behov).
indexer=<INDEXER_NAME>cat > terraform.tfvars <<EOFproject = "$proj_id"indexer = "$indexer"database_password = "<database passowrd>"EOF
Innan du kör några kommandon, läs igenom och skapa en fil terraform.tfvars
i denna katalog (eller modifiera den som vi skapade i det sista steget). För varje variabel där du vill åsidosätta standardinställningen, eller där du behöver ange ett värde, anger du en inställning i terraform.tfvars
.
- Kör följande kommandon för att skapa infrastrukturen.
# Installera nödvändiga pluginsterraform init# Se plan för resurser som ska skapasterraform plan# Skapa resurserna (räkna med att det tar upp till 30 minuter)terraform apply
Ladda ner autentiseringsuppgifter för det nya klustret till ~/.kube/config
och ange det som din standardkontext.
gcloud container clusters get-credentials $indexerkubectl config use-context $(kubectl config get-contexts --output='name'| grep $indexer)
-
Kopiera katalogen
k8s/overlays
till en ny katalog$dir
och justera postenbases
i$dir/kustomization.yaml
så att den pekar på katalogenk8s/base
. -
Läs igenom alla filer i
$dir
och justera eventuella värden enligt anvisningarna i kommentarerna.
Installera alla resurser med kubectl apply -k $dir
.
is an open source Rust implementation that event sources the Ethereum blockchain to deterministically update a data store that can be queried via the GraphQL endpoint. Developers use subgraphs to define their schema, and a set of mappings for transforming the data sourced from the blockchain and the Graph Node handles syncing the entire chain, monitoring for new blocks, and serving it via a GraphQL endpoint.
-
Rust
-
PostgreSQL
-
IPFS
-
Ytterligare krav för Ubuntu-användare - För att köra en Graph Node på Ubuntu kan några ytterligare paket behövas.
sudo apt-get install -y clang libpg-dev libssl-dev pkg-config
- Starta en PostgreSQL-databasserver
initdb -D .postgrespg_ctl -D .postgres -l logfile startcreatedb graph-node
Nu när alla beroenden är konfigurerade startar du Graph Node:
cargo run -p graph-node --release -- \--postgres-url postgresql://[USERNAME]:[PASSWORD]@localhost:5432/graph-node \--ethereum-rpc [NETWORK_NAME]:[URL] \--ipfs https://ipfs.network.thegraph.com
- Ethereum nod - Som standard kommer docker compose-konfigurationen att använda mainnet: för att ansluta till Ethereum-noden på din värdmaskin. Du kan ersätta detta nätverksnamn och Url genom att uppdatera
docker-compose.yaml
.
- Klona Graph Node och navigera till Docker-katalogen:
git clone https://github.com/graphprotocol/graph-nodecd graph-node/docker
- Endast för Linux-användare - Använd värdens IP-adress istället för
host.docker.internal
idocker-compose.yaml
med hjälp av det medföljande skriptet:
./setup.sh
- Starta en lokal Graph Node som kommer att ansluta till din Ethereum-ändpunkt:
docker-compose up
För att framgångsrikt delta i nätverket krävs nästan konstant övervakning och interaktion, så vi har byggt en uppsättning Typescript-applikationer för att underlätta en Indexers nätverksdeltagande. Det finns tre Indexer-komponenter:
-
Indexeragent - Agenten övervakar nätverket och Indexerens egen infrastruktur och hanterar vilka subgraph-distributioner som indexeras och tilldelas på kedjan och hur mycket som tilldelas till varje.
-
Indexertjänst - Den enda komponenten som behöver exponeras externt, tjänsten vidarebefordrar subgraph-förfrågningar till grafnoden, hanterar tillståndskanaler för förfrågningsbetalningar, delar viktig beslutsinformation till klienter som gatewayer.
-
Indexer CLI - Kommandoradsgränssnittet för att hantera Indexeragenten. Det gör det möjligt för Indexers att hantera kostnadsmodeller, manuella tilldelningar, kö för åtgärder och indexregler.
Indexer-agent och Indexer-service bör placeras tillsammans med din Graph Node-infrastruktur. Det finns många sätt att konfigurera virtuella exekveringsmiljöer för dina Indexer-komponenter; här förklarar vi hur du kör dem på bare-metal med hjälp av NPM-paket eller källkod, eller via Kubernetes och Docker på Google Cloud Kubernetes Engine. Om dessa installations exempel inte passar bra för din infrastruktur kommer det sannolikt att finnas en gemenskapsråd att använda som referens, kom och säg hej på ! Kom ihåg att innan du startar dina Indexer-komponenter!
npm install -g @graphprotocol/indexer-servicenpm install -g @graphprotocol/indexer-agent# Indexer CLI är ett plugin för Graph CLI, så båda måste installeras:npm install -g @graphprotocol/graph-clinpm install -g @graphprotocol/indexer-cli# Indexeringstjänstgraph-indexer-service start ...# Indexerare agentgraph-indexer-agent start ...# CLI för indexerare#Vidarebefordra porten till din agent-pod om du använder Kuberneteskubectl port-forward pod/POD_ID 18000:8000graph indexer connect http://localhost:18000/graph indexer ...
# Från Repos rotkatalogyarn# Indexeringstjänstcd packages/indexer-service./bin/graph-indexer-service start ...# Indexerare agentcd packages/indexer-agent./bin/graph-indexer-service start ...# Indexer CLIcd packages/indexer-cli./bin/graph-indexer-cli indexer connect http://localhost:18000/./bin/graph-indexer-cli indexer ...
- Hämta bilder från registret
docker pull ghcr.io/graphprotocol/indexer-service:latestdocker pull ghcr.io/graphprotocol/indexer-agent:latest
Eller skapa bilder lokalt från källkod
# Indexer servicedocker build \--build-arg NPM_TOKEN=<npm-token> \-f Dockerfile.indexer-service \-t indexer-service:latest \# Indexer agentdocker build \--build-arg NPM_TOKEN=<npm-token> \-f Dockerfile.indexer-agent \-t indexer-agent:latest \
- Kör komponenterna
docker run -p 7600:7600 -it indexer-service:latest ...docker run -p 18000:8000 -it indexer-agent:latest ...
OBS: Efter att ha startat containrarna bör Indexertjänsten vara åtkomlig på och Indexeragenten bör exponera Indexerhanterings-API:et på .
OBS: Alla körtidskonfigurationsvariabler kan antingen tillämpas som parametrar till kommandot vid start eller med miljövariabler i formatet COMPONENT_NAME_VARIABLE_NAME
(ex. INDEXER_AGENT_ETHEREUM
).
graph-indexer-agent start \--ethereum <MAINNET_ETH_ENDPOINT> \--ethereum-network mainnet \--mnemonic <MNEMONIC> \--indexer-address <INDEXER_ADDRESS> \--graph-node-query-endpoint http://localhost:8000/ \--graph-node-status-endpoint http://localhost:8030/graphql \--graph-node-admin-endpoint http://localhost:8020/ \--public-indexer-url http://localhost:7600/ \--indexer-geo-coordinates <YOUR_COORDINATES> \--index-node-ids default \--indexer-management-port 18000 \--metrics-port 7040 \--network-subgraph-endpoint http://query-node-0:8000/subgraphs/id/QmUzRg2HHMpbgf6Q4VHKNDbtBEJnyp5JWCh2gUX9AV6jXv \--default-allocation-amount 100 \--register true \--inject-dai true \--postgres-host localhost \--postgres-port 5432 \--postgres-username <DB_USERNAME> \--postgres-password <DB_PASSWORD> \--postgres-database indexer \--allocation-management auto \| pino-pretty
SERVER_HOST=localhost \SERVER_PORT=5432 \SERVER_DB_NAME=is_staging \SERVER_DB_USER=<DB_USERNAME> \SERVER_DB_PASSWORD=<DB_PASSWORD> \graph-indexer-service start \--ethereum <MAINNET_ETH_ENDPOINT> \--ethereum-network mainnet \--mnemonic <MNEMONIC> \--indexer-address <INDEXER_ADDRESS> \--port 7600 \--metrics-port 7300 \--graph-node-query-endpoint http://localhost:8000/ \--graph-node-status-endpoint http://localhost:8030/graphql \--postgres-host localhost \--postgres-port 5432 \--postgres-username <DB_USERNAME> \--postgres-password <DB_PASSWORD> \--postgres-database is_staging \--network-subgraph-endpoint http://query-node-0:8000/subgraphs/id/QmUzRg2HHMpbgf6Q4VHKNDbtBEJnyp5JWCh2gUX9AV6jXv \| pino-pretty
Indexer CLI är ett insticksprogram för tillgängligt i terminalen på graph indexer
.
graph indexer connect http://localhost:18000graph indexer status
Det föreslagna verktyget för att interagera med Indexer Management API är Indexer CLI, ett tillägg till Graph CLI. Indexeragenten behöver input från en Indexer för att autonomt interagera med nätverket på Indexers vägnar. Mekanismen för att definiera Indexeragentens beteende är allokeringhantering och indexeringsregler. I automatiskt läge kan en Indexer använda indexeringsregler för att tillämpa sin specifika strategi för att välja subgrafer att indexera och utföra frågor för. Regler hanteras via ett GraphQL API som serveras av agenten och kallas Indexer Management API. I manuellt läge kan en Indexer skapa allokationsåtgärder med åtgärds kö och godkänna dem explicit innan de utförs. I övervakningsläge används indexeringsregler för att fylla åtgärds kö och kräver också explicit godkännande för utförande.
Indexer CLI ansluter till Indexeragenten, vanligtvis via port-vidarebefordran, så CLI behöver inte köras på samma server eller kluster. För att hjälpa dig komma igång och ge lite kontext kommer CLI att beskrivas här kortfattat.
-
graph indexer connect <url>
- Anslut till Indexerhanterings-API:et. Vanligtvis öppnas anslutningen till servern via port-vidarebefordran, så CLI kan enkelt användas fjärrstyras. (Exempel:kubectl port-forward pod/<indexer-agent-pod> 8000:8000
) -
graph indexer rules get [options] <deployment-id> [<key1> ...]
- Hämta en eller flera indexeringsregler medall
som<deployment-id>
för att hämta alla regler, ellerglobal
för att hämta de globala standardvärdena. Ett ytterligare argument--merged
kan användas för att ange att regler specifika för distributionen slås samman med den globala regeln. Detta är hur de tillämpas i Indexeragenten. -
graph indexer rules set [options] <deployment-id> <key1> <value1> ...
- Ange en eller flera indexeringsregler. -
graph indexer rules start [options] <deployment-id>
- Starta indexering av en subgraph-distribution om den är tillgänglig och ange dessdecisionBasis
tillalways
, så kommer Indexeragenten alltid att välja att indexera den. Om den globala regeln är inställd på always kommer alla tillgängliga subgrafer på nätverket att indexeras. -
graph indexer rules stop [options] <deployment-id>
- Stoppa indexeringen av en distribution och ange dessdecisionBasis
till never, så kommer den att hoppa över den här distributionen när den beslutar om distributioner att indexera. -
graph indexer rules maybe [options] <deployment-id>
— AngedecisionBasis
för en distribution tillrules
, så kommer Indexeragenten att använda indexeringsregler för att avgöra om den ska indexera den här distributionen. -
graph indexer actions get [options] <action-id>
- Fetch one or more actions usingall
or leaveaction-id
empty to get all actions. An additional argument--status
can be used to print out all actions of a certain status. -
graph indexer action queue allocate <deployment-id> <allocation-amount>
- Köa allokationsåtgärd -
graph indexer action queue reallocate <deployment-id> <allocation-id> <allocationAmount>
- Köa omallokeringsåtgärd -
graph indexer action queue unallocate <deployment-id> <allocation-id>
- Köa avallokeringsåtgärd -
graph indexer actions cancel [<action-id> ...]
- Avbryt alla åtgärder i kön om id inte anges, annars avbryt arrayen med id med mellanslag som separator -
graph indexer actions approve [<action-id> ...]
- Godkänn flera åtgärder för utförande -
graph indexer actions execute approve
- Tvinga arbetaren att omedelbart utföra godkända åtgärder
Alla kommandon som visar regler i utdata kan välja mellan de stödda utdataformaten (table
, yaml
och json
) med hjälp av argumentet -output
.
Indexeringsregler kan antingen tillämpas som globala standardvärden eller för specifika subgraph-distributioner med deras ID. Fälten deployment
och decisionBasis
är obligatoriska, medan alla andra fält är valfria. När en indexeringsregel har rules
som decisionBasis
, jämför Indexeragenten tröskelvärden som inte är null på den regeln med värden som hämtas från nätverket för den motsvarande distributionen. Om subgraph-distributionen har värden över (eller under) någon av tröskelvärdena kommer den att väljas för indexering.
Till exempel, om den globala regeln har en minStake
på 5 (GRT), kommer vilken subgraph-distribution som helst som har mer än 5 (GRT) satsat på den att indexeras. Tröskelregler inkluderar maxAllocationPercentage
, minSignal
, maxSignal
, minStake
och minAverageQueryFees
.
Datamodell:
type IndexingRule {identifier: stringidentifierType: IdentifierTypedecisionBasis: IndexingDecisionBasis!allocationAmount: number | nullallocationLifetime: number | nullautoRenewal: booleanparallelAllocations: number | nullmaxAllocationPercentage: number | nullminSignal: string | nullmaxSignal: string | nullminStake: string | nullminAverageQueryFees: string | nullcustom: string | nullrequireSupported: boolean | null}IdentifierType {deploymentsubgraphgroup}IndexingDecisionBasis {rulesneveralwaysoffchain}
Exempel på användning av indexeringsregel:
graph indexer rules offchain QmZfeJYR86UARzp9HiXbURWunYgC9ywvPvoePNbuaATrEKgraph indexer rules set QmZfeJYR86UARzp9HiXbURWunYgC9ywvPvoePNbuaATrEK decisionBasis always allocationAmount 123321 allocationLifetime 14 autoRenewal false requireSupported falsegraph indexer rules stop QmZfeJYR86UARzp9HiXbURWunYgC9ywvPvoePNbuaATrEKgraph indexer rules delete QmZfeJYR86UARzp9HiXbURWunYgC9ywvPvoePNbuaATrEK
Indexer-cli tillhandahåller ett actions
-modul för manuellt arbete med åtgärds kön. Det använder Graphql API som hostas av indexeringshanteringsservern för att interagera med åtgärds kön.
Åtgärdsutförande-arbetaren kommer endast att hämta objekt från kön för att utföra om de har ActionStatus = approved
. På den rekommenderade vägen läggs åtgärder till i kön med ActionStatus = queued, så de måste sedan godkännas för att utföras på kedjan. Den generella flödet kommer att se ut som följer:
- Åtgärd läggs till i kön av tredjeparts-optimeringsverktyget eller indexer-cli-användaren
- Indexer kan använda
indexer-cli
för att visa alla köade åtgärder - Indexer (eller annan programvara) kan godkänna eller avbryta åtgärder i kön med hjälp av
indexer-cli
. Godkänn och avbryt kommandon tar en matris av åtgärds-id som inmatning. - Utförande-arbetaren kollar regelbundet kön för godkända åtgärder. Den hämtar de
approved
åtgärderna från kön, försöker utföra dem och uppdaterar värdena i databasen beroende på utförandestatus tillsuccess
ellerfailed
. - Om en åtgärd är framgångsrik kommer arbetaren att se till att det finns en indexeringsregel som berättar för agenten hur allokeringen ska hanteras framöver, användbart när man tar manuella åtgärder medan agenten är i
auto
elleroversight
-läge. - Indexer kan övervaka åtgärds kön för att se en historia över åtgärdsutförande och om det behövs godkänna om och uppdatera åtgärdsobjekt om de misslyckades med utförande. Åtgärds kön ger en historia över alla köade och tagna åtgärder.
Datamodell:
Type ActionInput {status: ActionStatustype: ActionTypedeploymentID: string | nullallocationID: string | nullamount: string | nullpoi: string | nullforce: boolean | nullsource: stringreason: string | nullpriority: number | null}ActionStatus {queuedapprovedpendingsuccessfailedcanceled}ActionType {allocateunallocatereallocatecollect}
Exempel på användning från källa:
graph indexer actions get allgraph indexer actions get --status queuedgraph indexer actions queue allocate QmeqJ6hsdyk9dVbo1tvRgAxWrVS3rkERiEMsxzPShKLco6 5000graph indexer actions queue reallocate QmeqJ6hsdyk9dVbo1tvRgAxWrVS3rkERiEMsxzPShKLco6 0x4a58d33e27d3acbaecc92c15101fbc82f47c2ae5 55000graph indexer actions queue unallocate QmeqJ6hsdyk9dVbo1tvRgAxWrVS3rkERiEMsxzPShKLco6 0x4a58d33e27d3acbaecc92c15101fbc82f47c2aegraph indexer actions cancelgraph indexer actions approve 1 3 5graph indexer actions execute approve
Observera att åtgärdstyper som stöds för allokeringshantering har olika krav på indata:
-
Tilldela
- allokera insats till en specifik subgraph-deploering- obligatoriska åtgärdsparametrar:
- deploymentID
- belopp
- obligatoriska åtgärdsparametrar:
-
Avslå
- stäng allokeringen och frigör insatsen för omallokering någon annanstans- obligatoriska åtgärdsparametrar:
- allocationID
- deploymentID
- valfria åtgärdsparametrar:
- poi
- force (tvingar användning av den angivna POI även om den inte matchar det som grafnoden tillhandahåller)
- obligatoriska åtgärdsparametrar:
-
Omallokera
- atomiskt stäng allokeringen och öppna en ny allokering för samma subgraph-deploering- obligatoriska åtgärdsparametrar:
- allocationID
- deploymentID
- belopp
- valfria åtgärdsparametrar:
- poi
- force (tvingar användning av den angivna POI även om den inte matchar det som grafnoden tillhandahåller)
- obligatoriska åtgärdsparametrar:
Kostnadsmodeller tillhandahåller dynamisk prissättning för frågor baserat på marknaden och frågans egenskaper. Indexer Service delar en kostnadsmodell med gatewayerna för varje subgraph för vilka de avser att svara på frågor. Gatewayerna använder i sin tur kostnadsmodellen för att fatta beslut om indexeringsval per fråga och för att förhandla om betalning med valda indexers.
Agora-språket ger ett flexibelt format för deklaration av kostnadsmodeller för frågor. En Agora-prismodell är en sekvens av uttalanden som utförs i ordning för varje toppnivåfråga i en GraphQL-fråga. För varje toppnivåfråga avgör det första uttalandet som matchar den priset för den frågan.
Ett uttalande består av en predikat, som används för att matcha GraphQL-frågor, och ett kostnadsuttryck som när det utvärderas ger en kostnad i decimal GRT. Värden i den namngivna argumentpositionen i en fråga kan fångas i predikatet och användas i uttrycket. Globala variabler kan också sättas och ersättas för platshållare i ett uttryck.
Exempel kostnadsmodell:
# Detta uttalande fångar skip-värdet,# använder ett booleskt uttryck i predikatet för att matcha specifika frågor som använder `skip`# och ett kostnadsuttryck för att beräkna kostnaden baserat på `skip`-värdet och den globala SYSTEM_LOADquery { pairs(skip: $skip) { id } } when $skip > 2000 => 0.0001 * $skip * $SYSTEM_LOAD;# Denna standard matchar alla GraphQL-uttryck.# Den använder en Global som ersatts i uttrycket för att beräkna kostnadendefault => 0.1 * $SYSTEM_LOAD;
Exempel på kostnadskalkyl enligt ovanstående modell:
Fråga | Pris |
---|---|
{ pairs(skip: 5000) { id } } | 0.5 GRT |
{ tokens { symbol } } | 0.1 GRT |
{ pairs(skip: 5000) { id } tokens { symbol } } | 0.6 GRT |
Kostnadsmodeller tillämpas via Indexer CLI, som skickar dem till Indexer Management API för Indexer agent för lagring i databasen. Indexer Service kommer sedan att hämta dem och servera kostnadsmodellerna till gatewayerna när de begär dem.
indexer cost set variables '{ "SYSTEM_LOAD": 1.4 }'indexer cost set model my_model.agora
The first steps to participating in the network as an Indexer are to approve the protocol, stake funds, and (optionally) set up an operator address for day-to-day protocol interactions.
Note: For the purposes of these instructions Remix will be used for contract interaction, but feel free to use your tool of choice (, , and are a few other known tools).
När en Indexer har satsat GRT i protokollet kan startas och börja interagera med nätverket.
I
Filutforskaren
skapa en fil med namnet GraphToken.abi med .With
GraphToken.abi
selected and open in the editor, switch to theDeploy and run transactions
section in the Remix interface.Under miljö väljer du
Injected Web3
och underKonto
väljer du din Indexer-adress.Ange kontraktadressen för GraphToken - Klistra in kontraktadressen för GraphToken (
0xc944E90C64B2c07662A292be6244BDf05Cda44a7
) bredvidVid adress
och klicka på knappenVid adress
för att tillämpa.Anropa funktionen
approve(spender, amount)
för att godkänna Staking-kontraktet. Fyll ispender
med Staking-kontraktadressen (0xF55041E37E12cD407ad00CE2910B8269B01263b9
) ochamount
med de tokens som ska satsas (i wei).
I
Filutforskaren
skapa en fil med namnet Staking.abi med stakings ABI.With
Staking.abi
selected and open in the editor, switch to theDeploy and run transactions
section in the Remix interface.Under miljö väljer du
Injected Web3
och underKonto
väljer du din Indexer-adress.Ange kontraktadressen för Staking - Klistra in kontraktadressen för Staking (
0xF55041E37E12cD407ad00CE2910B8269B01263b9
) bredvidVid adress
och klicka på knappenVid adress
för att tillämpa.Anropa
stake()
för att satsa GRT i protokollet.(Valfritt) Indexers kan godkänna en annan adress att vara operatör för sin Indexer-infrastruktur för att separera de nycklar som kontrollerar medlen från de som utför dagliga åtgärder som att tilldela på subgrafer och servera (betalda) frågor. För att ställa in operatören anropas
setOperator()
med operatörsadressen.(Valfritt) För att kontrollera fördelningen av belöningar och strategiskt attrahera Delegators kan Indexers uppdatera sina delegationsparametrar genom att uppdatera sina
indexingRewardCut
(delar per miljon),queryFeeCut
(delar per miljon) ochcooldownBlocks
(antal block). För att göra detta, anropasetDelegationParameters()
. Följande exempel angerqueryFeeCut
för att fördela 95% av frågebidragen till Indexer och 5% till Delegators, ställindexingRewardCut
för att fördela 60% av indexbelöningarna till Indexer och 40% till Delegators, och ställ in perioden förthecooldownBlocks
till 500 block.
setDelegationParameters(950000, 600000, 500)
The setDelegationParameters()
function in the is essential for Indexers, allowing them to set parameters that define their interactions with Delegators, influencing their reward sharing and delegation capacity.
To set the delegation parameters using Graph Explorer interface, follow these steps:
- Navigate to .
- Connect your wallet. Choose multisig (such as Gnosis Safe) and then select mainnet. Note: You will need to repeat this process for Arbitrum One.
- Connect the wallet you have as a signer.
- Navigate to the 'Settings' section and select 'Delegation Parameters'. These parameters should be configured to achieve an effective cut within the desired range. Upon entering values in the provided input fields, the interface will automatically calculate the effective cut. Adjust these values as necessary to attain the desired effective cut percentage.
- Submit the transaction to the network.
Note: This transaction will need to be confirmed by the multisig wallet signers.
After being created by an Indexer a healthy allocation goes through two states.
-
Active - Once an allocation is created on-chain () it is considered active. A portion of the Indexer's own and/or delegated stake is allocated towards a subgraph deployment, which allows them to claim indexing rewards and serve queries for that subgraph deployment. The Indexer agent manages creating allocations based on the Indexer rules.
-
Closed - An Indexer is free to close an allocation once 1 epoch has passed () or their Indexer agent will automatically close the allocation after the maxAllocationEpochs (currently 28 days). When an allocation is closed with a valid proof of indexing (POI) their indexing rewards are distributed to the Indexer and its Delegators ().
Det rekommenderas att Indexers använder funktionen för offchain-synkronisering för att synkronisera subgraph-deploys till kedjehuvudet innan de skapar allokeringen på kedjan. Den här funktionen är särskilt användbar för subgraphs som kan ta längre tid än 28 epoker att synkronisera eller har vissa chanser att misslyckas obestämt.