【大白话解析】 OpenZeppelin 的 Address 库:Solidity安全地址交互工具箱​(附源代码)

🧩 一、这个文件是干嘛的?—— Address.sol 是个“工具箱”

你可以把这个 Address.sol文件理解为一个 ​​“工具箱”​​,里面装了一堆​​专门用来安全地跟别的地址(账户或合约)打交道的工具函数​​。

在区块链世界里,地址(address)可以是:

  • ​外部账户(EOA)​​:就是普通用户钱包,比如你用 MetaMask 创建的钱包地址。

  • ​合约账户​​:就是你部署的智能合约,它也有一个地址,可以接收 ETH、调用函数等。

这个库主要解决的问题是:​​如何安全地与这些地址交互,比如发 ETH、调用合约函数,避免踩坑和漏洞​​。


⚠️ 二、为什么要这个库?—— 直接调用太危险!

在 Solidity 中,如果你想跟别的地址交互,比如:

  • 给某人转 ETH

  • 调用别人的合约函数(比如调用一个 Token 合约的 transfer() 方法)

你可能会想到用类似这样的底层方法:

  • transfer()send()call()delegatecall()staticcall()

但这些方法​​非常底层,使用不当很容易出 bug 或被攻击​​,比如:

问题

说明

❌ 没有检查对方是不是真的合约

你以为你在调用合约函数,但其实对方是个普通用户地址(EOA),根本没代码,一调用就炸了

❌ 没有检查余额够不够

想转 ETH,结果自己余额不足,没检查就炸了

❌ 没有处理调用失败

调用别人合约函数,别人函数内部出错了,你没捕获就继续执行,逻辑混乱

❌ gas 限制太低

比如用 transfer() 发 ETH,只能给对方 2300 gas,不够用对方 fallback 函数就失败

❌ 没有处理返回值

调用后返回了一堆数据,你不知道怎么处理,或者忽略了错误信息

👉 所以,OpenZeppelin 这个库就是帮你把这些​​危险操作都包一层,变成“安全版本”​​,你只管调用,不用操心底层细节和各种边界情况。


🧰 三、这个库提供了哪些“工具函数”?

我们来看看这个库里面主要提供了哪些功能,用大白话解释:


1. ✅ sendValue(address payable, uint256)—— 安全地给别人转 ETH

​作用:​

你想给某个地址(比如用户钱包、合约地址)发 ETH,用这个方法就对了!

​为什么不用 transfer()?​

因为 transfer()只给对方 2300 gas,不够对方执行复杂逻辑,容易失败。

而这个方法用的是底层的 call,​​可以给对方足够多的 gas,更灵活、更安全​​。

​举个例子:​

// 给用户地址转 1 ETH
Address.sendValue(payable(userAddress), 1 ether);

2. ✅ functionCall(address, bytes)—— 安全地调用别人合约的函数(不发 ETH)

​作用:​

你想调用某个合约的函数(比如 ERC20 的 transfer()),但不转 ETH,就用这个。

​举个例子:​

你有一个 ERC20 合约地址,你想调用它的 transfer(to, amount) 函数,你可以这样:

bytes memory data = abi.encodeWithSignature("transfer(address,uint256)", to, amount);
Address.functionCall(tokenContractAddress, data);

它帮你封装了底层的 call,还会检查调用有没有成功,失败了会自动回滚。


3. ✅ functionCallWithValue(address, bytes, uint256)—— 调用别人合约函数 ​​并且同时转 ETH​

​作用:​

有些合约函数不仅需要你调用,还需要你​​转一些 ETH 给它​​,比如参与众筹、质押、买入 NFT 等。

这个方法就是:​​既调用函数,又转 ETH,还保证安全!​

​举个例子:​

bytes memory data = abi.encodeWithSignature("buy(uint256)", tokenId);
Address.functionCallWithValue(sellerContract, data, 1 ether);

👉 就是调用 sellerContract 的 buy 函数,并且同时转 1 ETH 给它。


4. ✅ functionStaticCall(address, bytes)—— 安全地读取别人合约的数据(不修改任何状态)

​作用:​

你想读取别人合约的信息,比如:

  • 查某个用户的余额:balanceOf(address)

  • 查询某个值:getSomething()

这些函数通常是 ​​view / pure 函数,不会修改区块链状态​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/96524.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/96524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

漫谈《数字图像处理》之测不准原理

在数字图像处理中,提到的 “测不准原理” ,和量子力学里由海森堡提出的 “不确定性原理” (Heisenberg uncertainty principle,也叫海森堡测不准原理)有一定的类比关系,但本质上并不是同一个概念。以下为详…

Linux服务测试

