subgraphs > Cookbook > Arweave Üzerinde Subgraphlar Oluşturma

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 Discord 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 Nedir?

Bu bölüme bağlantı

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:

  • Arwiki
  • Arweave Kaynakları

Arweave Subgraphları Nedir?

Bu bölüme bağlantı

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 GraphQL kullanarak bu verileri sorgulayabilmeleri adına verileri sunucularında kaydetmeleri gerektiğini söylemek için kullanılır.

Graph Düğümü 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.

Bir Arweave Subgraph'ı Oluşturma

Bu bölüme bağlantı

Arweave Subgraphları oluşturabilmek ve dağıtabilmek için iki pakete ihtiyacınız vardır:

  1. @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 buraya tıklayın.
  2. @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 buraya tıklayın.

Subgraph'ın bileşenleri

Bu bölüme bağlantı

Bir subgraph'ın üç bileşeni vardır:

1. Manifest - subgraph.yaml

Bu bölüme bağlantı

İlgilenilen veri kaynaklarını ve bunların nasıl işlenmesi gerektiğini tanımlar. Arweave yeni bir veri kaynağı türüdür.

2. Şema - schema.graphql

Bu bölüme bağlantı

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 mevcut dokümantasyonda ele alınmıştır.

3. AssemblyScript Eşleştirmeleri - mapping.ts

Bu bölüme bağlantı

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 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. Bir Arweave subgraph'ı özelinde örnek bir subgraph manifesti için aşağıya bakınız:

specVersion: 0.0.5
description: Arweave Blocks Indexing
schema:
file: ./schema.graphql # şema dosyasına bağlantı
dataSources:
- kind: arweave
name: arweave-blocks
network: arweave-mainnet # Graph yalnızca Arweave Ana Ağı'nı destekler
source:
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ın
mapping:
apiVersion: 0.0.5
language: wasm/assemblyscript
file: ./src/blocks.ts # Assemblyscript eşleştirmelerinin bulunduğu dosyaya bağlantı
entities:
- Block
- Transaction
blockHandlers:
- 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ın source.owner'ının sahibi olduğu her işlemde çalıştırılır. Şu anda transactionHandlers için bir sahip gereklidir. Kullanıcılar tüm işlemleri işlemek istiyorlarsa source.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.

Note: Irys (previously Bundlr) transactions are not supported yet.

Şema Tanımı

Bu bölüme bağlantı

Ş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ı burada bulunmaktadır.

AssemblyScript Eşlemeleri

Bu bölüme bağlantı

Olayları işlemek için işleyiciler AssemblyScript içinde yazılmıştır.

Arweave indexing introduces Arweave-specific data types to the AssemblyScript API.

class Block {
timestamp: u64
lastRetarget: u64
height: u64
indepHash: Bytes
nonce: Bytes
previousBlock: Bytes
diff: Bytes
hash: Bytes
txRoot: Bytes
txs: Bytes[]
walletList: Bytes
rewardAddr: Bytes
tags: Tag[]
rewardPool: Bytes
weaveSize: Bytes
blockSize: Bytes
cumulativeDiff: Bytes
hashListMerkle: Bytes
poa: ProofOfAccess
}
class Transaction {
format: u32
id: Bytes
lastTx: Bytes
owner: Bytes
tags: Tag[]
target: Bytes
quantity: Bytes
data: Bytes
dataSize: Bytes
dataRoot: Bytes
signature: Bytes
reward: 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 buraya tıklayın.

Deploying an Arweave Subgraph in Subgraph Studio

Bu bölüme bağlantı

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 Subgraph'ını Sorgulama

Bu bölüme bağlantı

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 GraphQL API dökümantasyonunu ziyaret edin.

Örnek Subgraph'ler

Bu bölüme bağlantı

İşte referans olması için örnek bir subgraph:

Bir subgraph Arweave ve diğer zincirleri indeksleyebilir mi?

Bu bölüme bağlantı

Hayır, bir subgraph yalnızca bir zincirden/ağdan veri kaynaklarını destekleyebilir.

Depolanmış dosyaları Arweave üzerinde indeksleyebilir miyim?

Bu bölüme bağlantı

Şu anda Graph, Arweave'yi yalnızca bir blok zinciri (blokları ve işlemleri) olarak indekslemektedir.

Subgraph'ımdaki Bundlr paketlerini tanımlayabilir miyim?

Bu bölüme bağlantı

Bu şu anda desteklenmemektedir.

İşlemleri belirli bir hesaba özel olarak nasıl filtreleyebilirim?

Bu bölüme bağlantı

source.owner kullanıcının genel anahtarı veya hesap adresi olabilir.

Mevcut şifreleme formatı nedir?

Bu bölüme bağlantı

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ı). Arweave Explorer 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 write
result += alphabet[bytes[i - 2] >> 2];
result += alphabet[(bytes[i - 2] & 0x03) << 4];
if (!urlSafe) {
result += "==";
}
}
if (!urlSafe && i === l) { // 2 octets yet to write
result += 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;
}
Sayfayı Düzenle

Önceki
Cosmos'ta Subgraph'ler Oluşturma
Sonraki
Bir Sözleşmeyi Değiştirin ve Graftlama ile Geçmişini Koruyun
Sayfayı Düzenle