6 minutes
Developer FAQ
Bu sayfa, The Graph üzerinde geliştirme yapan geliştiricilerin sunduğu en yaygın soruların bazılarını özetlemektedir.
Subgraph ile İlgili Sorular
1. Subgraph nedir?
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.
2. Subgraph oluşturmanın ilk adımı nedir?
To successfully create a subgraph, you will need to install The Graph CLI. Review the Quick Start to get started. For detailed information, see Creating a Subgraph.
3. Akıllı sözleşmelerim olay içermiyorsa yine de subgraph oluşturabilir miyim?
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.
4. Subgraph’ımla ilişkili GitHub hesabını değiştirebilir miyim?
Hayır. Bir subgraph oluşturulduktan sonra, ilişkili GitHub hesabı değiştirilemez. Bu nedenle, subgraph oluşturmadan önce bunu dikkatlice düşünmelisiniz.
5. Mainnet’teki bir subgraph nasıl güncellenir?
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.
6. Bir subgraph’i yeniden dağıtmadan başka bir hesaba veya uç noktaya kopyalayabilir miyim?
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?
Take a look at Access to smart contract
state inside the section AssemblyScript API.
8. Can I import ethers.js
or other JS libraries into my subgraph mappings?
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.
10. Şablonlar veri kaynaklarından ne açıdan farklıdır?
Ş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.
Check out the “Instantiating a data source template” section on: Data Source Templates.
11. Is it possible to set up a subgraph using graph init
from graph-cli
with two contracts? Or should I manually add another dataSource in subgraph.yaml
after running graph init
?
Yes. On graph init
command itself you can add multiple dataSources by entering contracts one after the other.
You can also use graph add
command to add a new dataSource.
12. Bir veri kaynağı için olay, blok ve çağrı işleyicileri hangi sırayla tetiklenir?
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.
13. Yerel çalışma ortamımda graph-node’un en son sürümünü kullandığımdan nasıl emin olabilirim?
Aşağıdaki komutu çalıştırabilirsiniz:
1docker 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?
If only one entity is created during the event and if there’s nothing better available, then the transaction hash + log index would be unique. You can obfuscate these by converting that to Bytes and then piping it through crypto.keccak256
but this won’t make it more unique.
15. Subgraph’imi silebilir miyim?
Yes, you can delete and transfer your subgraph.
Ağ ile İlgili Sorular
16. The Graph hangi ağları desteklemektedir?
You can find the list of the supported networks here.
17. Olay işleyicileri içerisinde ağlar (mainnet, Sepolia, yerel) arasında ayrım yapmak mümkün müdür?
Yes. You can do this by importing graph-ts
as per the example below:
1import { dataSource } from '@graphprotocol/graph-ts'23dataSource.network()4dataSource.address()
18. Sepolia ağında blok ve çağrı işleyicilerini destekliyor musunuz?
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.
Indexing & Querying Related
19. Endekslemeye hangi bloktan başlanacağını belirtmek mümkün müdür?
Yes. dataSources.source.startBlock
in the subgraph.yaml
file specifies the number of the block that the dataSource starts indexing from. In most cases, we suggest using the block where the contract was created: Start blocks
20. Endeksleme performansını artırmak için ipuçları var mı? Subgraph’imin senkronize edilmesi çok uzun zaman alıyor
Yes, you should take a look at the optional start block feature to start indexing from the block where the contract was deployed: Start blocks
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:
1curl -X POST -d '{ "query": "{indexingStatusForCurrentVersion(subgraphName: \"organization/subgraphName\") { chains { latestBlock { hash number }}}}"}' https://api.thegraph.com/index-node/graphql
22. The Graph’in sorgu başına kaç nesne döndürebileceğine dair bir sınır var mı?
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:
1someCollection(first: 1000, skip: <number>) { ... }
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?
Currently, the recommended approach for a dapp is to add the key to the frontend and expose it to end users. That said, you can limit that key to a hostname, like yourdapp.io and subgraph. The gateway is currently being run by Edge & Node. Part of the responsibility of a gateway is to monitor for abusive behavior and block traffic from malicious clients.
Diğer
24. Apollo Federation’ı graph-node üzerinde kullanmak mümkün mü?
Federation henüz desteklenmiyor. Şu anda, şema birleştirme yöntemini ya istemci tarafında ya da bir proxy hizmeti aracılığıyla kullanabilirsiniz.