solidity:構造函數和修飾器、事件

構造函數?

構造函數(constructor)是一種特殊的函數,每個合約可以定義一個,并在部署合約的時候自動運行一次。它可以用來初始化合約的一些參數,例如初始化合約的owner地址:

address owner; // 定義owner變量// 構造函數
constructor(address initialOwner) {owner = initialOwner; // 在部署合約的時候,將owner設置為傳入的initialOwner地址
}

注意:構造函數在不同的Solidity版本中的語法并不一致,在Solidity 0.4.22之前,構造函數不使用?constructor?而是使用與合約名同名的函數作為構造函數而使用,由于這種舊寫法容易使開發者在書寫時發生疏漏(例如合約名叫?Parents,構造函數名寫成?parents),使得構造函數變成普通函數,引發漏洞,所以0.4.22版本及之后,采用了全新的?constructor?寫法。

構造函數的舊寫法代碼示例:

pragma solidity =0.4.21;
contract Parents {// 與合約名Parents同名的函數就是構造函數function Parents () public {}
}

修飾器?

修飾器(modifier)是Solidity特有的語法,類似于面向對象編程中的裝飾器(decorator),聲明函數擁有的特性,并減少代碼冗余。它就像鋼鐵俠的智能盔甲,穿上它的函數會帶有某些特定的行為。modifier的主要使用場景是運行函數前的檢查,例如地址,變量,余額等。

?

我們來定義一個叫做onlyOwner的modifier:

// 定義modifier
modifier onlyOwner {require(msg.sender == owner); // 檢查調用者是否為owner地址_; // 如果是的話,繼續運行函數主體;否則報錯并revert交易
}

帶有onlyOwner修飾符的函數只能被owner地址調用,比如下面這個例子:

function changeOwner(address _newOwner) external onlyOwner{owner = _newOwner; // 只有owner地址運行這個函數,并改變owner
}

我們定義了一個changeOwner函數,運行它可以改變合約的owner,但是由于onlyOwner修飾符的存在,只有原先的owner可以調用,別人調用就會報錯。這也是最常用的控制智能合約權限的方法。

OpenZeppelin的Ownable標準實現?

OpenZeppelin是一個維護Solidity標準化代碼庫的組織,他的Ownable標準實現如下:?openzeppelin-contracts/contracts/access/Ownable.sol at master · OpenZeppelin/openzeppelin-contracts · GitHub

事件?

Solidity中的事件(event)是EVM上日志的抽象,它具有兩個特點:

  • 響應:應用程序(ethers.js)可以通過RPC接口訂閱和監聽這些事件,并在前端做響應。
  • 經濟:事件是EVM上比較經濟的存儲數據的方式,每個大概消耗2,000?gas;相比之下,鏈上存儲一個新變量至少需要20,000?gas

聲明事件?

事件的聲明由event關鍵字開頭,接著是事件名稱,括號里面寫好事件需要記錄的變量類型和變量名。以ERC20代幣合約的Transfer事件為例:

event Transfer(address indexed from, address indexed to, uint256 value);

我們可以看到,Transfer事件共記錄了3個變量fromtovalue,分別對應代幣的轉賬地址,接收地址和轉賬數量,其中fromto前面帶有indexed關鍵字,他們會保存在以太坊虛擬機日志的topics中,方便之后檢索。

釋放事件?

我們可以在函數里釋放事件。在下面的例子中,每次用_transfer()函數進行轉賬操作的時候,都會釋放Transfer事件,并記錄相應的變量。

// 定義_transfer函數,執行轉賬邏輯
function _transfer(address from,address to,uint256 amount
) external {_balances[from] = 10000000; // 給轉賬地址一些初始代幣_balances[from] -=  amount; // from地址減去轉賬數量_balances[to] += amount; // to地址加上轉賬數量// 釋放事件emit Transfer(from, to, amount);
}

EVM日志?Log?

以太坊虛擬機(EVM)用日志Log來存儲Solidity事件,每條日志記錄都包含主題topics和數據data兩部分。

12-3

主題?topics?

日志的第一部分是主題數組,用于描述事件,長度不能超過4。它的第一個元素是事件的簽名(哈希)。對于上面的Transfer事件,它的事件哈希就是:

keccak256("Transfer(address,address,uint256)")//0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

Copy

除了事件哈希,主題還可以包含至多3indexed參數,也就是Transfer事件中的fromto

indexed標記的參數可以理解為檢索事件的索引“鍵”,方便之后搜索。每個?indexed?參數的大小為固定的256比特,如果參數太大了(比如字符串),就會自動計算哈希存儲在主題中。

數據?data?

