Geliştirici SSS
Reading time: 5 min
Bu sayfa, The Graph üzerinde geliştirme yapan geliştiricilerin sunduğu en yaygın soruların bazılarını özetlemektedir.
Bir subgraph, blokzinciri verilerine dayalı olarak oluşturulmuş özel yapım bir API’dir. Subgraph'ler, GraphQL sorgu dili kullanılarak sorgulanır ve The Graph CLI kullanılarak bir Graph Düğümü'nde yayına alınır. Dağıtılıp The Graph’in merkeziyetsiz ağına yayımlandığında, Endeksleyiciler subgraph'leri işler ve sorgu yapmaları için kullanıcıların erişimine sunar.
Başarılı bir şekilde subgraph oluşturmak için The Graph CLI’yi kurmanız gerekir. Başlamak için bölümüne göz atın. Ayrıntılı bilgi için bölümünü inceleyin.
Akıllı sözleşmelerinizi, sorgulamak istediğiniz verilerle ilişkili olaylara sahip olacak şekilde yapılandırmanız şiddetle önerilir. Subgraph içindeki olay işleyicileri sözleşme olayları tarafından tetiklenir ve kullanışlı verilere erişmenin en hızlı yolu bu işleyicileri kullanmaktır.
Eğer çalıştığınız sözleşmeler olay içermiyorsa, subgraph’inizin endekslenmesini çağrı ve blok işleyicileri kullanarak tetikleyebilirsiniz. Ancak bu tavsiye edilmeyen bir yöntemdir ve performansı önemli ölçüde yavaşlatacaktır.
Hayır. Bir subgraph oluşturulduktan sonra, ilişkili GitHub hesabı değiştirilemez. Bu nedenle, subgraph oluşturmadan önce bunu dikkatlice düşünmelisiniz.
CLI'yi kullanarak Subgraph Studio’ya yeni bir subgraph sürümü dağıtabilirsiniz. Bu işlem subgraph’inizi gizli olarak tutar, ancak memnun kaldığınızda Graph Gezgini’nde yayımlayabilirsiniz. Bu, Küratörlerin sinyal vermeye başlayabileceği yeni bir subgraph sürümü oluşturur.
Subgraph’i yeniden dağıtmanız gerekir ancak subgraph ID'si (IPFS hash’i) değişmezse, senkronizasyona baştan başlamanıza gerek kalmaz.
7. Subgraph eşlemelerinden sözleşme fonksiyonunu nasıl çağırabilir veya bir genel durum değişkenine nasıl erişebilirim?
bölümündeki Akıllı sözleşmeye erişim
kısmına göz atın.
Eşleyiciler AssemblyScript ile yazıldığından dolayı şu anda mümkün değil.
Bunun alternatif bir çözümü, verileri varlıklarda ham halde depolayıp, JS kütüphanelerine ihtiyaç duyan işlemleri istemci üzerinde gerçekleştirmektir.
9. Birden fazla sözleşmeyi dinlerken, olayları dinlenecek sözleşmelerin sırasını seçmek mümkün müdür?
Bir subgraph içindeki olaylar, birden fazla sözleşme üzerinde olup olmamaya bakmaksızın her zaman bloklarda göründükleri sırayla işlenir.
Şablonlar, subgraph’iniz endeksleme yaparken veri kaynaklarını hızlıca oluşturmanızı sağlar. Sözleşmeniz, kullanıcılar etkileşime girdikçe yeni sözleşmeler yaratabilir. Bu sözleşmelerin yapısını (ABI, olaylar vb.) önceden bildiğinizden, onları nasıl endekslemek istediğinizi bir şablonda tanımlayabilirsiniz. Yeni sözleşmeler oluşturulduğunda, subgraph’iniz sözleşme adresini tespit ederek dinamik bir veri kaynağı oluşturacaktır.
"Bir Veri Kaynağı Şablonunu Başlatma" bölümüne göz atın: .
11. graph init
komutunu graph-cli
ile kullanarak iki sözleşme içeren bir subgraph kurmak mümkün müdür? Yoksa graph init
komutunu çalıştırdıktan sonra subgraph.yaml
dosyasına elle bir başka dataSource eklemem mi gerekir?
Evet, mümkündür. graph init
komutunu kullanırken, sözleşmeleri art arda girerek birden fazla dataSource ekleyebilirsiniz.
Ayrıca, yeni bir dataSource eklemek için graph add
komutunu da kullanabilirsiniz.
Olay ve çağrı işleyicileri, öncelikle blok içindeki işlem indisine göre sıralanır. Aynı işlem içindeki olay ve çağrı işleyicileri, şu sıralama kuralına düzenlenir: önce olay işleyicileri, ardından çağrı işleyicileri gelir; her tür kendi içinde manifestoda tanımlandığı sıraya uyar. Blok işleyicileri, olay ve çağrı işleyicilerinden sonra çalıştırılır ve manifestoda tanımlandıkları sıraya göre gerçekleştirilir. Ayrıca, bu sıralama kuralları değişime tabi olabilir.
Yeni dinamik veri kaynakları oluşturulduğunda, dinamik veri kaynakları için tanımlanan işleyiciler yalnızca mevcut tüm veri kaynağı işleyicileri işlendiğinde işlemeye başlar ve her tetiklendiğinde aynı sırada tekrar eder.
Aşağıdaki komutu çalıştırabilirsiniz:
docker pull graphprotocol/graph-node:latest
Not: docker / docker-compose, ilk çalıştırdığınızda çekilen graph-node sürümünü kullanmaya devam edecektir. Bu yüzden en son graph-node sürümünü kullandığınızdan emin olun.
14. Olayları işlerken bir varlık için "otomatik oluşturulan" id'leri yaratmanın önerilen yolu nedir?
Eğer olay sırasında yalnızca bir varlık oluşturuluyorsa ve daha iyi bir seçenek yoksa, işlem hash'i + log indisi benzersiz bir id olur. Bunları Bytes'a dönüştürüp crypto.keccak256
üzerinden geçirerek gizleyebilirsiniz ancak bu işlemi daha benzersiz hale getirmez.
Yes, you can and your subgraph.
Desteklenen ağların listesini bulabilirsiniz.
17. Olay işleyicileri içerisinde ağlar (mainnet, Sepolia, yerel) arasında ayrım yapmak mümkün müdür?
Evet, mümkündür. Aşağıdaki örnekteki gibi graph-ts
kullanarak yapabilirsiniz:
import { dataSource } from '@graphprotocol/graph-ts'dataSource.network()dataSource.address()
Evet. Sepolia, blok işleyicileri, çağrı işleyicileri ve olay işleyicilerini destekler. Olay işleyicilerinin diğer iki işleyiciye göre çok daha yüksek performansa sahip olduğu ve tüm EVM uyumlu ağlarda desteklendiği unutulmamalıdır.
Evet. subgraph.yaml
dosyasındaki dataSources.source.startBlock
, veri kaynağının endekslemeye başladığı blok numarasını belirtir. Çoğu durumda, sözleşmenin oluşturulduğu bloğun kullanılmasını öneriyoruz. Daha fazla bilgi için:
20. Endeksleme performansını artırmak için ipuçları var mı? Subgraph'imin senkronize edilmesi çok uzun zaman alıyor
Sözleşmenin dağıtıldığı bloktan itibaren endeksleme yapmak için opsiyonel başlangıç bloğu özelliğine göz atabilirsiniz:
21. Subgraph üzerinde doğrudan sorgulama yaparak endekslenmiş en son blok numarasını öğrenmenin bir yolu var mı?
Var! Aşağıdaki komutu, "organization/subgraphName" kısmına subgraph'inizi yayımladığınız organizasyon adını ve subgraph'inizin adını koyarak deneyin:
curl -X POST -d '{ "query": "{indexingStatusForCurrentVersion(subgraphName: \"organization/subgraphName\") { chains { latestBlock { hash number }}}}"}' https://api.thegraph.com/index-node/graphql
Varsayılan olarak, sorgu yanıtları koleksiyon başına 100 ögeyle sınırlıdır. Daha fazlasını almak istiyorsanız koleksiyon başına 1000 ögeye kadar çıkabilirsiniz. Daha da fazlası için şu şekilde sayfalama yapabilirsiniz:
someCollection(first: 1000, skip: <sayı>) { ... }
23. If my dapp frontend uses The Graph for querying, do I need to write my API key into the frontend directly? What if we pay query fees for users – will malicious users cause our query fees to be very high?
Şu anda, bir merkeziyetsiz uygulama için önerilen yaklaşım, anahtarı önyüze eklemek ve son kullanıcılara göstermektir. Bununla birlikte, bu anahtarı yourdapp.io gibi bir sunucu adına ve bir subgraph'e sınırlayabilirsiniz. Ağ geçidi şu anda Edge & Node tarafından çalıştırılıyor. Bir ağ geçidinin sorumluluğunun bir kısmı, kötü amaçlı davranışları izlemek ve kötü niyetli istemcilerden gelen trafiği engellemektir.
Federation henüz desteklenmiyor. Şu anda, şema birleştirme yöntemini ya istemci tarafında ya da bir proxy hizmeti aracılığıyla kullanabilirsiniz.