当前位置: 首页 > news >正文

【区块链安全 | 第二十九篇】合约(三)

文章目录

  • 合约
    • 事件(Events)
      • 事件的成员
      • 示例
      • 额外资源
    • 自定义错误
      • 错误的成员
    • 抽象合约
    • 接口(Interfaces)
    • 使用 using for 指令

在这里插入图片描述

合约

事件(Events)

Solidity 中的事件是对 EVM 日志功能的抽象封装。应用程序可以通过以太坊客户端的 RPC 接口订阅和监听这些事件。

事件可以在文件级别定义,或作为合约(包括接口和库)的可继承成员定义。当事件被触发时,其参数会被记录在交易的日志(log)中 —— 区块链上的一种特殊数据结构。这些日志与触发事件的合约地址相关联,包含在区块链中,并会一直保留,只要区块仍可访问(目前是永久保留,但未来可能会改变)。日志及事件数据在合约内部不可访问(即使是触发该事件的合约本身也不行)。

日志可以请求 Merkle 证明,因此如果外部实体向合约提供此类证明,合约可以验证该日志确实存在于区块链中。但由于合约只能访问最近 256 个区块的哈希,因此必须提供区块头信息。

你可以给最多三个事件参数添加 indexed 属性,使它们被加入到称为“主题(topics)”的特殊数据结构中,而不是日志的 data 部分。每个 topic 只能保存一个 word(32 字节),因此如果为引用类型参数加上 indexed,将存储其 Keccak-256 哈希值

没有 indexed 修饰的参数,会被 ABI 编码后存入日志的 data 部分。

使用 topics 可以方便地筛选事件,例如从一系列区块中过滤出特定事件。你还可以通过合约地址过滤事件。

例如,以下代码使用 web3.js 的 subscribe("logs") 方法,按特定地址匹配某个 topic:

var options = {
   
    fromBlock: 0,
    address: web3.eth.defaultAccount,
    topics: ["0x0000000000000000000000000000000000000000000000000000000000000000", null, null]
};
web3.eth.subscribe('logs', options, function (error, result) {
   
    if (!error)
        console.log(result);
})
    .on("data", function (log) {
   
        console.log(log);
    })
    .on("changed", function (log) {
   
});

事件的 函数签名哈希 是默认写入 topics 的一项,除非你在声明事件时使用了 anonymous 关键字。也就是说:

  • 非匿名事件 可以通过事件签名筛选;
  • 匿名事件 无法通过事件名筛选,只能按合约地址筛选;
  • 但匿名事件的好处是:部署和调用成本更低,并且允许使用 4 个 indexed 参数(非匿名最多只能用 3 个)。

注意:由于交易日志仅存储事件数据,而不记录其类型信息,因此你必须清楚事件的结构,才能正确解析日志。这包括哪些参数是 indexed&#

相关文章:

  • 需求的图形化分析-状态转换图
  • 【C++算法】51.链表_两数相加
  • 【论文粗读】Multi-scale Neighbourhood Feature Interaction Network
  • ruby高级语法
  • Linux命令学习
  • export default function?在react中在前面还是后面呢?
  • node.js之path常用方法
  • 模仿axios的封装效果来封装fetch,实现baseurl超时等
  • 批量将图片转换为 jpg/png/Word/PDF/Excel 等其它格式
  • 【ROS 通信】Services 服务通信
  • pinia中不定义state和action也能正常使用属性和方法
  • [Effective C++]条款28:避免返回handles指向对象内部成分
  • AI 智能外呼系统的智能体现
  • Python语言的网络编程
  • 大模型FAQ
  • C++-Mongoose(2)-https-server-openssl
  • Java核心技术面试题
  • micro ubuntu 安装教程
  • 【亲测】Linux 使用 Matplotlib 显示中文
  • Solidity入门实战—web3
  • 彩票网站建设多少钱/深圳竞价托管公司
  • 中英双语营销型网站/百度知道网页版
  • pdf做电子书下载网站/市场营销证书含金量
  • 长葛哪里有做网站的/百度网盘登录入口官网
  • 在印度做外贸需要什么网站/网站seo优化检测
  • 宝塔如何添加ip域名做网站/西安做网站的网络公司