【Solidity】函数的使用
构造函数
构造函数仅在部署合约时调用一次,它的作用主要是初始化一些状态变量。
contract Demo {address public owner;uint public num;constructor(uint _num) {owner = msg.sender;num = _num;}
}
函数装饰器
函数装饰器可以在函数执行之前或之后插入代码逻辑,用于改变函数的行为,比如检查条件、限制访问权限等。
// SPDX-License-Identifier: MIT
pragma solidity 0.8.7;contract Demo {address public owner;constructor() {owner = msg.sender;}// 定义装饰器modifier onlyOwner() {require(msg.sender == owner, "Not the contract owner");_;}// 使用装饰器function changeOwner(address newOwner) public onlyOwner {owner = newOwner;}
}
装饰器可以接收参数 & 函数可以同时使用多个装饰器:
contract Demo {address public owner;constructor() {owner = msg.sender;}// 定义装饰器modifier onlyOwner() {require(msg.sender == owner, "Not the contract owner");_;}// 定义带参数的装饰器modifier validAddress(address _addr) {require(_addr != address(0), "Invalid address");// address(0) is often used to represent an invalid or uninitialized address._;}// 同时使用多个装饰器function changeOwner(address newOwner) public onlyOwner validAddress(newOwner) {owner = newOwner;}
}
三明治装饰器:可以在函数执行之前和之后插入代码逻辑的装饰器。demo - 防止重入攻击:
contract Demo {bool private locked = false;// 定义一个防止重入攻击的装饰器modifier noReentrant() {require(!locked, "No Reentrant");locked = true;_;locked = false;}// 使用装饰器function withdraw() public noReentrant {// 提现逻辑}
}
函数输出
单个返回值:
contract Demo {function getSingleNumber() public pure returns (uint) {return 42;}
}
多个返回值:
contract Demo {function getMultipleNumbers() public pure returns (uint, uint) {return (1, 2);}
}
命名返回值:
contract Demo {function getNamedNumbers() public pure returns (uint first, uint second) {first = 3;second = 4;// 会自动执行 return (first, second)}
}
获取函数返回值:
contract Demo {// ...function callFunctions() public pure returns (uint, uint, uint) {uint singleNumber = getSingleNumber(); // 获取单个返回值(uint multipleNumber1, uint multipleNumber2) = getMultipleNumbers(); // 获取多个返回值return (singleNumber, multipleNumber1, multipleNumber2);}
}
异常处理
Solidity 中的异常处理方法:
contract Demo {// 1. requirefunction testRequire(uint a) public pure returns (uint) {require(a > 10, "a must be greater than 10"); // 若条件不满足, 则触发异常, 并抛出异常信息; 会退还剩余的 gasreturn a;}// 2. revertfunction testRevert(uint a) public pure returns (uint) {if (a <= 10) {revert("a must be greater than 10"); // 触发异常, 并抛出异常信息; 会退还剩余的 gas}return a;}// 3. assertfunction testAssert(uint a) public pure returns (uint) {assert(a > 10); // 若条件不满足, 则触发异常; 会消耗剩余的 gasreturn a;}
}
自定义异常 - 可以自定义异常信息,且更节省 gas :
contract Demo {error MyError(address sender, uint value);function testCustomError(uint a) public view returns (uint) {if (a <= 10) {revert MyError(msg.sender, a); // 触发异常, 并抛出自定义的异常信息}return a;}
}
try catch - 适用于处理外部合约调用失败的情况:
// 外部合约, 用于示例
contract ExternalContract {function mayFail(uint value) public pure returns (uint) {require(value != 0, "Value cannot be zero");return value * 2;}
}// 主合约, 使用 try/catch 处理外部调用
contract TryCatchExample {event Success(uint value);event Failure(string reason);ExternalContract externalContract;constructor() {externalContract = new ExternalContract();}function tryCatchExample(uint value) public {try externalContract.mayFail(value) returns (uint result) {emit Success(result);} catch Error(string memory reason) {// 捕获 require 和 revert 抛出的错误,并返回错误消息emit Failure(reason);} catch (bytes memory) {// 捕获低级别错误(如 assert 抛出的错误),并返回通用错误消息emit Failure("Low-level error");}}
}
事件
contract Demo {event Transfer(address indexed from, address indexed to, uint value); // 定义事件function transfer(address _to, uint _value) public {emit Transfer(msg.sender, _to, _value); // 触发事件}
}
事件的用途:
- 事件可以用于记录交易日志,帮助调试和监控合约的运行状态。
- 外部应用程序可以通过以太坊客户端的 RPC 接口订阅和监听这些事件,从而在事件发生时执行相应的操作。
事件的继承:
- 事件可以在合约中被继承,这使得子合约可以使用父合约定义的事件。
索引参数:
- 事件参数可以使用
indexed关键字进行索引,最多可以索引三个参数。 - 索引参数可以加快事件的搜索和过滤。
监听事件:
外部应用程序(如 DApp)可以使用 Web3.js 等库来监听和处理事件。
const event = contractInstance.Transfer();
event.watch(function (error, result) {if (!error) {console.log(result.args.from, result.args.to, result.args.value);}
});
相关文章:
【Solidity】函数的使用
构造函数 构造函数仅在部署合约时调用一次,它的作用主要是初始化一些状态变量。 contract Demo {address public owner;uint public num;constructor(uint _num) {owner msg.sender;num _num;} }函数装饰器 函数装饰器可以在函数执行之前或之后插入代码逻辑&am…...
详解golang内存管理
介绍 要搞明白 Go 语言的内存管理,就必须先理解操作系统以及机器硬件是如何管理内存的。因为 Go 语言的内部机制是建立在这个基础之上的,它的设计,本质上就是尽可能的会发挥操作系统层面的优势,而避开导致低效情况。 操作系统内存管理 其实现在计算机内存管理的方式都是…...
C++ 线程 一些同步方式
C 线程一些同步方式 1.互斥锁(Mutex)2. 读写锁(Reader-Writer Lock)3. 信号量(Semaphore)4. 原子操作(Atomic)5. 屏障(Barrier)6. 条件变量(Condi…...
【开发语言】编译型语言和解释性语言有啥区别?
作为一名从业多年的程序员,对于编译型语言和解释型语言之间的区别有着深入的理解。这两种类型的编程语言在将源代码转换成可执行代码的过程中采用了不同的机制,这导致了它们在执行效率、跨平台性、安全性以及开发效率等方面存在一些差异。 编译型语言(Compiled Languages)…...
将A服务器上指定文件夹中的文件,批量同步到B服务器上
需求:最近有一个需求,需要定期将A服务器上的PDF文件,同步到B服务器上,于是便写个脚本记录一下! 下面是使用Python3脚本实现的方法 import os import paramikodef copy_pdf_files(source_ip, source_user, source_pas…...
2024.8.17
130124202408171002 DATE #:20240817 ITEM #:DOC WEEK #:SATURDAY DAIL #:捌月拾肆 TAGS < BGM "快哉风 -- 黄金玉米王" > < theme oi-language > < theme oi-graph theory > < [空] > < [空] >取次花丛懒回顾,半缘修道…...
十分钟搭建一个RTMP服务器
使用SRS搭建RTMP服务器 如果您需要搭建一个RTMP服务器,您可以使用SRS(Simple-RTMP-Server)来完成此任务。SRS是一个开源的RTMP服务器下面是一个简单的步骤指南: 获取srs srs官⽹:https://github.com/ossrs/srs 码云…...
Spring Boot解决循环注入问题
Spring Boot解决循环依赖注入问题 代码问题回显启动错误日志解决方案:使用事件驱动或通过 ApplicationContext 手动获取 Bean1. 事件驱动设计2. 使用 ApplicationContext 手动获取 Bean3. 拆分逻辑 总结 代码问题回显 现有代码1 在InterestService中依赖MemberInte…...
《数据挖掘》期末考核重点
1.数据预处理的目的与形式 数据预处理的目的是提供干净,简洁,准确的数据,以达到简化模型和提高算法泛化能力的目的,使挖掘过程更有效,更容易,提高挖掘效率和准确性。 2.数据预处理的形式 数据清理&#…...
Golang | Leetcode Golang题解之第334题递增的三元子序列
题目: 题解: func increasingTriplet(nums []int) bool {n : len(nums)if n < 3 {return false}first, second : nums[0], math.MaxInt32for i : 1; i < n; i {num : nums[i]if num > second {return true} else if num > first {second n…...
HarmonyOs编写一个案例实现一个照片选择(阶段进阶 四种需求 逐一完善)
需求1. .实现照片选择 并将选择好的照片展示出来 import { GoodItem } from ../06/modules;Entry Component struct PhotoPage {State message: string 实现一个相册;State List: GoodItem[] [{goods_name: dsfjlsjkfsf,goods_price: 100,goods_img: https://img1.baidu.com…...
洗衣机洗衣服一些知识
01智能:按衣物多少自动调节合适水位的标准洗涤程序 (需要30分钟时间) 02:大物:较大,较厚的衣服洗涤 03:轻柔:毛织品或内衣洗涤 04:快速:少量清污衣服洗涤 (13分钟) 05:浸泡:先浸泡一段时间再洗涤 06:单洗:只洗衣不脱水 07:单脱:只脱水不洗衣 08:洁桶:清洁洗衣桶 准备工作: (1)…...
探索文件系统:高效、可靠的文件管理与访问机制
文件系统的功能规划 内存就像是一个书包,容量有限,只能带着一部分东西。而图书馆则是一个专门存储和管理文件的地方,拥有更大的容量,并且可以永久保存文件。为了能够快速找到需要的文件,我们需要有一个书单来记录每本…...
启程与远征Ⅸ--优化生成式人工智能以满足业务需求的框架
生成类似人类的文本和语音曾经只存在于科幻小说中。但 GPT-3 和 PaLM 等大型语言模型 (LLM) 的快速发展让这一愿景更接近现实,解锁了从聊天机器人到内容创作等一系列有前景的商业应用。 然而,通用基础模型往往无法满足行业用例的需求。企业对其生成式 A…...
canal数据同步工具介绍与应用
canal服务 canal介绍canal版本与环境canal 服务集canal应用场景: canal常见问题xml配置问题连接认证问题jar版本问题连接问题 canal介绍 1、Canal是阿里巴巴开源的MySQL增量数据订阅和消费工具,通过模拟MySQL的slave与master交互,捕…...
ubuntu18.04 设置静态地址
修改配置文件 sudo vim /etc/netplan/01-network-manager-all.yaml 代码如下: network: version: 2 renderer: NetworkManager ethernets: ens33: # 配置的网卡名称,可以使用ifconfig -a查看本机的网卡 dhcp4: no # 关闭动态IP设置 …...
jira敏捷开发管理工具视频教程Confluence工作流协同开发(2024)
正文: 随着Jira敏捷开发方法论的普及,Jira已经成为全球软件开发团队管理项目、任务和问题的首选工具。为了帮助团队更好地掌握Jira的核心功能,精心准备了一套全面开发技术及案例视频教程——《Jira敏捷开发管理工具视频教程Confluenc…...
【网络】TCP回显服务器和客户端的构造,以及相关bug解决方法
文章目录 ServerSocket构造方法方法 Socket构造方法方法 回显服务器(Echo Server)1. 构造方法2. 建立连接processConnection 方法的创建1. 读取请求并解析2. 根据请求计算响应3. 把响应写回给客户端 3. 完整代码 客户端(Echo Clientÿ…...
Python知识点:如何使用Boto3进行AWS服务管理
使用 boto3 来管理 AWS 服务是一个非常强大的方式,因为 boto3 是 AWS 提供的官方 Python SDK。下面是使用 boto3 管理 AWS 服务的基本步骤,包括设置、操作和常见的 AWS 服务示例。 1. 安装 boto3 首先,确保你已经安装了 boto3。可以使用 pi…...
Java - 正则表达式
Java 提供了 java.util.regex 包,它包含了 Pattern 和 Matcher 类,用于处理正则表达式的匹配操作。 正则表达式的模式 正则表达式的模式可以包括以下内容: 字面值字符:例如字母、数字、空格等,可以直接匹配它们自身。…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