一、环境准备确认 确保 4 台主机(APPSRV、STORAGESRV、ROUTERSRV、CLIENT )网络连接正常,虚拟机网卡模式按要求设置(APPSRV、STORAGESRV 为 NAT 模式;ROUTERSRV 为双网卡,NAT 仅主机模式;CLIE…

2.Shell脚本修炼手册---创建第一个 Shell 脚本

2. 创建第一个 Shell 脚本 文章目录2. 创建第一个 Shell 脚本2.1 什么是 Shell 脚本?2.1.1 脚本开头:告诉系统用什么程序执行2.1.2 脚本注释:给人看的 “说明书”2.1.3 bash 与 sh 的区别2.2 如何执行 Shell 脚本?方法 1&#xff…

Day22 顺序表与链表的实现及应用(含字典功能与操作对比)

day22 顺序表与链表的实现及应用(含字典功能与操作对比) 使用顺序表实现查字典功能 支持连续查询单词,输入 #quit 退出程序。数据格式示例如下: a\0 indef art one\r\n word mean [---buf--->] [---i--…

51单片机与stm32单片机,先学习哪一个?

纠结 51 单片机和 STM32 该先学哪个,就像刚学开车的人在自动挡和手动挡之间打转。有人一上来就爱开自动挡,踩着油门就能跑,不用琢磨换挡踩离合的门道;有人偏要从手动挡练起,哪怕起步时熄十几次火,也得搞明白…

DS 0 | 数据结构学习:前言

数据结构是CS最基础、最重要的课程之一在学习数据结构时,通常来讲,学生遇到的难点不在于对数据结构的理解,而在于如何写程序。即编写特定的程序,来实现这些数据结构,特别是如何按照面向对象思想将一个个数据结构设计成…

JVM-(8)JVM启动的常用命令以及参数

JVM启动的常用命令以及参数 在上文 JVM 堆内存逻辑分区 中已经使用过一些 jvm 启动命令,本文着重讲述JVM启动命令用法以及一些常用的参数 一. 基本命令格式 java [options] classname [args...] java [options] -jar filename.jar [args...]① [options] - 命令行…

GO学习记录七——上传/下载文件功能,添加启动运行工具

本来计划是学习Docker部署的,研究了一天没搞出来,得出结论是需要翻墙,懒得弄了,暂时放置。 一、以下是,上传/下载代码,和之前是重复的,只多添加了,上传/下载功能。 测试目录为工程根…

SQL中对视图的操作命令汇总

以下是基于搜索结果整理的SQL视图操作命令汇总,按功能分类说明: 一、创建视图 使用 CREATE VIEW 语句定义视图,需指定视图名称和基础查询表达式: CREATE VIEW view_name AS SELECT column1, column2, ... FROM table_name WHER…

【Spring Cloud 微服务】2.守护神网关Gateway

目录 1.API网关的作用 2.Spring Cloud Gateway 是什么? 3.核心由来与背景 1. 微服务架构的挑战: 2. API 网关模式的兴起: 3. Zuul 的局限性: 4. Spring Cloud Gateway 的诞生: 4.核心特征: 5.核心概…

解读商业智能BI,数据仓库中的元数据

之前的文章讨论过数据分析、数据治理、数据仓库等等,即使是非业内人员从字面意思,也是可以了解一二的,但是,很多人对于元数据可能就比较陌生了。那么,今天我们就来聊一聊元数据管理。数据仓库要说元数据,那…

3 种无误的方式删除 Itel 手机上的短信

如果你希望释放存储空间、保护隐私,或者准备出售或转让手机,删除 Itel 手机上的短信是一个实用的步骤。无论是收件箱中充斥着垃圾短信、过时的对话还是敏感内容,删除不需要的短信可以让你的消息体验更加干净和安全。本文将向你介绍 3 种简单且…

【学习笔记】网络安全专用产品类别与参考标准

一、基本标准 1.1 关键设备 网络关键设备认证依据的强制标准为 GB 40050-2021。 1.2 专用产品 网络安全专用产品认证依据的强制标准为 GB 42250-2022。 二、数据备份与恢复产品标准 相关标准: GB/T 29765-2021《信息安全技术 数据备份与恢复产品技术要求与测试评…

Pytho“张量”(Tensor)和 Java的“向量”(Vector)区别和联系

在Python和Java中,“张量”(Tensor)和“向量”(Vector)是两个不同语境下的概念,它们的设计目标、功能和应用场景存在显著差异,但也存在一定的共性。以下从区别和联系两方面详细说明:…

Ubuntu部署K8S集群

Ubuntu部署K8S集群 本例以三台Ubuntu24.04为例,1master节点2worker节点 环境准备 修改hostname,三台服务器分别执行 hostnamectl set-hostname k8s-master01hostnamectl set-hostname k8s-worker01hostnamectl set-hostname k8s-worker02 配置静态ip(不同系统修改方法略微差…

openEuler系统安装Ascend Docker Runtime的方法

在openEuler系统中使用NPU前一定要安装Ascend Docker Runtime,也是在安装CANN和mis-tei前的必备工作。 使用容器化支持、整卡调度、静态vNPU调度、动态vNPU调度、断点续训、弹性训练、推理卡故障恢复或推理卡故障重调度的用户,必须安装Ascend Docker Runtime。 下面是具体的安…

控制对文件的访问:Linux 文件系统权限管理总结

在 Linux 系统中,文件权限是保障系统安全和数据完整性的核心机制。红帽企业 Linux 9.0通过一套灵活且精细的权限控制体系,让用户能够精确管理文件和目录的访问范围。本章将系统梳理 Linux 文件系统权限的核心概念、管理方法及高级应用,为系统…

ansible中roles角色是什么意思?

文章目录一、介绍二、Ansible Roles目录编排三、创建role四、playbook调用角色五、roles中tags使用免费个人运维知识库,欢迎您的订阅:literator_ray.flowus.cn 一、介绍 角色是ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbo…

pytorch 网络可视化

1.torchsummary在 Anaconda prompt 中进入自己的 pytorch 环境,安装依赖包。 bash pip install torchsummary 2.tensorboardX 3. graphviz torchviz 4.Jupyter Notebook tensorwatch 5.netron 6.hiddenlayer 7.PlotNeuralNet

可以一键生成PPT的AI PPT工具(最新整理)

在当今快节奏的职场环境中,高效制作专业PPT已成为一项必备技能。传统PPT制作流程耗时费力,从构思大纲、搜集资料、撰写内容到设计排版,往往需要数小时甚至数天时间。AI生成PPT工具的兴起彻底改变了这一局面,让职场人士能够专注于内…