Ana içeriğe atla

Substrate EVM Desteği

SubQuery TeamYaklaşık 2 dakika

Substrate EVM Desteği

Moonbeam'in ve Moonriver'ın EVM'si için özel bir veri kaynağı işlemcisi sağlıyoruz. Bu, tek bir SubQuery projesi içinde Moonbeam ağlarındaki hem EVM hem de Substrat etkinliğini filtrelemek ve indekslemek için basit bir yol sunar.

Desteklenen ağlar:

Ağ AdıWebsocket Bitim NoktasıSözlük Bitim Noktası
Moonbeamwss://moonbeam.api.onfinality.io/public-wshttps://api.subquery.network/sq/subquery/moonbeam-dictionary
Moonriverwss://moonriver.api.onfinality.io/public-wshttps://api.subquery.network/sq/subquery/moonriver-dictionary
Moonbase Alphawss://moonbeam-alpha.api.onfinality.io/public-wshttps://api.subquery.network/sq/subquery/moonbase-alpha-dictionary

** Ayrıca bir olay ve çağrı işleyicisi ile basic Moonriver EVM örnek projesineopen in new window başvurabilirsiniz.** Bu proje ayrıca buradaopen in new window, SubQuery Explorer’da canlı olarak barındırılır.

Başlarken

  1. Özel veri kaynağını bir bağımlılık olarak ekleyin yarn @subql/contract-processors ekleyin
  2. Aşağıda açıklandığı gibi özel bir veri kaynağı ekleyin
  3. Kodunuza özel veri kaynağı için işleyiciler ekleyin

Veri Kaynağı Spesifikasyonu

AlanTipGerekliAçıklama
processor.file'./node_modules/@subql/contract-processors/dist/moonbeam.js'EvetVeri işlemci koduna dosya referansı
processor.optionsProcessorOptionsHayırMoonbeam İşlemciye özel seçenekler
varlıklar{ [key: String]: { file: String }}HayırHarici varlık dosyalarının bir nesnesi

İşlemci Seçenekleri

AlanTipGerekliAçıklama
abiStringHayırİşlemci tarafından argümanları ayrıştırmak için kullanılan ABI. varlıkların anahtarı OLMALIDIR
adresString veya nullHayırEtkinliğin geldiği veya aramanın yapıldığı bir sözleşme adresi. null sözleşme oluşturma çağrılarını yakalayacak

MoonbeamCall

Farklı bir işleyici argümanı ve küçük filtreleme değişiklikleri dışında substrate/CallHandler ile aynı şekilde çalışır.

AlanTipGerekliTarif
tür'substrate/MoonbeamCall'EvetBunun bir Çağrı türü işleyicisi olduğunu belirtir
filtreÇağrı FiltresiHayırYürütülecek veri kaynağını filtreleyin

Çağrı Filtresi

AlanTipÖrneklerAçıklama
fonksiyonString0x095ea7b30x095ea7b3, approve(address to,uint256 value)Sözleşmede çağrılan işlevi filtrelemek için Fonksiyon İmzasıopen in new window dizeleri veya sighash işlevi
göndericiString0x6bd193ee6d2104f14f94e2ca6efefae561a4334bİşlemi gönderen bir Ethereum adresi

İşleyiciler

Normal bir işleyiciden farklı olarak, parametre olarak bir SubstrateExtrinsic almazsınız, bunun yerine Ethers TransactionResponseopen in new window türüne dayalı bir MoonbeamCall alırsınız.

TransactionResponse türünden değişiklikler:

  • bekle ve onaylarözelliklerine sahip değil
  • İşlemin başarılı olup olmadığını öğrenmek için bir success özelliği eklendi
  • abi alanı sağlanmışsa ve bağımsız değişkenler başarıyla ayrıştırılabiliyorsa args eklenir

MoonbeamEvent

Farklı bir işleyici argümanı ve küçük filtreleme değişiklikleri dışında substrate/CallHandler ile aynı şekilde çalışır.

AlanTipGerekliTarif
tür'substrate/MoonbeamEvent'EvetBunun bir Çağrı türü işleyicisi olduğunu belirtir
filtreEtkinlik FiltresiHayırYürütülecek veri kaynağını filtreleyin

Etkinlik filtreleri

AlanTipÖrneklerTarif
konuDizge dizisiTransfer(adres indekslendi, adres indekslendi, uint256 değeri)Konular filtresi, Ethereum JSON-PRC günlük filtrelerini takip eder, daha fazla belge buradaopen in new window bulunabilir.

Konularla ilgili not:

Temel günlük filtrelerinde birkaç iyileştirme var:

İşleyiciler

Normal bir işleyiciden farklı olarak, parametre olarak bir SubstrateExtrinsic almazsınız, bunun yerine Ethers TransactionResponseopen in new window türüne dayalı bir MoonbeamCall alırsınız.

Günlük türünden değişiklikler:

  • abi alanı sağlanmışsa ve bağımsız değişkenler başarıyla ayrıştırılabiliyorsa args eklenir

Veri Kaynağı Örneği

Bu, project.yaml bildirim dosyasından bir alıntıdır.

dataSources:
  - kind: substrate/Moonbeam
    startBlock: 752073
    processor:
      file: "./node_modules/@subql/contract-processors/dist/moonbeam.js"
      options:
        # Must be a key of assets
        abi: erc20
        # Contract address (or recipient if transfer) to filter, if `null` should be for contract creation
        address: "0x6bd193ee6d2104f14f94e2ca6efefae561a4334b"
    assets:
      erc20:
        file: "./erc20.abi.json"
    mapping:
      file: "./dist/index.js"
      handlers:
        - handler: handleMoonriverEvent
          kind: substrate/MoonbeamEvent
          filter:
            topics:
              - Transfer(address indexed from,address indexed to,uint256 value)
        - handler: handleMoonriverCall
          kind: substrate/MoonbeamCall
          filter:
            ## The function can either be the function fragment or signature
            # function: '0x095ea7b3'
            # function: '0x7ff36ab500000000000000000000000000000000000000000000000000000000'
            # function: approve(address,uint256)
            function: approve(address to,uint256 value)
            from: "0x6bd193ee6d2104f14f94e2ca6efefae561a4334b"

Bilinen sınırlamalar

  • Şu anda bir işleyici içinde EVM durumunu sorgulamanın bir yolu yok
  • Çağrı işleyicilerle işlem makbuzlarını almanın bir yolu yok
  • blockHash özellikleri şu anda tanımsız bırakılmıştır, bunun yerine blockNumber özelliği kullanılabilir