Ethereum以太坊事件日志查询参数

这篇具有很好参考价值的文章主要介绍了Ethereum以太坊事件日志查询参数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Ethereum事件日志查询参数

详见:https://www.quicknode.com/docs/ethereum/eth_getLogs

  • address:合约地址
  • fromBlock:开始区块
  • toBlock:结束区块
  • topics:主题数组
  • blockHash:区块哈希,优先级高于fromBlock、toBlock

这里主要介绍topics参数,其他参数都比较好理解,topics是长度为4的数组集合,topic分为2种:一种事件签名topic,另一种indexed索引参数值topic。
topics的的0号位子数组放事件签名哈希,1/2/3号位子数组对应放事件的indexed索引参数值对应的哈希。
以demo合约举例:

pragma solidity ^0.4.4;

contract Hello {
    string name;
    event LogSet(string s);
    event LogSet1(string indexed s1);
    event LogSet2(string indexed s1, string indexed s2);
    event LogSet3(string indexed s1, string indexed s2, string indexed s3);

    constructor() public {
        name = "hello";
    }

    function get() public view returns (string) {
        return name;
    }

    function set(string newName) public {
        name = newName;
        emit LogSet(newName);
        emit LogSet1(newName);
        emit LogSet2(newName, "name2");
        emit LogSet3(newName, "name2", "name3");
    }
}

如果合约调用set(“Tom”),事件LogSet3的1号位indexed索引参数值为"Tom",2号位为"name2",3号位为"name3"。
注意:
合约事件里最多只能有3个indexed索引参数。
如果事件定义改为:

event LogSet3(string indexed s1, string s2, string indexed s3);

事件LogSet3的1号位indexed索引参数值为"Tom",2号位为"name3",没有3号位。

二、需求

部署一个新的Hello合约,并调用一次set函数,以触发生成4条不同的事件日志。要求查询该合约的LogSet3事件日志。

三、实现

第一步,合约部署前,获取到最新块高,作为fromBlock,假设9684。
第二步,部署Hello合约,并调用set函数,入参newName=“Tom”,假设获取到新合约地址0x0dba67483eddb71a84ac0834cd4c8c89dc971d4b。
第三步,再次获取最新块高,作为toBlock,假设9686。
第四步,计算事件LogSet3(string,string,string)的签名,得到0x3e03ccf7099c79040ac78f368a6a038e5d7918b8504f8cc99fd4d1ae71181e7b。
第五步,计算第一个indexed索引参数值"Tom"的哈希0x6984758a5a2907300d836a0ed6101bb5426c0a4422c0d996e8bbf9e59bb8c7cc,计算第二个indexed索引参数值"name2"的哈希0x7d51639d4f8290223cffdcc7a75498fd9c00ab65e7daf27837046fec6a6d6504,计算第三个indexed索引参数值"name3"的哈希0x289ff8670e65b79f5a7c14daf83f381a29ae238fff49f37396cc9100fb243074。
第六步,组装日志查询请求参数,如下:

{
    "address": "0x0dba67483eddb71a84ac0834cd4c8c89dc971d4b",
    "toBlock": "9686",
    "topics": [
        [
            "0x3e03ccf7099c79040ac78f368a6a038e5d7918b8504f8cc99fd4d1ae71181e7b"
        ],
        [
            "0x6984758a5a2907300d836a0ed6101bb5426c0a4422c0d996e8bbf9e59bb8c7cc"
        ],
        [
            "0x7d51639d4f8290223cffdcc7a75498fd9c00ab65e7daf27837046fec6a6d6504"
        ],
        [
            "0x289ff8670e65b79f5a7c14daf83f381a29ae238fff49f37396cc9100fb243074"
        ]
    ],
    "fromBlock": "9684"
}

实际上,如果指定了具体的Hello合约地址,请求参数里不需要第一个和第二个索引参数topic,也可以唯一区分开该合约的其他三个事件,如此,请求参数如下:

{
    "address": "0x0dba67483eddb71a84ac0834cd4c8c89dc971d4b",
    "toBlock": "9686",
    "topics": [
        [
            "0x3e03ccf7099c79040ac78f368a6a038e5d7918b8504f8cc99fd4d1ae71181e7b"
        ],
        null,
        null,
        [
            "0x289ff8670e65b79f5a7c14daf83f381a29ae238fff49f37396cc9100fb243074"
        ]
    ],
    "fromBlock": "9684"
}

四、其他

4.1、topics中4个子数组之间是OR的关系

以太坊官网说明:https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newfilter

  • topics: Array of DATA, - (optional) Array of 32 Bytes DATA topics. Topics are order-dependent. Each topic can also be an array of DATA with “or” options.

举例:
[[A, B], [A, B]] “(A OR B) in first position AND (A OR B) in second position (and anything after)”

4.2、涉及枚举入参类型计算事件签名

