đŸ‡«đŸ‡· DĂ©marrage rapide de CĂžsmos 📜

Ɠ
6 min readJun 27, 2022

--

Buts 🎯

L’objectif de ce dĂ©marrage rapide est d’adopter un projet de dĂ©marrage standard sur le rĂ©seau Juno, puis de commencer Ă  indexer tous les votes dans le Terra Developer Fund (ouvre un nouvel onglet) (qui a Ă©galement contribuĂ© Ă  SubQuery) CĂžsmos.

Important : Avant de commencer, assurez-vous d’avoir initialisĂ© votre projet en suivant les Ă©tapes fournies dans la section Commencer ici. Vous devez suivre les 4 Ă©tapes suggĂ©rĂ©es (ouvre une nouvelle fenĂȘtre) pour les utilisateurs de CĂžsmos.

Vous pouvez voir le code final de ce projet en visitant ce lien

Maintenant, avançons dans le processus et mettons à jour ces configurations.

Auparavant, dans la section 1. Créer un nouveau projet, vous devez avoir noté 3 fichiers clés. Commençons à les mettre à jour un par un.

Remarque : Le code final de ce projet peut ĂȘtre trouvĂ© ici

1. Mettez à jour votre fichier de schéma GraphQL

Le fichier schema.graphql dĂ©termine la forme de vos donnĂ©es Ă  partir de SubQuery en raison du mĂ©canisme du langage de requĂȘte GraphQL. Par consĂ©quent, la mise Ă  jour du fichier de schĂ©ma GraphQL est le dĂ©but parfait. Il vous permet de dĂ©finir votre objectif final en amont.

Mettez à jour le fichier schema.graphql comme suit. L’objectif est d’indexer tous les votes sur le Terra Developer Fund

type Vote @entity {
id: ID! # id field is always required and must look like this
blockHeight: BigInt!
voter: String! # The address that voted
proposalID: BigInt! # The proposal ID
vote: Boolean! # If they voted to support or reject the proposal
}

Important : lorsque vous apportez des modifications au fichier de schĂ©ma, n’oubliez pas de rĂ©gĂ©nĂ©rer votre rĂ©pertoire de types.

yarn codegennpm run-script codegen

Vous trouverez les modÚles générés dans le répertoire /src/types/models.

Consultez notre documentation sur le schĂ©ma GraphQL pour obtenir plus d’informations sur le fichier schema.graphql.

Maintenant que vous avez apporté des modifications essentielles au fichier de schéma GraphQL, passons à la configuration suivante.

2. Mettez Ă  jour votre fichier manifeste

Le fichier Project Manifest (project.yaml) est un point d’entrĂ©e de votre projet. Il dĂ©finit la plupart des dĂ©tails sur la façon dont SubQuery indexera et transformera les donnĂ©es de la chaĂźne.

Notez que le fichier manifeste a déjà été configuré correctement et ne nécessite pas de modifications importantes, mais vous devez modifier les gestionnaires.

*Étant donnĂ© que nous allons indexer tous les votes sur le Terra Developer Fund, nous examinerons les messages qui utilisent l’appel au contrat de vote. Et suite Ă  cela, nous devons mettre Ă  jour la section des sources de donnĂ©es comme suit :

dataSources:
- kind: cosmos/Runtime
startBlock: 3246370 # The block when the first proposal in this fund was created
mapping:
file: "./dist/index.js"
handlers:
- handler: handleTerraDeveloperFund
kind: cosmos/MessageHandler
filter:
type: "/cosmwasm.wasm.v1.MsgExecuteContract"
# Filter to only messages with the vote function call
contractCall: "vote" # The name of the contract function that was called
values: # This is the specific smart contract that we are subscribing to
contract: "juno1lgnstas4ruflg0eta394y8epq67s4rzhg5anssz3rc5zwvjmmvcql6qps2"

Le code ci-dessus dĂ©finit que vous exĂ©cuterez une fonction de mapping handleTerraDeveloperFund chaque fois qu’il y aura un message de vote du contrat intelligent Terra Developer Fund.

Consultez notre documentation sur le Manifest File pour obtenir plus d’informations sur le fichier manifeste du projet (project.yaml).

Ensuite, approfondissons la configuration de Mapping Function.

3. Ajouter une fonction de mappage

Les fonctions de mapping déterminent comment les données de la chaßne sont transformées en entités GraphQL optimisées que vous avez précédemment définies dans le fichier schema.graphql.

Suivez ces Ă©tapes pour ajouter une fonction de mapping :

  • AccĂ©dez Ă  la fonction de mapping par dĂ©faut dans le rĂ©pertoire src/mappings. Vous verrez quatre fonctions exportĂ©es : handleBlock, handleEvent, handleMessage, handleTransaction. Supprimez les fonctions handleBlock, handleEvent et handleTransaction car vous ne traiterez que la fonction handleMessage.
  • La fonction handleMessage reçoit des donnĂ©es d’évĂ©nement chaque fois qu’un Ă©vĂ©nement correspond aux filtres que vous avez spĂ©cifiĂ©s prĂ©cĂ©demment dans project.yaml. Mettons-le Ă  jour pour traiter tous les messages de vote et les enregistrer dans l’entitĂ© GraphQL crĂ©Ă©e prĂ©cĂ©demment.

Mettez à jour la fonction handleMessage comme suit (notez les importations supplémentaires) :

import { Vote } from "../types";
import { CosmosMessage } from "@subql/types-cosmos";

