Skip to main content
Kripto Haberleri

[Chainlink] Sağlamlık中的事件和日志 – AZCoin Haberleri

Yazan Aralık 29th, 2021Yorum Yazılmamış

Katılık事件对于智能合约开发者来说是不可或缺的,它允许我们对智能合约中特定变量进行测试,以自动化的方式改变前端等。 总的来说,知道如何在Solidity中使用事件可以使智能合约的开发变得更加容易。

在本文,我们将从智能合约开发者的角度来研究以太坊虚拟机(EVM)的日志和事件功能.包括日志和事件的用途.索引事件.以及如何在Hardhat和Brownie中使用日志和事件。

EVM是以太坊和许多其他区块链的核心。 EVM有一个日志功能,用于将数据”写”到智能合约之外的数据结构中。 其中一个重要的数据是Sağlamlık mı事件。 事件允许我们”打印”在区块链上的信息,这种方式比在智能合约中保存到公共存储变量更容易搜索,且更省gas费。

日志是区块链上的一种特殊数据结构。 它们不能被智能合约访问,但能提供关于交易和区块中发生的信息。 正是因为它们不能被智能合约访问,才使得它们的使用成本更低。

你也可以观看下面的关于Solidity中的事件和日志的视频:

那么,什么是事件呢?

事件允许我们轻松查询在区块和交易中发生的”东西”。 如果你运行一个区块链节点,你可以通过订阅它们来”监听”到某些事件。 事实上,这就是Zincir bağlantısı网络的工作方式。 Zincirlink网络在某些地址订阅某些事件,并根据发出的事件内容,从现实世界返回数据。

事件能用来做什么?

现在,如果你不是Chainlink或Ethereum节点运营商,你可能会问事件对你有什么影响呢。 通过 Katılık 事件.你可以做:

  1. 测试你的智能合约中的特定变量;
  2. 索引变量以重建存储状态;
  3. 监听事件用于改变前端状态;
  4. 创建子图以更快地读取数据;

还可以完成其他许多事情。 对工程师来说,事件有各种各样的用例。 事实上,事件是Chainlink节点运作的核心组成部分。 Chainlink节点会监听数据请求和外部计算事件,这正是是他们知道如何响应的根源。

事件是什么样子的?

下面的数据结构就是在Solidity中定义一个事件的方式:

event storedNumber(
    uint256 indexed oldNumber,
    uint256 indexed newNumber,
    uint256 addedNumber,
    address sender
);

你可以把事件看作是一个新的特殊类型。 我们已经创建了一个名为storedNumber的事件”类型”。 事件的名字叫storedNumber,可以容纳一些变量。 在这个事件中,有两种参数:有索引的和无索引的。 索引参数也被称为”主题”,是事件中的可搜索参数。 我们会在后文更多地谈及这些内容。

然后我们可以像下面这样发出一个事件:

uint256 favoriteNumber;

function store(uint256 _favoriteNumber) public {
    emit storedNumber(
        favoriteNumber,
        _favoriteNumber,
        _favoriteNumber + favoriteNumber,
        msg.sender
    );
    favoriteNumber = _favoriteNumber;
}

下面是一个完整的合约实例:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract SimpleStorage {
    uint256 favoriteNumber;

    event storedNumber(
        uint256 indexed oldNumber,
        uint256 indexed newNumber,
        uint256 addedNumber,
        address sender
    );

    function store(uint256 _favoriteNumber) public {
        emit storedNumber(
            favoriteNumber,
            _favoriteNumber,
            _favoriteNumber + favoriteNumber,
            msg.sender
        );
        favoriteNumber = _favoriteNumber;
    }

    function retrieve() public view returns (uint256) {
        return favoriteNumber;
    }
}

现在,只要我们调用这个例子中的mağaza函数,它就会发出一个storedNumber类型的事件。 让我们看看一个调用mağaza函数、输入为1的示例交易。 我们可以在Kovan Etherscan上看到这个事务。

滚动到交易的”日志”部分,我们可以看到以下内容:

Etherscan'daki işlemin ekran görüntüsü, kodu çözülmüş

一个事件可以分解为:

Adres: 地址,发出事件的合约或账户的地址。

Konu:主题,事件的索引参数。

Veri: 数据.事件的非索引参数的ABI编码或”哈希”。 由于我们知道合约的ABI(因为我们在Etherscan上验证了合约),我们可以在”Dec”或”Decoded”模式下查看它,或者在其原始的”hex”、”Hexidecimal”或 “Kodlanmış”模式下查看。 如果我们没有验证过合约,我们就无法看到解码的版本。

Etherscan'daki işlemin ekran görüntüsü, kodu çözülmedi

你可以在Sağlamlık mı文档中阅读更多关于事件的内容。 “日志”和”事件”经常被互换使用,因为作为智能合约的开发者,我们通常只关心日志中的”事件”。 然而,从技术上讲,日志也包括blockhashadres,以及通过调用eth_getLogs返回给你的区块链节点的其他数据。 你也可以阅读更多有关布隆过滤器的内容,这是这些事件能被简单查询到的原因。

Hardhat mı中的事件

现在我们已经了解了什么是事件,让我们学习如何在Hardhat中访问并使用它们。 你可以克隆下面的repo,然后跟着操作:

git clone https://github.com/PatrickAlphaC/hardhat-events-logs
cd hardhat-events-logs

你需要跟着README.md中的说明完成依赖工具的安装,其中包括DüğümIplikAptal

如果你跟着README.md操作,你将能够:

  1. 部署一个智能合约;
  2. 创建一个发出事件的交易;
  3. 查看这些事件的上下文。

如果你在这一过程中遇到问题,请在Github repo上新建一个Sorun!我们可以通过检查hareketReceipt对象的Günlük属性来查看日志。

console.log(transactionReceipt.events[0].args.oldNumber.toString())

Brownie mi中的事件

Brownie中的事件几乎是相同的,因为合约是完全相同的。

你可以克隆下面的 repo,然后跟着操作:

git clone https://github.com/PatrickAlphaC/brownie-events-logs
cd brownie-events-logs

你需要跟着README.md中的说明完成依赖工具的安装,其中包括DüğümPitoneth-brownieAptal

如果你跟着README.md操作.你将能够:

  1. 部署一个智能合约;
  2. 创建一个发出事件的交易;
  3. 查看这些事件的上下文。

如果你在这一过程中遇到问题,请在Github repo上新建一个Sorun! 你会发现这里的主要区别是,我们使用打印语句来打印出事务的日志:

print(tx.events[0]["oldNumber"])

总结

日志和事件是智能合约开发的重要组成部分,也是Chainlink和Graf等项目的关键基础设施。 要想了解更多关于开发强大的智能合约的信息(利用你新掌握的事件技能),请务必前往查看Zincir bağlantısı文档,从现在开始创作吧!

Solidity中的事件和日志 sonrası ilk olarak Chainlink Blog’da göründü.

Chainlink’te >> Görünümü

Telegram’da bize katılın

Bizi Twitter’da takip edin

Bizi Facebook’ta takip edin