树叶云Moralis教程:Moralis 智能合约事件

为什么我们需要同步和观看智能合约事件?

当智能合约中发生智能合约想要与 ​dapp ​和其他智能合约通信的有意义的事情时,智能合约会发出所谓的事件。 智能合约的开发人员决定何时发出这些事件。 例如 – 当有人发送 ERC20 代币时 – 代币合约将发出一个包含有关转账的所有数据的 ​Transferevent​。

当您构建 ​dapps ​时,能够实时收听这些事件对您来说非常重要。 例如,如果您正在构建 NFT 市场,您的 ​dapp ​需要知道何时有人创建了新的拍卖或有人对某项商品出价——智能合约将通过发出事件来传达这些事件。

幸运的是,Moralis Server 内置了此功能。

您可以实时收听智能合约事件,还可以获取特定事件的所有历史事件。

同步和观看合约事件

定义

您可以从特定的智能合约主题中获取所有历史事件并实时收听新事件。 它需要以下信息:

  • _description​:_用于标识此同步作业的简短描述。
  • _topic​: _你将要听的主题,这可以是定义或 sha3:
    • bet(address,uint256,bool)
    • 0x20d932006281d267f137cd3921b707c2097e1f041b1291181cc3d0e86f449ebb
  • abi​:如果您为此事件提供 abi,Moralis 将自动解析所有字段并相应地填充架构。
  • address​:您将为此事件收听的地址。
  • tableName​:将在 Moralis 数据库中创建的子类的名称。

如果您不提供 _**abi **_,则将使用以下架构:

{
    "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​”

表名字段限制

表名不允许包含数字字符(0 到 9)

名称字段限制

以 ​_​ 开头的名称字段暂时不起作用,例如 ​"name": "_side"​ 将不起作用,您必须将其更改为 ​"name": "side"​ 才能使其起作用 .

历史事件限额

如果创建的同步作业会导致检索更多历史事件,则​Sync_historical​选项将被禁用并且不会保存历史数据。可以联系支持人员升级您的帐户以启用保存它,无论如何,但在这样做之前要仔细考虑是否真的有必要。可以实时处理事件而无需将数据保存到数据库中。

编辑

要编辑同步作业,请单击安装插件的服务器上的查看详细信息,然后转到​sync​选项卡。 在那里,您将看到所有同步作业。 单击​Edit​按钮。

由于进行任何更改都可能对事件架构造成重大更改,因此保存更改需要提供新的 ​tableName​。 

如果未提供新表名,您将看到以下错误消息:

事件过滤器

想象一下,您只想根据某些条件在数据库中获取事件。

Moralis 为您提供了一种基于 ABI 变量定义过滤器的简单方法。

例如,下面的过滤器将仅同步可变​price​等于 80000000000000000 的事件实例:

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

下面是更多过滤器示例。 您可以为事件中的任何变量设置条件。

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​ 字段来运行比较(比如大于/小于):

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

从代码看

观看新的智能合约活动

Moralis Server 有一个特殊的云功能,称为 ​watchContractEvent(options)​。 您可以使用主密钥调用它。

注意:​limit ​参数仅适用于 Nitro 服务器(具有 ​coreservices ​插件的服务器)。 如果未提供限制参数,则默认值为 500000。

注意:目前通过代码创建的事件不会在管理界面中看到,您只能在数据库中看到它们,我们正在努力正确连接管理界面

// 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 });

取消观看现有的智能合约事件

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

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/238239.html<

(0)
运维的头像运维
上一篇2025-04-22 20:37
下一篇 2025-04-22 20:39

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注