Moralis 智能合約事件

2022-11-14 10:33 更新

為什么我們需要同步和觀看智能合約事件?

當(dāng)智能合約中發(fā)生智能合約想要與 ?dapp ?和其他智能合約通信的有意義的事情時,智能合約會發(fā)出所謂的事件。 智能合約的開發(fā)人員決定何時發(fā)出這些事件。 例如 - 當(dāng)有人發(fā)送 ERC20 代幣時 - 代幣合約將發(fā)出一個包含有關(guān)轉(zhuǎn)賬的所有數(shù)據(jù)的 ?Transferevent?。

當(dāng)您構(gòu)建 ?dapps ?時,能夠?qū)崟r收聽這些事件對您來說非常重要。 例如,如果您正在構(gòu)建 NFT 市場,您的 ?dapp ?需要知道何時有人創(chuàng)建了新的拍賣或有人對某項商品出價——智能合約將通過發(fā)出事件來傳達(dá)這些事件。

幸運(yùn)的是,Moralis Server 內(nèi)置了此功能。

您可以實時收聽智能合約事件,還可以獲取特定事件的所有歷史事件。

同步和觀看合約事件

定義

您可以從特定的智能合約主題中獲取所有歷史事件并實時收聽新事件。 它需要以下信息:

  • ?_description?:_用于標(biāo)識此同步作業(yè)的簡短描述。
  • ?_topic?: _你將要聽的主題,這可以是定義或 sha3:
    • ?bet(address,uint256,bool)?
    • ?0x20d932006281d267f137cd3921b707c2097e1f041b1291181cc3d0e86f449ebb?
  • ?abi?:如果您為此事件提供 abi,Moralis 將自動解析所有字段并相應(yīng)地填充架構(gòu)。
  • ?address?:您將為此事件收聽的地址。
  • ?tableName?:將在 Moralis 數(shù)據(jù)庫中創(chuàng)建的子類的名稱。

如果您不提供 _**abi **_,則將使用以下架構(gòu):

{
    "objectId": String,
    "block_hash": String,
    "topic0": String,
    "topic1": String,
    "block_timestamp": Date,
    "ACL": ACL,
    "data": String,
    "updatedAt": Date,
    "transaction_hash": String,
    "transaction_index": Number,
    "address": String,
    "log_index": Number,
    "createdAt": Date,
    "block_number": Number
}

這是一個有效 ?abi ?的示例:

{
  "anonymous": false,
  "inputs": [
    {
      "indexed": true,
      "internalType": "address",
      "name": "user",
      "type": "address"
    },
    {
      "indexed": true,
      "internalType": "uint256",
      "name": "bet",
      "type": "uint256"
    },
    {
      "indexed": true,
      "internalType": "bool",
      "name": "win",
      "type": "bool"
    },
    {
      "indexed": false,
      "internalType": "uint8",
      "name": "side",
      "type": "uint8"
    }
  ],
  "name": "bet",
  "type": "event"
}

如果提供的 ?abi ?包含“?id?”輸入,則由于在 Moralis.Object 中保留字段“?id?”,它將被解析為“?uid?”

表名字段限制

表名不允許包含數(shù)字字符(0 到 9)

名稱字段限制

以 ?_? 開頭的名稱字段暫時不起作用,例如 ?"name": "_side"? 將不起作用,您必須將其更改為 ?"name": "side"? 才能使其起作用 .

歷史事件限額

如果創(chuàng)建的同步作業(yè)會導(dǎo)致檢索更多歷史事件,則?Sync_historical?選項將被禁用并且不會保存歷史數(shù)據(jù)??梢月?lián)系支持人員升級您的帳戶以啟用保存它,無論如何,但在這樣做之前要仔細(xì)考慮是否真的有必要。可以實時處理事件而無需將數(shù)據(jù)保存到數(shù)據(jù)庫中。

編輯

要編輯同步作業(yè),請單擊安裝插件的服務(wù)器上的查看詳細(xì)信息,然后轉(zhuǎn)到?sync?選項卡。 在那里,您將看到所有同步作業(yè)。 單擊?Edit?按鈕。

image (2)

由于進(jìn)行任何更改都可能對事件架構(gòu)造成重大更改,因此保存更改需要提供新的 ?tableName?。 

如果未提供新表名,您將看到以下錯誤消息:

image (3)

事件過濾器

想象一下,您只想根據(jù)某些條件在數(shù)據(jù)庫中獲取事件。

Moralis 為您提供了一種基于 ABI 變量定義過濾器的簡單方法。

例如,下面的過濾器將僅同步可變?price?等于 80000000000000000 的事件實例:

?{“eq”:[“price”,“80000000000000000”]} ?

下面是更多過濾器示例。 您可以為事件中的任何變量設(shè)置條件。

If ?sender ?= ?0x0? AND ?receiver ?=? 0x0?

{
  "and": [
    { "eq": ["sender", "0x0"] },
    { "eq": ["receiver", "0x0"] }
  ]
}

If ?sender ?= ?0x0? OR ?receiver ?= ?0x0?

{
  "or": [
    { "eq": ["sender", "0x0"] },
    { "eq": ["receiver", "0x0"] }
  ]
}

If (?sender ?= ?0x0? AND ?amount ?= ?1000 ?) OR (?receiver ?= ?0x0? AND ?amount ?= ?100 ?)

{
  "or": [
    {
      "and": [
       { "eq": ["sender", "0x0"] },
       { "eq": ["amount", "1000"]}
      ]
    },
    {
      "and": [
       { "eq": ["receiver", "0x0"] },
       { "eq": ["amount", "1000"]}
      ]
    }
  ]
}

如果一個事件有 ?wei ?命名的值,你可以使用 ?<name>_decimals? 字段來運(yùn)行比較(比如大于/小于):

{
  "and": [
    { "eq": ["sender", "0x0"] },
    { "gt": ["amount_decimals", "1000"]}
  ]
}

從代碼看

觀看新的智能合約活動

Moralis Server 有一個特殊的云功能,稱為 ?watchContractEvent(options)?。 您可以使用主密鑰調(diào)用它。

注意:?limit ?參數(shù)僅適用于 Nitro 服務(wù)器(具有 ?coreservices ?插件的服務(wù)器)。 如果未提供限制參數(shù),則默認(rèn)值為 500000。

注意:目前通過代碼創(chuàng)建的事件不會在管理界面中看到,您只能在數(shù)據(jù)庫中看到它們,我們正在努力正確連接管理界面

// code example of creating a sync event from cloud code
let options = {
  chainId: "0x1",
  address: "0x5c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f",
  topic: "PairCreated(address, address, address, uint256)",
  abi: {
    anonymous: false,
    inputs: [
      {
        indexed: true,
        internalType: "address",
        name: "token0",
        type: "address",
      },
      {
        indexed: true,
        internalType: "address",
        name: "token1",
        type: "address",
      },
      {
        indexed: false,
        internalType: "address",
        name: "pair",
        type: "address",
      },
      {
        indexed: false,
        internalType: "uint256",
        name: "test",
        type: "uint256",
      },
    ],
    name: "PairCreated",
    type: "event",
  },
  limit: 500000,
  tableName: "UniPairCreated",
  sync_historical: false,
};

Moralis.Cloud.run("watchContractEvent", options, { useMasterKey: true });

取消觀看現(xiàn)有的智能合約事件

// unwatch event that has TABLE_NAME as table in the database
let options = { tableName: "TABLE_NAME" };
Moralis.Cloud.run("unwatchContractEvent", options, { useMasterKey: true });


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號