首页 > 其他分享 >区块链学习(10)-事件

区块链学习(10)-事件

时间:2023-04-14 23:42:36浏览次数:35  
标签:10 触发 uint256 value 学习 关键字 事件 区块 emit

一、在Solidity中,emit关键字用于触发事件(Event)。事件是智能合约与区块链外部环境(如前端应用或者监控系统)进行通信的一种方式。当某些条件满足或某些操作发生时,智能合约可以通过触发事件通知外部环境。事件会将相关数据记录在交易的日志中,外部监听器可以订阅并解析这些日志,以便在事件触发时采取相应的行动。

以下是一个简单的事件和emit关键字的示例:

pragma solidity ^0.8.0;
contract EmitExample {
    // 定义一个事件
    event ValueChanged(address indexed author, uint256 oldValue, uint256 newValue);
    uint256 private value;

    // 修改值并触发事件
    function setValue(uint256 newValue) public {
        uint256 oldValue = value;
        value = newValue;

        // 使用emit触发事件
        emit ValueChanged(msg.sender, oldValue, newValue);
    }

    // 获取当前值
    function getValue() public view returns (uint256) {
        return value;
    }
}

在这个示例中,我们创建了一个名为EmitExample的智能合约,并定义了一个名为ValueChanged的事件。当用户调用setValue函数设置一个新的值时,我们将触发ValueChanged事件,并传递调用者地址、旧值和新值作为事件参数。通过emit关键字,我们将事件与参数一起发送到区块链外部。

在实际应用中,前端应用或其他监听器可以订阅这个事件,当事件被触发时,监听器将收到通知,从而可以更新用户界面、存储新数据或执行其他操作。

总之,emit关键字在Solidity中用于触发事件,事件是智能合约与区块链外部环境进行通信的一种方式。通过定义事件并使用emit触发它,可以实现合约状态变更的通知和外部系统的响应。

二、使用event关键字来定义一个事件。事件通常具有一组参数,这些参数会在事件触发时传递给外部监听器。

以下是一个定义事件的示例:

pragma solidity ^0.8.0;

contract EventExample {
    // 定义一个事件
    event MyEvent(address indexed sender, uint256 indexed value, string message);
}

在这个示例中,我们定义了一个名为MyEvent的事件,它具有三个参数:sender(发送者地址)、value(数值)和message(字符串信息)。我们将sendervalue参数设置为indexed,这意味着它们可以在日志中被高效地搜索和筛选。要触发这个事件在合约函数中使用emit关键字即可,参见一中描述

标签:10,触发,uint256,value,学习,关键字,事件,区块,emit
From: https://blog.51cto.com/u_13238147/6191114

相关文章

  • 【230414-1】乒乓球队的10名队员中有3名主力队员,派5名参加比赛,3名主力要安排在第一、
    ......
  • 【230414-2】在一块并排10垄的田地中,选择2垄分别种植A、B两种作物,每种作物种植1垄。为
    ......
  • #yyds干货盘点#dB、dBm、dBi、dBc,一文带你学习无线信号强度指标
    定义与由来dB是一个比值,是一个纯计数方法,没有任何单位标注,那它具有什么存在的意义呢。在无线通信里,常常用它来衡量一个地点的信号质量强度。为了纪念贝尔,所以采用贝尔的名字来对信号的衰减或增强进行命名,其表示为Bel=Log(输入信号的功率/输出信号的功率),在实际使用中这个单位太大,所......
  • 二叉树遍历(102.144.94.145)
    102.二叉树的层序遍历BPS/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nullptr),right(nullptr){}*TreeNode(intx):val(x),left(nullptr)......
  • 类的继承10
    #include<iostream>usingnamespacestd;classBase{ public: voidfn1(){ cout<<"Basefn1开始"<<endl; } voidfn2(){ cout<<"Basefn2开始"<<endl; }};classDerived:publicBase{ public: voidfn1(){ cout<......
  • Maui安卓调试时部署报错:ADB1000
    突发情况,于是重新建了个项目,什么都没动的直接选择安卓仿真器。点击部署。于是等了半天,打开仿真器变慢了。部署也变慢了,CPU直接嗷嗷响,温度瞬间直飙80多度。接着仿真器是打开了,但一直都是黑屏。然后就是一个报错。报错内容: 错误ADB1000:System.IO.FileNotFoundException:......
  • 如何学习架构和架构历史背景
    如何学习架构编程需要掌握的技能:技术+业务+架构职业等级晋升答辩的时候,也是需要熟练掌握上面三个部分,特别是技术和架构技术方面,程序设计的关键思维是逻辑与实现,是代码层面的设计架构方面,关键思维判断与取舍,是整体技术组合框架上的设计学习一门编程语言:先学习一下基本的......
  • window10专业版系统,在docker中配置oracle19c
    window10专业版系统,在Docker中配置Oracle19c1.环境说明​ 系统:windows10专业版(已打开与wsl相关的服务)​ Docker:Dokcer4.17.0(已为Docker配置环境变量)2.配置流程<1>镜像拉取​ 首先,打开Docker客户端,在cmd中输入以下命令用以镜像拉取(使用命令行拉取镜像会被默认保存至C盘):doc......
  • HDU 1042 N! (大整数阶乘)
    这道题开始并不会,是看了别人的代码,自己又改造了一下,代码如下:(PS:这个时候自带大整数运算的java就有优势了)#include<bits/stdc++.h>usingnamespacestd;constintN=20000+10;intans[N];voidfact(intn){ans[0]=ans[1]=1;inttot=1;for(inti=......
  • Educational Codeforces Round 110 (Rated for Div. 2) C. Unstable String(状态机)
    https://codeforces.com/contest/1535/problem/C题目大意:给定一个字符串s,由10?组成:?每次都可以任意替换成0或者1问我们这个子字符串中,能够组成010101这样两两互不相等的字符串的数量最大是多少?input30?10????10??1100output8625#include<bits/stdc++.h>usin......