事件中不帶?indexed的參數會被存儲在?data?部分中,可以理解為事件的“值”。data?部分的變量不能被直接檢索,但可以存儲任意大小的數據。因此一般?data?部分可以用來存儲復雜的數據結構,例如數組和字符串等等,因為這些數據超過了256比特,即使存儲在事件的?topics?部分中,也是以哈希的方式存儲。另外,data?部分的變量在存儲上消耗的gas相比于?topics?更少。

測試代碼:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;contract Owner {address public owner; // 定義owner變量// 構造函數constructor(address initialOwner) {owner = initialOwner; // 在部署合約的時候,將owner設置為傳入的initialOwner地址}// 定義modifiermodifier onlyOwner {require(msg.sender == owner); // 檢查調用者是否為owner地址_; // 如果是的話,繼續運行函數主體;否則報錯并revert交易}// 定義一個帶onlyOwner修飾符的函數function changeOwner(address _newOwner) external onlyOwner{owner = _newOwner; // 只有owner地址運行這個函數,并改變owner}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;
contract Events {// 定義_balances映射變量,記錄每個地址的持幣數量mapping(address => uint256) public _balances;// 定義Transfer event,記錄transfer交易的轉賬地址,接收地址和轉賬數量event Transfer(address indexed from, address indexed to, uint256 value);// 定義_transfer函數,執行轉賬邏輯function _transfer(address from,address to,uint256 amount) external {_balances[from] = 10000000; // 給轉賬地址一些初始代幣_balances[from] -=  amount; // from地址減去轉賬數量_balances[to] += amount; // to地址加上轉賬數量// 釋放事件emit Transfer(from, to, amount);}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42092.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42092.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42092.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

電腦找回徹底刪除文件?四個實測效果的方法【一鍵找回】

電腦數據刪除了還能恢復嗎?可以的,只要我們及時撤銷上一步刪除操作,還是有幾率找回徹底刪除文件。 當我們的電腦文件被徹底刪除后,盡管恢復的成功率可能受到多種因素的影響,但仍有幾種方法可以嘗試找回這些文件。本文整…

使用 docker buildx 構建跨平臺鏡像

buildx是Docker官方提供的一個構建工具,它可以幫助用戶快速、高效地構建Docker鏡像,并支持多種平臺的構建。使用buildx,用戶可以在單個命令中構建多種架構的鏡像,例如x86和arm架構,而無需手工操作多個構建命令。此外bu…

【React Hooks原理 - useCallback、useMemo】

介紹 在實際項目中,useCallback、useMemo這兩個Hooks想必會很常見,可能我們會處于性能考慮避免組件重復刷新而使用類似useCallback、useMemo來進行緩存。接下來我們會從源碼和使用的角度來聊聊這兩個hooks。【源碼地址】 為什么要有這兩個Hooks 在開始…

使用selenium定位input標簽下的下拉框

先來看一下頁面效果&#xff1a;是一個可輸入的下拉列表 再來看一下下拉框的實現方式&#xff1a; 是用<ul>和<li>方式來實現的下拉框&#xff0c;不是select類型的&#xff0c;所以不能用傳統的select定位方法。 在著手定位元素前一定一定要先弄清楚下拉列表…

前后端的學習框架

前后端的學習框架 視頻鏈接&#xff1a;零基礎AI全棧開發系列教程&#xff08;一&#xff09;_嗶哩嗶哩_bilibili

什么是后端?

1、什么是后端&#xff1f; 后端開發人員從事于構建Web應用程序背后的實際邏輯&#xff0c;負責通過API向前端或者其他系統提供其他需要的信息&#xff0c;如&#xff1a;數據。 實際上&#xff0c;開發web應用中對用戶不可見的部分&#xff0c;稱為web后端&#xff0c;也就是…

初學vue3與ts:獲取組件ref實例

/*** 獲取組件ref* param {VueComponentIns} 組件實例* returns 組件ref*/ // eslint-disable-next-line export function useCompRef<T extends abstract new (...args: any) > any>(_: T) {return ref<InstanceType<T>>(); }使用 <a-com ref"a…

匯凱金業:數字貨幣對經濟的影響有哪些

隨著信息技術的飛速發展&#xff0c;數字貨幣作為一種新興的貨幣形態&#xff0c;正逐步走進人們的視野&#xff0c;并對傳統經濟體系產生著深遠影響。它不僅革新了交易方式&#xff0c;更在重塑金融格局、賦能經濟發展等方面展現出巨大潛力。 一、交易效率的“加速器” 數字…

單例模式之懶漢式

文章目錄 單例模式&#xff08;懶漢式&#xff09;代碼懶漢式&#xff08;線程不安全&#xff09;懶漢式&#xff08;線程安全&#xff0c;加鎖&#xff09;雙重檢查鎖&#xff08;線程安全&#xff0c;推薦&#xff09; 單例模式&#xff08;懶漢式&#xff09; 懶漢式是符合…

xxl-job集成SpringBoot

安裝xxl-job客戶端一般有很多方式&#xff0c;我這里給大家提供兩種安裝方式&#xff0c;包含里面的各項配置等等。 前期需要準備好MySQL數據庫。復制SQL到數據庫里面。 # # XXL-JOB v2.4.2-SNAPSHOT # Copyright (c) 2015-present, xuxueli.CREATE database if NOT EXISTS x…

項目機會:4萬平:智能倉,AGV,穿梭車,AMR,WMS,提升機,機器人……

導語 大家好&#xff0c;我是社長&#xff0c;老K。專注分享智能制造和智能倉儲物流等內容。 如下為近期國內智能倉儲物流相關項目的公開信息線索&#xff0c;這些項目具體信息會發布到知識星球&#xff0c;請感興趣的球友先人一步到知識星球【智能倉儲物流技術研習社】自行下載…

《SoC設計方法與實現》:全面掌握系統芯片設計精髓(可下載)

SoC&#xff08;System on Chip&#xff0c;系統級芯片&#xff09;設計是一項復雜而精細的工程活動&#xff0c;它涉及到將一個完整的電子系統的所有組件集成到一個單一的芯片上&#xff0c;包括處理器核心、內存、輸入/輸出端口以及可能的其他功能模塊。這種集成不僅要求設計…

oracle存儲結構-----邏輯存儲結構(表空間、段、區、塊)

文章目錄 oracle存儲結構圖&#xff08;邏輯存儲物理存儲&#xff09;oracle邏輯存儲結構圖邏輯存儲結構、表空間、段、區、數據塊的關系&#xff1a;1、數據 塊&#xff08;block&#xff09;---邏輯存儲最小單位2、 數據區&#xff08;extent&#xff09;--存儲空間分配和回收…

【AutoencoderKL】基于stable-diffusion-v1.4的vae對圖像重構

模型地址&#xff1a;https://huggingface.co/CompVis/stable-diffusion-v1-4/tree/main/vae 主要參考:Using-Stable-Diffusion-VAE-to-encode-satellite-images sd1.4 vae 下載到本地 from diffusers import AutoencoderKL from PIL import Image import torch import to…

電腦經常黑屏

情況簡述&#xff1a; 電腦經常突然黑屏&#xff0c;并且鼠標還能看到并且可操控 你是不是試過以下方法&#xff1a; 更換顯卡驅動版本?重置BIOS?重裝系統?全網找千篇一律沒啥用的教程? 這個標志熟悉吧&#xff0c;看看你的電腦里是否安裝了火絨&#xff0c;如果裝了繼續…

MySQL在Windows系統上的詳細安裝指南

一、準備工作 1. 確定MySQL版本 訪問MySQL官方網站&#xff1a;首先&#xff0c;你需要訪問MySQL的官方網站&#xff08;MySQL&#xff09;&#xff0c;或者更具體地&#xff0c;訪問MySQL的下載頁面&#xff08;MySQL :: Download MySQL Community Server&#xff09;。 選擇…

Linux運維:mysql主從復制原理及實驗

當一臺數據庫服務器出現負載的情況下&#xff0c;需要擴展服務器服務器性能擴展方式有向上擴展&#xff0c;垂直擴展。向外擴展&#xff0c;橫向擴展。通俗的講垂直擴展是將一臺服務器擴展為性能更強的服務器。橫向擴展是增加幾臺服務器。 主從復制好比存了1000塊錢在主上&…

Android14之獲取包名/類名/服務名(二百二十三)

簡介&#xff1a; CSDN博客專家&#xff0c;專注Android/Linux系統&#xff0c;分享多mic語音方案、音視頻、編解碼等技術&#xff0c;與大家一起成長&#xff01; 優質專欄&#xff1a;Audio工程師進階系列【原創干貨持續更新中……】&#x1f680; 優質專欄&#xff1a;多媒…

深度學習-梯度下降算法-NLP(五)

梯度下降算法 深度學習中梯度下降算法簡介找極小值問題數學上求最小值梯度梯度下降算法 找極小值問題在深度學習流程中深度學習整體流程圖求解損失函數的目標權重的更新 深度學習中梯度下降算法簡介 找極小值問題 引子&#xff1a; 我們訓練一個人工智能模型&#xff0c;簡單…

磁致伸縮液位計原理和特點

工作原理 磁致伸縮液位計的工作原理基于磁性材料在外部磁場作用下的尺寸變化來進行液位測量。該液位計主要由電子變送器、浮球&#xff08;浮子&#xff09;、探測桿&#xff08;測桿&#xff09;三部分組成。在磁致伸縮液位計的傳感器測桿外配有一浮子&#xff0c;此浮子可以…