Free Bitcoins: FreeBitcoin | BonusBitcoin
Coins Kaufen: Bitcoin.de | AnycoinDirekt | Coinbase | CoinMama (mit Kreditkarte) | Paxfull
Handelsplätze / Börsen: Bitcoin.de | KuCoin | Binance | BitMex | Bitpanda | eToro
Lending / Zinsen erhalten: Celsius Network | Coinlend (Bot)
Cloud Mining: Hashflare | Genesis Mining | IQ Mining
Seit wir die erste Version des Tutorials veröffentlicht haben, hat sich der Code der Grafik geändert. In diesem Handbuch teilen wir die aktualisierte Version des Codes.
Untergraphen definieren, welche Daten von Ethereum indiziert werden und wie sie gespeichert werden. In diesem Handbuch erfahren Sie, wie Sie Untergraphen erstellen.
Der Graph ist ein Protokoll zum schnellen Erstellen von dezentralen Anwendungen (dApps) auf Ethereum und IPFS mit GraphQL. Die Idee hinter The Graph ist es, eine einfache und schnelle Methode zum Abfragen einer Blockchain bereitzustellen.
Heutzutage kann es einfach sein, Informationen aus einer Blockchain abzurufen, z. B. den Kontostand oder den Status einer bestimmten Transaktion. Komplizierter wird es jedoch, wenn wir bestimmte Informationen abfragen möchten, z. B. eine Transaktionsliste für ein Konto eines bestimmten Vertrags. Manchmal können die in einem Vertrag enthaltenen Daten nicht direkt für bestimmte Zwecke verwendet werden, und es müssen Änderungen vorgenommen werden. Hier werden The Graph und seine Untergraphen wirklich hilfreich.
Das Diagramm enthält a DiagrammknotenDies ist eine Anwendung, die die gesamte Blockchain verarbeitet und die Registrierung von Untergraphen ermöglicht. Diese Untergraphen definieren, welche Verträge abgehört und wie die Daten verarbeitet werden, wenn Ereignisse für die Verträge ausgelöst werden.
Wenn Sie beispielsweise alle Angebotsinhaber im HumanityDAO-Vertrag ohne The Graph kennen möchten, müssen Sie einen vollständigen Knoten Transaktion für Transaktion durchlaufen. Sie müssten überprüfen, ob jede Transaktion ein Methodenaufruf an den 0x9d661f7773be14439b4223f5b516bc7ef67b0369-Vertrag ist, der HumanityDAO-Vertragsadresse. In diesem Fall müssten Sie überprüfen, ob die aufgerufene Methode mit einer der Variationen übereinstimmt, die angewendet werden sollen. In diesem Fall müssen Sie den Absender übernehmen und den Überblick behalten.
Diese Aufgabe ist viel einfacher und schneller, wenn Sie einen Subgraph erstellen und in The Graph bereitstellen, wie wir es mit der CHANGE IT Subgraph-URL getan haben !!!!!! Wenn Sie die unten stehende Abfrage in den Spielplatz des HumanityDAO-Subgraphen kopieren, erhalten Sie die Informationen zum Eigentümer des Angebots in nur wenigen Millisekunden.
{
Antragsteller (erste: 100) {
Adresse
vorschläge {
proposalData
}
}
}
In diesem Artikel wird erläutert, wie Sie einen eigenen Subgraphen erstellen. Zuerst erstellen wir einen Subgraphen von HumanityDAO und stellen ihn im Mainnet bereit. HumanityDAO implementiert einen TCR mit der Absicht, eine eindeutige Identität in Ethereum bereitzustellen. Nützliche Links zum Verständnis:
https://www.humanitydao.org/
https://github.com/marbleprotocol/humanity
Um fortfahren zu können, benötigen Sie Grundkenntnisse in GraphQL, Docker und Ethereum (Vertrag, Transaktionen, Adresse usw.) sowie npm oder yarn.
Wir werden Graph Node nicht direkt aus dem Quellcode installieren, weil XXX
. Stattdessen werden wir das offizielle Docker-Image und eine CLI verwenden, mit der wir unseren Subgraphen problemlos bereitstellen können.
Bevor wir beginnen, empfehlen wir dringend, die Kurzanleitung von The Graph zu lesen. Es bietet einen umfassenden Überblick über die Funktionsweise von Graph Node und die Bereitstellung eines Subgraphen.
Sobald Docker ausgeführt wird, benötigen Sie ein Docker Hub-Benutzerkonto, um das Graph Node Docker-Image auszuführen. Wenn Sie noch kein Konto haben, erstellen Sie eines auf der Docker-Website.
Zuerst, Git-Klon
dieses Repository. Bevor wir den Docker-Container ausführen, müssen wir etwas ändern, das wir später verwenden werden. Gehe zu graph-node / docker / docker-compose.yaml
und nehmen Sie folgende Änderungen vor:
- Setzen Sie in Diensten im Umgebungsabschnitt des Graph-Node-Dienstes die Umgebungsvariable "ethereum" auf
ethereum: ’mainnet
:https://mainnet.infura.io/v3/INFURA_PROJECT_ID '
. - Fügen Sie darunter hinzu
ETHEREUM_START_BLOCK: 7720000
. Wir nehmen diese Änderung vor, weil wir Daten vom Mainnet und nicht von einem lokalen Ethereum-Knoten indizieren möchten. Zu diesem Zweck nutzen wir den Infura-Service. In der lokalen Umgebung ist es eine gute Idee,ETHEREUM_START_BLOCK
zu dem Block, in dem der Zinsvertrag bereitgestellt wurde, sodass der Teilgraph unmittelbar nach der Bereitstellung mit der Indizierung beginnt. Andernfalls kann es einige Zeit dauern, bis dieser Block erreicht ist. - Navigiere zu
cd graph-node / docker
und dann rennenDocker-komponieren
. Dies führt drei verschiedene Container aus: 1) einen PostgresDB-Server, auf dem die indizierten Daten gespeichert werden, 2) ein IPFS-Gateway zum Laden und Speichern von Subgraph-Dateien und 3) eine Graph Node-Instanz. Vergiss nicht zu rennen$ docker login
Verwenden Sie die Anmeldeinformationen Ihres Docker Hub, bevor Sie Container ausführen.
Hinweis: Windows-Benutzer müssen ein Problem im Zusammenhang mit der Handhabung der Volumes durch Docker lösen.
Beim Hinzufügen ETHEREUM_START_BLOCK
, teilen wir dem Graph-Node mit, dass wir ab einer bestimmten Blocknummer mit der Indizierung für unseren Subgraph beginnen wollen. Andernfalls dauert es Stunden, bis alle Blöcke verarbeitet sind.
Jetzt, da ein Graph-Knoten lokal ausgeführt wird, erstellen wir unseren Subgraphen. Wir verwenden TwitterHumanityApplicant und HumanityGovernance, die beide im Mainnet bereitgestellt werden. Achten Sie auf die Vertragsadresse und auf die Vertrag
Tab.
In diesem Untergraphen benötigen wir eine Möglichkeit, auf Folgendes zuzugreifen:
- Die Adressen aller Antragsteller
- Die Vorschläge für jede Adresse initiiert
- Grundlegende Informationen über das Angebot, wie z. B. das Twitter – Konto, können Stimmen, Status usw
- Die Zähler für Vorschläge sind "genehmigt", "abgelehnt" und "ausstehend"
Der einfachste Weg, einen Untergraphen zu erstellen, ist die Verwendung von Graph
Befehl von graph-cli
. Nach dem Ausführen von graph init werden Sie gefragt, ob Sie den Anfangscode für einen Untergraphen generieren möchten. Danach ist ein Musteruntergraph auf der Grundlage des angegebenen Vertrags einsatzbereit.
Wenn Sie nach dem Namen des Subgraphen gefragt werden, müssen Sie den Benutzernamen des Subgraphenbesitzers voranstellen. In unserem Fall handelt es sich um Protofire. Wenn Sie nach der Vertragsadresse gefragt werden, geben Sie die folgende Adresse an: 0xdd806c4fdad2949a97fda79036cfbb8750181b37
Wenn alles gut gelaufen ist, haben Sie einen Untergraphen erstellt!
Ändern wir die Codebasis des Untergraphen, die automatisch generiert wird, um sie an unsere Bedürfnisse anzupassen. Stellen Sie sich vor, wir möchten die Vertragsdaten so indizieren, dass wir später alle Vorschläge für eine bestimmte Adresse abfragen können. Die graphql-Abfrage lautet:
{
Antragsteller (zuerst: 10) {
Adresse
vorschläge {
proposalData
}
}
}
Der erste Schritt besteht darin, den Namen des Vertrags zu ändern, der von graph-cli automatisch verknüpft wird. Gehe zum abis
Ordner und umbenennen contract.json
zu HumanityGovernance.json
Ersetzen Sie dann in subgraph.yaml alle Vorkommen von Contract durch HumanityGovernance. Zu ändernde Tasten:
"Name", "source", "abis"
HumanityDAO hat seinen Code in mehrere Verträge aufgeteilt, und der HumanityGovernance-Vertrag behandelt leider nicht die vollständigen Daten, die wir benötigen. Daher müssen wir das Schema ändern, um die Daten für einen anderen Vertrag zu erfassen.
Fügen wir den zweiten Vertrag hinzu. Gehe zu subgraph.yaml
und fügen Sie diesen Code unter dem Schlüssel dataSources hinzu:
- Art: Ethereum / Vertrag
name: TwitterHumanityApplicant
Netzwerk: Mainnet
Quelle:
Adresse: "0x9D661f7773Be14439b4223F5b516bC7Ef67b0369"
abi: TwitterHumanityApplicant
Kartierung:
Art: Ethereum / Veranstaltungen
apiVersion: 0.0.3
sprache: wasm / assemblyscript
Entitäten:
- Vorschlag
abis:
- Name: TwitterHumanityApplicant
Datei: ./abis/TwitterHumanityApplicant.json
eventHandlers:
- event: Apply (indizierte uint256, indizierte Adresse, Zeichenfolge)
Handler: handleApply
Datei: ./src/mapping.ts
Diesmal wird das ABI für den Vertrag nicht direkt heruntergeladen, aber wir können das leicht lösen, indem wir es aus dem Etherscan-Abschnitt „Contract ABI“ entnehmen. Erstellen Sie eine Datei mit dem Namen TwitterHumanityApplicant.json
in der abis
Ordner, und fügen Sie das ABI dort.
Fahren Sie fort, indem Sie die Hauptentitäten definieren, die für diesen Untergraphen verwendet werden sollen. Wechseln Sie zu subgraph.yaml, und ändern Sie in der ersten dataSource den Entitätsschlüssel so, dass er die folgenden Werte enthält:
- Antragsteller
- Vorschlag
Führen Sie in der zweiten dataSource dasselbe aus, jedoch mit dem folgenden Wert:
- Vorschlag
Gehe zu schema.graphql
und füge dies an:
enum ProposalResult {
STEHT AUS
GENEHMIGT
ABGELEHNT
}Typ Proposer @entity {
Ich tat!
Adresse: Zeichenfolge!
Vorschläge: [Proposal!]! @derivedFrom (Feld: "Antragsteller")
}Geben Sie Proposal @entity {ein.
Ich tat!
proposalData: String!
Antragsteller: Antragsteller!
Ergebnis: ProposalResult!
countYesVotes: BigInt!
countNoVotes: BigInt!
}
Wir werden dies später genauer analysieren. Im Moment wissen, dass die Antragsteller
Entität enthält alle Adressen, die jemals ein Twitter-Konto als Teil der Registrierung vorgeschlagen haben. Das Vorschlag
Entität enthält Informationen über das Angebot selbst.
Aktualisieren Sie nun die Datei subgraph.yaml, um diese Änderung widerzuspiegeln, indem Sie den Entitätsschlüssel in beiden dataSources wie folgt ändern:
Entitäten:
- Antragsteller
- Vorschlag
Die eventHandler müssen ebenfalls aktualisiert werden.
Die erste dataSource ist:
eventHandlers:
- event: Propose (indizierte uint256, indizierte Adresse, indizierte Adresse, Bytes)
Handler: handlePropose
Der zweite wird sein:
eventHandlers:
- event: Apply (indizierte uint256, indizierte Adresse, Zeichenfolge)
Handler: handleApply
Jetzt nehmen wir einige Änderungen an der mapping.ts
Datei innerhalb der src
Mappe. Hier passiert die Magie! Wir müssen Graph Node jedes Mal mitteilen, was passieren soll, wenn ein Block verarbeitet wird. Ersetzen Sie den Inhalt durch diesen:
{Address, BigInt} aus "@ graphprotocol / graph-ts" importierenimportieren {
Als ProposeEvent vorschlagen,
HumanityGovernance,
} aus ‘../generated/HumanityGovernance/HumanityGovernance’
{Als ApplyEvent anwenden} aus ‘../generated/TwitterHumanityApplicant/TwitterHumanityApplicant’ importieren
{Proposer, Proposal} aus "../generated/schema" importierenconst proposalResultPending = "PENDING"Exportfunktion handlePropose (Ereignis: ProposeEvent): void {
let proposerId = event.transaction.hash.toHex () + ‘-’ + event.logIndex.toString ()
let proposer = new Proposer (proposerId)
proposer.address = ’’ // wir werden dieses Feld in handleApply füllen
proposer.save ()let humanityGovernance = getHumanityGovernanceInstance (event.address)let proposalId = event.params.proposalId.toHex ()
let proposal = new Proposal (proposalId)
proposal.proposalData = ‘’ // Wir füllen dieses Feld in handleApply aus
proposal.proposer = proposerId
proposal.result = proposalResultPending
proposal.countYesVotes = humanityGovernance.proposalFee ()
proposal.countNoVotes = BigInt.fromI32 (0)
proposal.save ()
}Exportfunktion handleApply (Ereignis: ApplyEvent): void {}Funktion getHumanityGovernanceInstance (Adresse: Adresse): HumanityGovernance {return HumanityGovernance.bind (Adresse)
}
Lassen Sie uns das analysieren. Zunächst definieren wir a handlePropose
Handler, der bei jedem Auslösen eines Angebotsereignisses aufgerufen wird. Die Struktur dieser Veranstaltung ist wie folgt:
event Propose (Uint indizierte ProposalId, Adresse indizierter Antragsteller, Adresse indiziertes Ziel, Bytedaten);
Mit diesen Informationen müssen wir zwei Instanzen erstellen – eine für die Antragsteller und ein anderer für die Vorschlag.
Für den Antragsteller setzen wir die Adresse
mit einem leeren Wert, da die an das Ereignis gesendete Adresse nicht mit der Ethereum-Adresse zusammenhängt, mit der die Transaktionen gestartet wurden. Es ist verwandt mit dem TwitterHumanityApplicant
Vertrag, was wir nicht wollen. Später aktualisieren wir es mit der realen Adresse.
Für den Vorschlag, die Ergebnis
wird initialisiert als STEHT AUS
standardmäßig und countVotesYes
wird mit einem Wert aus dem HumanityGovernance-Vertrag initialisiert. Es wird als öffentliche Variable beibehalten proposalFee
Aus diesem Grund müssen wir den Vertrag mit der Veranstaltungsadresse binden. Durch die Bindung an eine Vertragsadresse und den Aufruf der Vertragsmethoden erhalten wir öffentliche Informationen aus dem Vertrag.
Nach diesen Änderungen müssen wir den Code neu generieren. Wir machen das mit Garn Codegen
.
Als Nächstes erstellen wir den Untergraphen auf dem lokalen Graph-Knoten, erstellen ihn und stellen ihn bereit. Führen Sie dazu die folgenden Befehle aus:
Garn schaffen-lokal
Garn einsatzlokal
Nachdem Sie den zweiten Befehl ausgeführt haben, wird ein Link angezeigt, der Sie zu einer GraphQL-Instanz umleitet. Wenn Graph Node nach einer Weile mit der Indizierung des Untergraphen beginnt, können Sie die Antragsteller und ihre Vorschläge abfragen:
{
Antragsteller (zuerst: 10) {
Ich würde
Adresse
vorschläge {
Ich würde
proposalData
}
}
}
Dies zeigt die ersten 10 Entitäten.
In diesem Tutorial haben wir einen Graph-Node ausgeführt und mit ihm interagiert, indem wir unseren eigenen Subgraphen implementiert haben. Das nächste Mal werden wir detailliert beschreiben, wie dieser Untergraph zum Transformieren von Daten und Abfragen der Blockchain verwendet wird. Bleib dran!
Nicolás Dominguez ist Senior Software Engineer bei Protofire. Nach mehr als 9 Jahren in der IT konzentriert er sich nun auf die blockchain-basierte Entwicklung mit einem besonderen Interesse an der Anwendung von GraphQL zur Erstellung von produktionsfähigen Dapps. Nicolás hat Erfahrung als Full-Stack-JavaScript-Entwickler mit profunden Kenntnissen in React und Node.js. Er ist auch begeistert vom maschinellen Lernen.
Cristian Malfesi ist Projektmanager von Blockchain bei Protofire. Er hat viel Erfahrung in technologischen Projekten, der Entwicklung von Apps, Datenbanken usw. Cristian hat sowohl im Front-End- als auch im Back-End-Bereich als Entwickler, Architekt, Serveradministrator, Netzwerkadministrator, Projektadministrator und Produktbesitzer gearbeitet. Er mag neue Herausforderungen und legt großen Wert auf teamübergreifende Kommunikation und Motivation sowie die ständige Suche nach Selbstverbesserung.
Manuel Garcia ist CTO bei Protofire, wo er für die Unterstützung von tokenbasierten Startups mit Protokoll- und intelligentem Vertrags-Engineering verantwortlich ist. Er hat die letzten 15 Jahre an der Schnittstelle von Business- und Software-Innovation gearbeitet. Manuel ist ein Anwalt für zertifizierte Scrum Master- und Agile-Verfahren und war an allen Phasen der Erstellung von Softwareprodukten vom Projektstart bis zur Bereitstellung und Wartung beteiligt. Seine Erfahrung erstreckt sich über Softwareentwicklung, Projektmanagement und Produktmanagement.
Free Bitcoins: FreeBitcoin | BonusBitcoin
Coins Kaufen: Bitcoin.de | AnycoinDirekt | Coinbase | CoinMama (mit Kreditkarte) | Paxfull
Handelsplätze / Börsen: Bitcoin.de | KuCoin | Binance | BitMex | Bitpanda | eToro
Lending / Zinsen erhalten: Celsius Network | Coinlend (Bot)
Cloud Mining: Hashflare | Genesis Mining | IQ Mining