Arweave Üzerinde Subgraphlar Oluşturma
Reading time: 6 min
Arweave support in Graph Node and on Subgraph Studio is in beta: please reach us on with any questions about building Arweave subgraphs!
Bu rehberde, Arweave blok zincirini indekslemek için nasıl Subgraphs oluşturacağınızı ve dağıtacağınızı öğreneceksiniz.
Arweave protokolü geliştiricilere verileri kalıcı olarak depolama imkanı sağlar ve bu, Arweave ile IPFS arasındaki temel farktır. IPFS'de böyle bir özellik bulunmaz; yani IPFS'te depolanan dosyalar kalıcı değildir ve Arweave'de depolanan dosyalar değiştirilemez veya silinemez.
Arweave, protokolü farklı programlama dillerine entegre etmek için halihazırda çok sayıda kütüphane oluşturmuştur. Daha fazla bilgi için şurayı kontrol edebilirsiniz:
Graph, "Subgraphs" adı verilen size özel açık API'lar oluşturmanıza olanak tanır. Subgraphlar, indeksleyicilere (sunucu operatörleri) bir blok zincirinde hangi verileri indekslemeleri gerektiğini ve daha sonra istedikleri zaman kullanarak bu verileri sorgulayabilmeleri adına verileri sunucularında kaydetmeleri gerektiğini söylemek için kullanılır.
artık Arweave protokolündeki verileri indeksleyebiliyor. Mevcut entegrasyon Arweave'i yalnızca bir blok zinciri (bloklar ve işlemler) olarak indeksliyor, ancak henüz depolanan dosyaları indekslemiyor.
Arweave Subgraphları oluşturabilmek ve dağıtabilmek için iki pakete ihtiyacınız vardır:
@graphprotocol/graph-cli
'nin 0.30.2 sürümünün üstü - Bu, subgraphları oluşturmak ve dağıtmak için kullanılan bir komut satırı aracıdır.npm
kullanarak indirmek için .@graphprotocol/graph-ts
'in 0.27.0 sürümünün üstü - Bu, subgraph'a özgü tiplerin bulunduğu bir kütüphanedir.npm
kullanarak indirmek için .
Bir subgraph'ın üç bileşeni vardır:
İlgilenilen veri kaynaklarını ve bunların nasıl işlenmesi gerektiğini tanımlar. Arweave yeni bir veri kaynağı türüdür.
Burada, GraphQL kullanarak Subgraph'ınızı indeksledikten sonra hangi verileri sorgulayabilmek istediğinizi tanımlarsınız. Bu aslında, modelin bir istek gövdesinin yapısını tanımladığı bir API modeline benzer.
Arweave subgraphları için gereksinimler ele alınmıştır.
Bu, birisi sizin etkinliklerini gözlemlediğiniz veri kaynaklarıyla etkileşimde bulunduğunda verinin nasıl alınması ve depolanması gerektiğini belirleyen mantıktır. Veri çevrilir ve belirttiğiniz şemaya göre depolanır.
Subgraph geliştirme sırasında iki anahtar komut vardır:
$ graph codegen # manifest'de tanımlanan şema dosyasından tipleri üretir$ graph build # AssemblyScript dosyalarından Web Assembly oluşturur ve tüm subgraph dosyalarını bir /build klasöründe hazırlar
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. Bir Arweave subgraph'ı özelinde örnek bir subgraph manifesti için aşağıya bakınız:
specVersion: 0.0.5description: Arweave Blocks Indexingschema:file: ./schema.graphql # şema dosyasına bağlantıdataSources:- kind: arweavename: arweave-blocksnetwork: arweave-mainnet # Graph yalnızca Arweave Ana Ağı'nı desteklersource:owner: 'ID-OF-AN-OWNER' # Bir Arweave cüzdanının açık anahtarıstartBlock: 0 # indekslemeyi zincir oluşumundan başlatmak için bunu 0 olarak ayarlayınmapping:apiVersion: 0.0.5language: wasm/assemblyscriptfile: ./src/blocks.ts # Assemblyscript eşleştirmelerinin bulunduğu dosyaya bağlantıentities:- Block- TransactionblockHandlers:- handler: handleBlock # eşleştirme dosyasındaki fonksiyon adıtransactionHandlers:- handler: handleTx # eşleştirme dosyasındaki fonksiyon adı
- Arweave subgraphları yeni bir veri kaynağı türünü tanıtır (
arweave
) - The network should correspond to a network on the hosting Graph Node. In Subgraph Studio, Arweave's mainnet is
arweave-mainnet
- Arweave veri kaynakları, bir Arweave cüzdanının genel anahtarı olan opsiyonel bir source.owner alanı sunar
Arweave veri kaynakları iki tür işleyiciyi destekler:
blockHandlers
- Her yeni Arweave bloğunda çalıştırılır. source.owner gerekli değildir.transactionHandlers
- Veri kaynağınınsource.owner
'ının sahibi olduğu her işlemde çalıştırılır. Şu andatransactionHandlers
için bir sahip gereklidir. Kullanıcılar tüm işlemleri işlemek istiyorlarsasource.owner
olarak "" sağlamalıdırlar
source.owner, sahibin adresi veya Genel Anahtarı olabilir.
İşlemler Arweave permaweb'in yapı taşlarıdır ve son kullanıcılar tarafından oluşturulan nesnelerdir.
Şema tanımı, ortaya çıkan subgraph veritabanının yapısını ve varlıklar arasındaki ilişkileri tanımlar. Bu, orijinal veri kaynağından bağımsızdır. Subgraph şema tanımı hakkında daha fazla ayrıntı bulunmaktadır.
Olayları işlemek için işleyiciler içinde yazılmıştır.
Arweave indexing introduces Arweave-specific data types to the .
class Block {timestamp: u64lastRetarget: u64height: u64indepHash: Bytesnonce: BytespreviousBlock: Bytesdiff: Byteshash: BytestxRoot: Bytestxs: Bytes[]walletList: BytesrewardAddr: Bytestags: Tag[]rewardPool: BytesweaveSize: BytesblockSize: BytescumulativeDiff: ByteshashListMerkle: Bytespoa: ProofOfAccess}class Transaction {format: u32id: ByteslastTx: Bytesowner: Bytestags: Tag[]target: Bytesquantity: Bytesdata: BytesdataSize: BytesdataRoot: Bytessignature: Bytesreward: Bytes}
Blok işleyicileri bir Block
alırken, işlemler bir Transaction
alır.
Bir Arweave Subgraph'ının eşleştirmelerini yazmak, bir Ethereum Subgraph'ının eşleştirmelerini yazmaya çok benzerdir. Daha fazla bilgi için tıklayın.
Once your subgraph has been created on your Subgraph Studio dashboard, you can deploy by using the graph deploy
CLI command.
graph deploy --access-token <your-access-token>
Arweave subgraphları için GraphQL uç noktası, mevcut API arayüzü ile şema tanımı tarafından belirlenir. Daha fazla bilgi için lütfen ziyaret edin.
İşte referans olması için örnek bir subgraph:
Hayır, bir subgraph yalnızca bir zincirden/ağdan veri kaynaklarını destekleyebilir.
Şu anda Graph, Arweave'yi yalnızca bir blok zinciri (blokları ve işlemleri) olarak indekslemektedir.
Bu şu anda desteklenmemektedir.
source.owner kullanıcının genel anahtarı veya hesap adresi olabilir.
Veri genellikle eşleştirmelere Bayt olarak aktarılır ve doğrudan depolanırsa subgraph'ta hex
formatında döndürülür (örn. blok ve işlem hashları). gibi blok gezginlerinde görüntülenenlerle eşleştirmek için eşleştirmelerinizde base64
veya base64 URL
-güvenli biçime dönüştürmek isteyebilirsiniz.
Aşağıdaki bytesToBase64(bytes: Uint8Array, urlSafe: boolean): string
yardımcı fonksiyonu kullanılabilir ve graph-ts
'ye eklenecektir:
const base64Alphabet = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M","N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z","a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m","n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z","0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/"];const base64UrlAlphabet = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M","N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z","a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m","n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z","0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "-", "_"];function bytesToBase64(bytes: Uint8Array, urlSafe: boolean): string {let alphabet = urlSafe? base64UrlAlphabet : base64Alphabet;let result = '', i: i32, l = bytes.length;for (i = 2; i < l; i += 3) {result += alphabet[bytes[i - 2] >> 2];result += alphabet[((bytes[i - 2] & 0x03) << 4) | (bytes[i - 1] >> 4)];result += alphabet[((bytes[i - 1] & 0x0F) << 2) | (bytes[i] >> 6)];result += alphabet[bytes[i] & 0x3F];}if (i === l + 1) { // 1 octet yet to writeresult += alphabet[bytes[i - 2] >> 2];result += alphabet[(bytes[i - 2] & 0x03) << 4];if (!urlSafe) {result += "==";}}if (!urlSafe && i === l) { // 2 octets yet to writeresult += alphabet[bytes[i - 2] >> 2];result += alphabet[((bytes[i - 2] & 0x03) << 4) | (bytes[i - 1] >> 4)];result += alphabet[(bytes[i - 1] & 0x0F) << 2];if (!urlSafe) {result += "=";}}return result;}