subgraphs > Cookbook > Bir Sözleşmeyi Değiştirin ve Graftlama ile Geçmişini Koruyun

Bir Sözleşmeyi Değiştirin ve Graftlama ile Geçmişini Koruyun

Reading time: 5 min

Bu rehberde, mevcut subgraphları graftlayarak yeni subgraphları nasıl oluşturacağınızı ve dağıtacağınızı öğreneceksiniz.

Graftlama Nedir?

Bu bölüme bağlantı

Graftlama, mevcut bir subgraph'daki verileri yeniden kullanır ve daha sonraki bir blokta indekslemeye başlar. Bu, geliştirme sırasında eşleştirmelerdeki basit hataları hızlı bir şekilde geçmek veya mevcut bir subgraph'ın başarısız olduktan sonra geçici olarak tekrar çalışmasını sağlamak için kullanışlıdır. Ayrıca, sıfırdan indekslenmesi uzun süren bir subgraph'a bir özellik eklerken de kullanılabilir.

Graftlanan subgraph, temel subgraphla tamamen aynı olmayan, ancak onunla uyumlu olan bir GraphQL şeması kullanabilir. Kendi başına geçerli bir subgraph şeması olmalıdır, ancak şu şekillerde temel subgraph şemasından sapabilir:

  • Varlık türlerini ekler veya kaldırır
  • Varlık türlerinden öznitelikleri kaldırır
  • Varlık türlerine null yapılabilir öznitelikler ekler
  • Null yapılamayan öznitelikleri null yapılabilir özniteliklere dönüştürür
  • Numaralandırmalara değerler ekler
  • Arayüzleri ekler veya kaldırır
  • Arayüzün hangi varlık türleri için uygulandığını değiştirir

Daha fazla bilgi için kontrol edebilirsiniz:

In this tutorial, we will be covering a basic use case. We will replace an existing contract with an identical contract (with a new address, but the same code). Then, graft the existing subgraph onto the "base" subgraph that tracks the new contract.

Ağa Yükseltme Durumunda Graftlamaya İlişkin Önemli Not

Bu bölüme bağlantı

Caution: It is recommended to not use grafting for subgraphs published to The Graph Network

Bu Neden Önemli?

Bu bölüme bağlantı

Grafting is a powerful feature that allows you to "graft" one subgraph onto another, effectively transferring historical data from the existing subgraph to a new version. It is not possible to graft a subgraph from The Graph Network back to Subgraph Studio.

En İyi Uygulamalar

Bu bölüme bağlantı

İlk Taşıma: Subgraph'ınızı merkeziyetsiz ağa ilk kez dağıttığınızda, bunu graftlama yapmaksızın gerçekleştirin. Subgraph'ın kararlı olduğundan ve beklendiği gibi çalıştığından emin olun.

Sonraki Güncellemeler: Subgraph'ınız merkeziyetsiz ağda yayında ve kararlı olduğunda, geçişi daha sorunsuz hale getirmek ve geçmiş verileri korumak adına gelecek sürümler için graftlamayı kullanabilirsiniz.

Bu yönergelere uyarak riskleri en aza indirebilir ve daha sorunsuz bir taşıma süreci geçirebilirsiniz.

Mevcut Bir Subgraph'ı Oluşturma

Bu bölüme bağlantı

Building subgraphs is an essential part of The Graph, described more in depth here. To be able to build and deploy the existing subgraph used in this tutorial, the following repo is provided:

Not: Subgraph'ta kullanılan sözleşme aşağıdaki Hackathon Starterkit'den alınmıştır.

Subgraph Manifest Tanımı

Bu bölüme bağlantı

Subgraph manifesti subgraph.yaml, subgraph için veri kaynaklarını, ilgili tetikleyicileri ve bu tetikleyicilere yanıt olarak çalıştırılması gereken fonksiyonları tanımlar. Kullanacağınız örnek bir subgraph bildirimi için aşağıya bakın:

specVersion: 0.0.4
schema:
file: ./schema.graphql
dataSources:
- kind: ethereum
name: Lock
network: sepolia
source:
address: '0xb3aabe721794b85fe4e72134795c2f93b4eb7e63'
abi: Lock
startBlock: 5955690
mapping:
kind: ethereum/events
apiVersion: 0.0.6
language: wasm/assemblyscript
entities:
- Withdrawal
abis:
- name: Lock
file: ./abis/Lock.json
eventHandlers:
- event: Withdrawal(uint256,uint256)
handler: handleWithdrawal
file: ./src/lock.ts
  • Lock veri kaynağı, sözleşmeyi derleyip dağıttığımızda alacağımız abi ve sözleşme adresidir
  • The network should correspond to an indexed network being queried. Since we're running on Sepolia testnet, the network is sepolia
  • mapping bölümü, ilgili tetikleyicileri ve bu tetikleyicilere yanıt olarak çalıştırılması gereken fonksiyonları tanımlar. Bu durumda, Withdrawal olayının etkinliklerini gözlemliyoruz ve yayıldığında handleWithdrawal fonksiyonunu çağırıyoruz.