type Msg = {
vote: {
proposal_id: bigint;
vote: string;
};
};

export async function handleTerraDeveloperFund(
message: CosmosMessage<{ sender: string; msg: Msg }>
): Promise<void> {
// logger.info(JSON.stringify(message));
// Example vote https://www.mintscan.io/juno/txs/EAA2CC113B3EC79AE5C280C04BE851B82414B108273F0D6464A379D7917600A4

const voteRecord = Vote.create({
id: `${message.tx.hash}-${message.idx}`,
blockHeight: BigInt(message.block.block.header.height),
voter: message.msg.decodedMsg.sender,
proposalID: message.msg.decodedMsg.msg.vote.proposal_id,
vote: message.msg.decodedMsg.msg.vote.vote === "yes",
});

await voteRecord.save();
}

Comprenons comment le code ci-dessus fonctionne.

Ici, la fonction reçoit un CosmosMessage qui inclut des donnĂ©es de message sur la charge utile. Nous extrayons ces donnĂ©es puis instancions une nouvelle entitĂ© Vote dĂ©finie prĂ©cĂ©demment dans le fichier schema.graphql. AprĂšs cela, nous ajoutons des informations supplĂ©mentaires, puis utilisons la fonction .save() pour enregistrer la nouvelle entitĂ© (SubQuery l’enregistrera automatiquement dans la base de donnĂ©es).

Consultez notre documentation sur les Mappings et obtenez des informations détaillées sur les fonctions de mapping.

4. Construisez votre projet

Ensuite, créez votre travail pour exécuter votre nouveau projet SubQuery. Exécutez la commande build à partir du répertoire racine du projet comme indiqué ici :

yarn buildnpm run-script build

Important : Chaque fois que vous apportez des modifications Ă  vos fonctions de mapping, vous devez reconstruire votre projet.

5. Exécutez votre projet localement avec Docker

Chaque fois que vous crĂ©ez un nouveau projet de sous-requĂȘte, n’oubliez jamais de l’exĂ©cuter localement sur votre ordinateur et de le tester. Et utiliser Docker est le moyen le plus simple de le faire.

Le fichier docker-compose.yml dĂ©finit toutes les configurations qui contrĂŽlent l’exĂ©cution d’un nƓud SubQuery. Pour un nouveau projet, que vous venez d’initialiser, aucune modification majeure n’est nĂ©cessaire.

Cependant, visitez ExĂ©cuter une sous-requĂȘte localement pour obtenir plus d’informations sur le fichier et les paramĂštres.

Exécutez la commande suivante dans le répertoire du projet :

yarn start:dockernpm run-script start:docker

Remarque : le tĂ©lĂ©chargement des images requises et le dĂ©marrage des diffĂ©rents nƓuds et bases de donnĂ©es Postgres peuvent prendre quelques minutes.

6. Interrogez votre projet

Next, let’s query our project. Follow these three simple steps to query your SubQuery project:

  1. Ouvrez votre navigateur et rendez-vous sur http://localhost:3000
  2. Vous verrez un terrain de jeu GraphQL dans le navigateur et les schĂ©mas prĂȘts Ă  ĂȘtre interrogĂ©s.
  3. Trouvez l’onglet Docs sur le cĂŽtĂ© droit du terrain de jeu qui devrait ouvrir un tiroir de documentation. Cette documentation est gĂ©nĂ©rĂ©e automatiquement et vous aide Ă  trouver les entitĂ©s et les mĂ©thodes que vous pouvez interroger.

Essayez la requĂȘte suivante pour comprendre comment cela fonctionne pour votre nouveau projet de dĂ©marrage SubQuery. N’oubliez pas d’en savoir plus sur le langage de requĂȘte GraphQL.

query {
votes(first: 5, orderBy: BLOCK_HEIGHT_DESC) {
nodes {
id
blockHeight
voter
vote
}
}
}

Vous verrez le résultat similaire à ci-dessous :

{
"data": {
"votes": {
"nodes": [
{
"id": "14B3EE22278C494DFE90EA440A4F049F2D39A31634F0062B0FF362DB2872A979-0",
"blockHeight": "3246683",
"voter": "juno1njyvry0t3j5dy4rr6ar5zfglg3cy2e8u745hl7",
"vote": true
},
{
"id": "23329451CAFF77D5A0416013045530011F4FAFEA94FEEF43784CDF0947B6CA90-0",
"blockHeight": "3246670",
"voter": "juno1ewq9l5ae69csh57j8sgjh8z37ypm3lt0jzamwy",
"vote": true
},
{
"id": "BEAB15E994A4E99BD0631DACF4716C5627E5D0C14E0848BF07A45609CEFB2F0D-0",
"blockHeight": "3246665",
"voter": "juno1az0ehz2e5emudyh8hx2qwtfely0lstzj08gg9j",
"vote": true
}
]
}
}
}

Remarque : Le code final de ce projet peut ĂȘtre trouvĂ© ici

Et aprĂšs?

Toutes nos fĂ©licitations! Vous avez maintenant un projet SubQuery exĂ©cutĂ© localement qui accepte les requĂȘtes de l’API GraphQL pour le transfert de donnĂ©es depuis bLuna.

Cliquez ici pour savoir quelle devrait ĂȘtre votre prochaine Ă©tape dans votre parcours SubQuery.

Remarque : source sub_university 🎓

đŸ‡«đŸ‡· DĂ©marrage rapide de CĂžsmos

← — -Avalanche Quick Start — — — Terra Quick Start — — -→

--

--