Cosmos Quick Start
Cosmos Quick Start
Bu Hızlı başlangıç kılavuzunda, Juno Network'te basit bir Cosmos başlangıç projesiyle başlayacağız ve ardından bazı gerçek gerçek verileri indeksleyerek bitireceğiz. Bu, kendi SubQuery Projenizi geliştirirken başlamak için mükemmel bir temeldir.
Substrate/Polkadot için kılavuz arıyorsanız, Substrate/Polkadot'a özel hızlı başlangıç kılavuzunu okuyabilirsiniz.
Bu kılavuzun sonunda, verileri sorguyabileceğiniz bir GraphQL uç noktasına sahip bir SubQuery düğümünde çalışan çalışan bir SubQuery projeniz olacaktır.
Henüz yapmadıysanız, SubQuery'de kullanılan terminology hakkında bilgi sahibi > öneririz.
The goal of this quick start guide is to adapt the standard starter project to begin indexing all votes on the Terra Developer Fund (which also contributed to SubQuery) from Cosmos, it should only take 10-15 minutes
You can see the final code of this project here at https://github.com/jamesbayly/juno-terra-developer-fund-votes
Hazırlık
Yerel Kalkınma Ortamı
SubQuery CLI'sını yükleme
NPM kullanarak Terminalinize SubQuery CLI'yi genel olarak yükleyin:
# NPM
npm install -g @subql/cli
Kötü bağımlılık yönetimi nedeniyle, @subql/cli
kurulumu için yarn global
kullanımını DESTEK ETMEDİĞİMİZ unutmayın. satırdaki hatalar.
Daha sonra CLI tarafından sunulan kullanılabilir komutları ve kullanımı görmek için yardım çalıştırabilirsiniz
subql help
Başlangıç SubQuery Projesini Başlatma
Cosmos is not yet supported in SubQuery's CLI (subql
), to start with Juno clone or fork the starter project.
Başlatma işlemi tamamlandıktan sonra, dizin içinde proje adınızın oluşturulduğu bir klasör görmeniz gerekir. Bu directoy'un içeriği Directory Structure listelenenlerle aynı olmalıdır.
Son olarak, proje dizini altında, yeni projenin bağımlılıklarını yüklemek için aşağıdaki komutu çalıştırın.
::: code-tabs @tab:active yarn shell cd PROJECT_NAME yarn install
@tab npm shell cd PROJECT_NAME npm install
:::
Making Changes to your Project
In the starter package that you just initialised, we have provided a standard configuration for your new project. Esas olarak aşağıdaki dosyalar üzerinde çalışacaksınız:
- The GraphQL Schema in
schema.graphql
project.yaml
içindeki Proje Manifestosusrc/mappings/
dizinindeki Eşleme işlevleri
Bu hızlı başlangıç kılavuzunun amacı, standart başlangıç projesini tüm transferleri indekslemeye başlayacak şekilde uyarlamaktır, sadece - dakika sürmelidir.
GraphQL Şema Dosyanızı Güncelleme
schema.graphql
dosyası çeşitli GraphQL şemalarını tanımlar. GraphQL sorgu dilinin çalışma biçimi nedeniyle, şema dosyası temel olarak verilerinizin şeklini SubQuery'den belirler. Başlamak için harika bir yer çünkü nihai hedefinizi önceden tanımlamanıza izin veriyor.
We're going to update the schema.graphql
file to read as follows so we can index all votes on the 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
}
Önemli: Şema dosyasında herhangi bir değişiklik yaptığınızda, lütfen türler dizininizi yeniden oluşturduğunuzdan emin olun. Bunu şimdi yap.
::: code-tabs @tab:active yarn shell yarn codegen
@tab npm shell npm run-script codegen
:::
You'll find the generated models in the /src/types/models
directory. schema.graphql
dosyası hakkında daha fazla bilgi için, Build/GraphQL Schema altındaki belgelerimize bakın
Proje Bildirim Dosyasını Güncelleme
Proje Bildirimi (project.yaml
) dosyası projenizin bir giriş noktası olarak görülebilir ve SubQuery'nin zincir verilerini nasıl indeksleyip dönüştüreceğiyle ilgili ayrıntıların çoğunu tanımlar.
Bildirim dosyasında zaten doğru bir şekilde kurulduğundan çok fazla değişiklik yapmayacağız, ancak işleyicilerimizi değiştirmemiz gerekiyor. Remember we are planning to index all votes on the Terra Developer Fund. This means that we we will look at messages that use the vote
contract call, we need to update the datasources
section to read the following.
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"
This means we'll run a handleTerraDeveloperFund
mapping function each and every time there is a vote
message from the Terra Developer Fund smart contract.
Proje Bildirimi (project.yaml
) dosyası hakkında daha fazla bilgi için, Yapı/Manifest Dosyası altındaki belgelerimize bakın
Eşleme İşlevi Ekle
Eşleme işlevleri, zincir verilerinin daha önce schema.graphql
dosyasında tanımladığımız optimize edilmiş GraphQL varlıklarına nasıl dönüştürüleceğini tanımlar.
src/mappings
dizinindeki varsayılan eşleme işlevine gidin. You'll see four exported functions, handleBlock
, handleEvent
, handleMessage
, and handleTransaction
. Since we are dealing only with messages, you can delete everything other than the handleMessage
function.
The handleMessage
function recieved event data whenever event matches the filters that we specify previously in our project.yaml
. We are going to update it to process all vote
messages and save them to the GraphQL entity that we created earlier.
You can update the handleMessage
function to the following (note the additional imports and renaming the function):
import { Vote } from "../types";
import { CosmosMessage } from "@subql/types-cosmos";
export async function handleTerraDeveloperFund(
message: CosmosMessage
): Promise<void> {
// logger.info(JSON.stringify(message));
// Example vote https://www.mintscan.io/juno/txs/EAA2CC113B3EC79AE5C280C04BE851B82414B108273F0D6464A379D7917600A4
const voteRecord = new Vote(`${message.tx.hash}-${message.idx}`);
voteRecord.blockHeight = BigInt(message.block.block.header.height);
voteRecord.voter = message.msg.sender;
voteRecord.proposalID = message.msg.msg.vote.proposal_id;
voteRecord.vote = message.msg.msg.vote.vote === "yes";
await voteRecord.save();
}
What this is doing is receiving a CosmosMessage which includes message data on the payload. We extract this data and then instantiate a new Vote
entity that we defined earlier in the schema.graphql
file. Ek bilgiler ekleriz ve ardından yeni varlığı kaydetmek için .save()
işlevini kullanırız (SubQuery bunu otomatik olarak veritabanına kaydeder).
Eşleme işlevleri hakkında daha fazla bilgi için Derleme/Eşlemeler altındaki belgelerimize bakın
Projeyi Oluşturun
Yeni SubQuery Projenizi çalıştırmak için önce çalışmamızı oluşturmamız gerekiyor. Yapı komutunu projenin kök dizininden çalıştırın.
::: code-tabs @tab yarn yarn build
@tab npm npm run-script build
:::
Important: Whenever you make changes to your mapping functions, you'll need to rebuild your project
Running and Querying your Project
Run your Project with Docker
Whenever you create a new SubQuery Project, you should always run it locally on your computer to test it first. Bunu yapmanın en kolay yolu Docker kullanmaktır.
Bir SubQuery düğümünün nasıl çalıştırıldığını kontrol eden tüm yapılandırma, bu docker-compose.yml
dosyasında tanımlanır. Yeni initalised yeni bir proje için burada hiçbir şeyi değiştirmenize gerek kalmayacak, ancak dosya ve ayarlar hakkında daha fazla bilgiyi Run a Project section
Proje dizini altında aşağıdaki komutu çalıştırın:
::: code-tabs @tab:active yarn shell yarn start:docker
@tab npm shell npm run-script start:docker
:::
It may take some time to download the required packages (@subql/node
, @subql/query
, and Postgres) for the first time but soon you'll see a running SubQuery node. Burada sabırlı olun.
Projenizi Sorgulama
Tarayıcınızı açın ve http://localhost:3000 gidin.
Explorer'da ve sorguya hazır şemalarda bir GraphQL oyun alanının görüntü olduğunu görmeniz gerekir. Oyun alanının sağ üst kısmında, belge çizimini açacak bir Docs düğmesi bulacaksınız. Bu dokümantasyonlar otomatik olarak oluşturulur ve hangi varlıkları ve yöntemleri sorgulayabileceğinizi bulmanıza yardımcı olur.
Yeni bir SubQuery başlangıç projesi için, nasıl çalıştığını öğrenmek için aşağıdaki sorguyu deneyebilir veya GraphQL Query dili hakkında daha fazla bilgi .
query {
votes(
first: 5
orderBy: BLOCK_HEIGHT_DESC # filter: {proposalID: {equalTo: "4"}}
) {
nodes {
id
blockHeight
voter
vote
}
}
}
You can see the final code of this project here at https://github.com/jamesbayly/juno-terra-developer-fund-votes
SubQuery Projenizi Yayımlama
SubQuery, yeni projenizi dağıtabileceğiniz zaman ücretsiz bir yönetilen hizmet sağlar. SubQuery Projelerine dağıtabilir ve Gezgin'i kullanarak sorgulayabilirsiniz.
Yeni projenizi SubQuery Projects'te yayınlamak için kılavuzu okuyun
Sonraki Adımlar
Tebrikler, artık bLuna'dan veri aktarımı için GraphQL API isteklerini kabul eden yerel olarak çalışan bir SubQuery projeniz var.
Artık temel bir SubQuery projesinin nasıl oluşturulacağına dair bir fikir edindiğinize göre, soru buradan nereye? Kendinize güveniyorsanız, üç temel dosya hakkında daha fazla bilgi edinebilirsiniz. Manifest dosyası, GraphQL şeması ve Bu belgelerin Oluşturma bölümü altındaki eşlemeler dosyası.
Aksi takdirde, daha ayrıntılı atölye çalışmaları, eğitimler ve örnek projelerin bulunduğu Akademi bölümümüze devam edin. Orada daha gelişmiş değişikliklere bakacağız ve hazır ve açık kaynak projeleri çalıştırarak SubQuery projelerini çalıştırma konusunda daha derine ineceğiz.
Son olarak, projenizi yürütmek ve yayınlamak için daha fazla yol arıyorsanız, Çalıştır ve Yayınla bölümümüz, SubQuery projenizi çalıştırmanın tüm yolları ve diğer gelişmiş GraphQL toplama ve abonelik özellikleri hakkında ayrıntılı bilgi sağlar.