Graftlama Manifest Tanımı

Bu bölüme bağlantı

Graftlama, orijinal subgraph bildirimine iki yeni öğe eklemeyi gerektirir:

---
features:
- grafting # feature name
graft:
base: Qm... # subgraph ID of base subgraph
block: 5956000 # block number
  • features: is a list of all used feature names.
  • graft: base subgraph'ın ve üzerine graftlanacak bloğun bir eşleştirmesidir. block, indekslemeye başlanacak blok numarasıdır. Graph, temel subgraph'ın verilerini verilen bloğa kadar ve bu blok dahil olmak üzere kopyalayacak ve ardından yeni subgraph'ı bu bloktan itibaren indekslemeye devam edecektir.

base ve block değerler iki subgraph kullanılarak bulunabilir: biri temel indeksleme için ve diğeri graftlamalı

Temel Subgraph'ı Dağıtma

Bu bölüme bağlantı
  1. Go to Subgraph Studio and create a subgraph on Sepolia testnet called graft-example
  2. Depoda bulunan graft-example klasöründeki subgraph sayfanızda bulunan AUTH & DEPLOY bölümündeki talimatları izleyin
  3. Tamamlandığında, subgraph'ın doğru bir şekilde indekslendiğinden emin olun. Eğer aşağıdaki komutu Graph Test Alanında(Playground) çalıştırırsanız
{
withdrawals(first: 5) {
id
amount
when
}
}

Şuna benzer bir şey döndürür:

{
"data": {
"withdrawals": [
{
"id": "0xe8323d21c4f104607b10b0fff9fc24b9612b9488795dea8196b2d5f980d3dc1d0a000000",
"amount": "0",
"when": "1716394824"
},
{
"id": "0xea1cee35036f2cacb72f2a336be3e54ab911f5bebd58f23400ebb8ecc5cfc45203000000",
"amount": "0",
"when": "1716394848"
}
]
}
}

Subgraph'ın düzgün bir şekilde indekslendiğini doğruladıktan sonra, subgraph'ı graftlama ile hızlı bir şekilde güncelleyebilirsiniz.

Graftlama Subgraph'ını Dağıtma

Bu bölüme bağlantı

Graft yerine geçen subgraph.yaml yeni bir sözleşme adresine sahip olacaktır. Bu, merkeziyetsiz uygulamanızı güncellediğinizde, bir sözleşmeyi yeniden dağıttığınızda vb. gerçekleşebilir.

  1. Go to Subgraph Studio and create a subgraph on Sepolia testnet called graft-replacement
  2. Create a new manifest. The subgraph.yaml for graph-replacement contains a different contract address and new information about how it should graft. These are the block of the last event emitted you care about by the old contract and the base of the old subgraph. The base subgraph ID is the Deployment ID of your original graph-example subgraph. You can find this in Subgraph Studio.
  3. Github deposunda bulunan graft-replacement klasöründeki subgraph sayfanızda bulunan AUTH & DEPLOY bölümündeki talimatları izleyin
  4. Tamamlandığında, subgraph'ın doğru bir şekilde indekslendiğinden emin olun. Eğer aşağıdaki komutu Graph Test Alanında(Playground) çalıştırırsanız
{
withdrawals(first: 5) {
id
amount
when
}
}

Aşağıdakileri döndürmelidir:

{
"data": {
"withdrawals": [
{
"id": "0xe8323d21c4f104607b10b0fff9fc24b9612b9488795dea8196b2d5f980d3dc1d0a000000",
"amount": "0",
"when": "1716394824"
},
{
"id": "0xea1cee35036f2cacb72f2a336be3e54ab911f5bebd58f23400ebb8ecc5cfc45203000000",
"amount": "0",
"when": "1716394848"
},
{
"id": "0x2410475f76a44754bae66d293d14eac34f98ec03a3689cbbb56a716d20b209af06000000",
"amount": "0",
"when": "1716429732"
}
]
}
}

You can see that the graft-replacement subgraph is indexing from older graph-example data and newer data from the new contract address. The original contract emitted two Withdrawal events, Event 1 and Event 2. The new contract emitted one Withdrawal after, Event 3. The two previously indexed transactions (Event 1 and 2) and the new transaction (Event 3) were combined together in the graft-replacement subgraph.

Congrats! You have successfully grafted a subgraph onto another subgraph.

If you want more experience with grafting, here are a few examples for popular contracts:

To become even more of a Graph expert, consider learning about other ways to handle changes in underlying datasources. Alternatives like Data Source Templates can achieve similar results

Not: Bu makaledeki birçok materyal daha önce yayınlanan Arweave makalesinden alınmıştır

Sayfayı Düzenle

Önceki
Arweave Üzerinde Subgraphlar Oluşturma
Sonraki
Güvenli Subgraph Kod Oluşturucu
Sayfayı Düzenle