【大白話解析】 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
英文地址,請注明出處:http://en.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工具的興起徹底改變了這一局面,讓職場人士能夠專注于內…