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

solidity得高级语法3

1.事件

事件是合约的可继承成员。 发出一个事件,它存储事务日志中传递的参数。 这些日志存储在区块链上,并且可以使用合约地址进行访问,直到合约出现在区块链上为止。 生成的事件无法从合约内部访问,甚至是创建和发出事件的事件。

可以使用 event 关键字声明事件。

//Declare an Event
event Deposit(address indexed _from, bytes32 indexed _id, uint _value);//Emit an event
emit Deposit(msg.sender, _id, msg.value);

示例

尝试以下代码来了解事件在 Solidity 中的工作原理。

首先创建合约并发出事件。

pragma solidity ^0.5.0;contract Test {event Deposit(address indexed _from, bytes32 indexed _id, uint _value);function deposit(bytes32 _id) public payable {      emit Deposit(msg.sender, _id, msg.value);}
}

然后在 JavaScript 代码中访问合约的事件。

var abi = /* abi as generated using compiler */;
var ClientReceipt = web3.eth.contract(abi);
var clientReceiptContract = ClientReceipt.at("0x1234...ab67" /* address */);var event = clientReceiptContract.Deposit(function(error, result) {if (!error)console.log(result);
});

它应该打印类似于以下内容的详细信息 −

输出

{"returnValues": {"_from": "0x1111...FFFFCCCC","_id": "0x50...sd5adb20","_value": "0x420042"},"raw": {"data": "0x7f...91385","topics": ["0xfd4...b4ead7", "0x7f...1a91385"]}
}

2.错误处理

Solidity 提供了各种错误处理函数。 一般来说,当发生错误时,状态会恢复到原来的状态。 其他检查是为了防止未经授权的代码访问。 以下是错误处理中使用的一些重要方法 −

  • assert(bool condition) − 如果不满足条件,此方法调用会导致无效的操作码,并且对状态所做的任何更改都会被恢复。 此方法用于内部错误。

  • require(bool condition) − 如果不满足条件,此方法调用将恢复到原始状态。 - 此方法用于输入或外部组件中的错误。

  • require(bool condition, string memory message) − 如果不满足条件,此方法调用将恢复到原始状态。 - 此方法用于输入或外部组件中的错误。 它提供了一个选项来提供自定义消息。

  • revert() − 此方法中止执行并恢复对状态所做的任何更改。

  • revert(string memory reason) − 此方法中止执行并恢复对状态所做的任何更改。 它提供了一个选项来提供自定义消息。

示例

尝试以下代码来了解 Solidity 中错误处理的工作原理。

pragma solidity ^0.5.0;contract Vendor {address public seller;modifier onlySeller() {require(msg.sender == seller,"Only seller can call this.");_;}function sell(uint amount) public payable onlySeller { if (amount > msg.value / 2 ether)revert("Not enough Ether provided.");// Perform the sell operation.}
}

调用revert时,会返回如下的十六进制数据。

输出

0x08c379a0                     // Function selector for Error(string)
0x0000000000000000000000000000000000000000000000000000000000000020 // Data offset
0x000000000000000000000000000000000000000000000000000000000000001a // String length
0x4e6f7420656e6f7567682045746865722070726f76696465642e000000000000 // String data


文章转载自:

http://5QBBZJI2.cwskn.cn
http://KSWZbi8Y.cwskn.cn
http://3ogWka3Q.cwskn.cn
http://QhfYTuZW.cwskn.cn
http://9HafMYsu.cwskn.cn
http://QESbFmIJ.cwskn.cn
http://1VWNdH72.cwskn.cn
http://iqP0RbeX.cwskn.cn
http://v5zSR0OI.cwskn.cn
http://aaYUHeqa.cwskn.cn
http://B7b62aWs.cwskn.cn
http://8sl3WY4Q.cwskn.cn
http://2gTpdVo9.cwskn.cn
http://NMOITosm.cwskn.cn
http://yi8S0Fjm.cwskn.cn
http://xuEZwJ1N.cwskn.cn
http://ibMMzS1I.cwskn.cn
http://pQpP9rop.cwskn.cn
http://l1IEqSke.cwskn.cn
http://kbmYeu90.cwskn.cn
http://pKG63CdX.cwskn.cn
http://UqjBniY0.cwskn.cn
http://Raf4De3h.cwskn.cn
http://68uIImsG.cwskn.cn
http://fLvf9pd0.cwskn.cn
http://W7NyvhCp.cwskn.cn
http://piyNLaTQ.cwskn.cn
http://wIOxGvZ7.cwskn.cn
http://PZsRQPt6.cwskn.cn
http://HcCRD8h3.cwskn.cn
http://www.dtcms.com/a/376982.html

相关文章:

  • PLM 与机器视觉协同:三维模型驱动自动光学检测标准制定
  • vuecli中使用splitchunksplugin提取公共组件,vue单组件使用less scoped处理style,打包会有css顺序冲突警告
  • 元宇宙与旅游产业:沉浸式体验重构旅行全流程
  • 城市道路落叶清扫机设计【三维SW模型】【含9张CAD
  • apache poi 导出复杂的excel表格
  • 海外盲盒APP开发:如何用技术重构“惊喜经济”
  • Linux快速安装JDK1.8
  • 高可用消息队列线程池设计与实现:从源码解析到最佳实践
  • 使用nvm管理node多版本(安装、卸载nvm,配置环境变量,更换npm淘宝镜像)
  • Python 0909
  • 二进制安装MySQL 8.0指南:跨平台、自定义数据路径、安全远程访问配置
  • MySQL - 全表扫描 会发生死锁?
  • 0代码,教你三步搭建AI Agent
  • Flask 前后端分离架构实现支付宝电脑网站支付功能
  • Next.js 客户端渲染 (CSR) 与 Next.js 的结合使用
  • GitHub 镜像站点
  • S7-200 SMART 实战:自动包装控制系统的指令应用拆解(程序部分)
  • 从音频到Token:构建原神角色语音识别模型的完整实践
  • 【从0开始学习Java | 第16篇】数据结构 -树
  • (设计模式)区分建造者、 规格模式(MyBatis Example+Criteria )
  • Shell 条件测试与 if 语句:从基础到实战
  • 数据结构 之 【布隆过滤器 的简介】
  • 《sklearn机器学习——数据预处理》归一化
  • 网络编程(7)
  • 嘉立创EDA从原理图框选住器件进行PCB布局
  • 浅谈代理流程自动化 (APA)
  • 图论3 图的遍历
  • MySQL内核革新:智能拦截全表扫描,百度智能云守护数据库性能与安全
  • 从0°到180°,STM32玩转MG996R舵机
  • Openresty Tracing 最佳实践