如果事件参数中包含枚举类型,如何正确计算该事件签名的topic。
在solidity中的enum类型,实际上是无符号整数,当枚举数量是小于等于256(2的8次方)个,则enum是uint8类型的,如果大于256且小于等于65536(2的16次方),则enum是uint16类型的,以次类推。其实在remix中也可以看到,枚举内的数量小于256,枚举类型自动使用uint8,如下:
Ethereum以太坊事件日志查询参数
所以对上面的例子,事件签名DataSaved(ProofType,bytes)是错误的,DataSaved(enum,bytes)也是错误的。正确应该是DataSaved(uint8,bytes)
如果ProofType枚举的类型从2种变为257种,在remix里重新部署合约后,可以看到uint8自动变为uint16,如下:
Ethereum以太坊事件日志查询参数文章来源地址https://www.toymoban.com/news/detail-465914.html

到了这里,关于Ethereum以太坊事件日志查询参数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么是Ethereum以太坊(ETH)?以及以太坊的一些基础知识

    Ethereum以太坊(ETH)是由Vitalik Buterin所创建,一种允许智能合约和去中心化应用程序(dapps)在其网络上运行的加密货币。 以太坊是仅次于比特币的第二大加密货币,它是一个基于区块链的平台,用于创建去中心化应用程序(dapps)。 比特币被设计成一种货币和价值储存手段,而

    2024年02月03日
    浏览(38)
  • 以太坊创建私有链 go-ethereum

    目录 启动节点同步 同步主网区块 同步测试网络的区块 同步Ropsten测试网络的区块  同步RinkeyBy测试网络区块 搭建自己的私有链  创建genesis.json init初始化gensis.json  启动私链 安装好了Geth,现在我们可以尝试运行以下它。执行下面的命令,geth就会开始同步区块,并存储在当前

    2024年02月08日
    浏览(34)
  • 11M 以太坊 ethereum OpenZeppelin : 开发智能合约

    • 设置项目 • 第一份合同 • 编译 Solidity • 添加更多合约 • 使用 OpenZeppelin 合约 • OpenZeppelin Tutorials 教程 • Contact 联系方式 创建项目后的第一步是安装开发工具。 以太坊最流行的开发框架是Hardhat,我们用ethers.js介绍了它最常见的用途。下一个最受欢迎的是使用web3.js的

    2024年02月11日
    浏览(42)
  • 11U 以太坊 ethereum OpenZeppelin : 升级智能合约

    • 升级中有什么 • 使用升级插件升级 • 升级如何运作 • 初始化 • 升级 • 测试 • OpenZeppelin Tutorials 教程 • Contact 联系方式 使用OpenZeppelin 升级插件部署的智能合约可以升级以修改其代码,同时保留其地址、状态和余额。这使您可以迭代地向项目添加新功能,或修复您在

    2023年04月08日
    浏览(50)
  • 以太坊go-ethereum源码研读(二)applyTransaction相关

    在前面以太坊go-ethereum源码研读(一)中所讨论的 Process 函数调用了该 applyTransaction 函数来执行交易相关指令,于是进一步对该函数进行分析,以明晰以太坊交易的全过程。 分析过程中一些结构体或函数在以太坊go-ethereum源码研读(一)中已经讨论到,对这些结构体和函数则

    2023年04月25日
    浏览(37)
  • 【区块链 | 智能合约】Ethereum源代码(8)- Ethereum服务和以太坊P2P协议发送广播源码分析

    在“【区块链 | 智能合约】Ethereum源代码(2)- go-ethereum 客户端入口代码和Node分析”一文中,我们提到Ethereum作为一个service,被Node 注册进去。Node start的时候会启动其注册的所有服务,Ethereum service也是一样。 初始化方法

    2024年01月21日
    浏览(53)
  • 以太坊燃料费用定价机制Ethereum Gas Fee Pricing Mechanism

            以太坊燃料在交易过程中起着重要作用。从以太坊系统的角度,通过燃料费用提高恶意交易的成本减少攻击者的攻击收益,增强了以太坊交易的安全性,也促使合约开发者优化设计减少合约对以太坊算力的消耗;从交易发起者角度,通过设定燃料相关的参数,以尽

    2024年01月15日
    浏览(61)
  • 11O 以太坊 ethereum OpenZeppelin : 部署智能合约并与之交互

    • 建立本地区块链 • 部署智能合约 • 从控制台交互 • 以编程方式交互 • 获取合约实例 • 调用合约 • 发送交易 • OpenZeppelin Tutorials 教程 • Contact 联系方式 在开始之前,我们首先需要一个可以部署合约的环境。以太坊区块链(通常称为“主网”,表示“主网络”)需要

    2023年04月08日
    浏览(97)
  • 【区块链 | 智能合约】Ethereum源代码(10)- 以太坊Downloader源码分析

    上一节分析到Fetcher用于同步网络节点的新区块和新的交易数据,如果新区块和本地最新的区块相隔距离较远,说明本地区块数据太旧,Fetcher就不会同步这些区块。这时候就要借助Downloader来同步完整的区块数据。 一,启动Downloader handler 初始化的时候会进行Downloader的初始化:

    2024年02月15日
    浏览(45)
  • 【区块链 | 智能合约】Ethereum源代码(11)- 以太坊核心BlockChain源码分析

    前面几节都在分析以太坊的通信协议,怎么广播,怎么同步,怎么下载。这一节讲讲以太坊的核心模块BlockChain,也就是以太坊的区块链。 一,BlockChain的初始化 Ethereum服务初始化func init() 的时候会调用core.SetupGenesisBlock来加载创始区块。顾名思义,创始区块就是以太坊区块链中

    2024年02月08日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包