(2.3)其他補充—— 二、solidity 基礎進階《實戰NFT web3 solidity(新版本0.8.+)》

《web3 solidity0.8.+版本(持續更新新版本內容) 基礎到實戰NFT開發》會及時更新新版本 solidity 內容,以及完成最終的 NFT 實戰商業項目部分。

注:由于是付費專欄內容,若有錯誤請及時聯系@1_bit,博客鏈接:https://blog.csdn.net/A757291228 ,或在文章下留言,收到后將會對錯誤進行改正,若是版本更新導致的問題也希望大家對錯誤進行提交,盡力去保證付費用戶該得到的權益。

文章目錄可查看:目錄(文章更新中…)
更新內容將會在目錄中更新…

友情提示:本系列文章讀者最好學過一門編程語言,面向對象語言更佳,文章所有代碼將會完整貼出。

一、字符串與 bytes

在 solidity 中 ,string 可以轉化為 bytes,并且在轉換時進行的是傳址操作,例如:

// SPDX-License-Identifier:MIT
pragma solidity ^0.8.7;
contract StringDemo{function StringChange()public pure returns(string memory){string memory str="Hello";bytes memory byteData;byteData=bytes(str);byteData[1]='H';return str;}
}

在以上合約中創建了一個方法 StringChange,返回 string 類型的數據,在方法中創建了一個 str 的 string 類型數據以及一個 bytes 類型的 byteData 數據,在接下來的代碼中使用 bytes 對字符串進行了強轉賦值給到 byteData,接著修改第 0 位的內容為 H,但是此時 return 的是轉化之前的 str 變量,那么 str 字符串變量是否能夠發生影響呢?

部署合約后我們可以查看結果:
在這里插入圖片描述

二、循環

在 solidity 中可以使用 for 循環,for 循環的語法跟其他編程語言(例如C 等)語法相似在此不再講解。

以下示例簡單的釋放了一個 for 循環的使用,由于過于簡單不再贅述:

// SPDX-License-Identifier:MIT
pragma solidity ^0.8.0;
contract StringDemo{uint[] arr=[1,2,3,4,5];function ForDemo()public view returns(uint){uint sum=0;for(uint i=0;i<arr.length;i++){sum+=arr[i];}return sum;}
}

以上代碼此需要注意的是,我們在 ForDemo 方法中的修飾是 view,若你寫錯了改成了 pure 之類的,那么將會報錯,因為在你修飾成了 pure 那么就表示你不會讀取狀態變量,那么你即使用了 arr那么也會報錯,例如:
在這里插入圖片描述

三、傳參怎么傳數組

在一些方法中,可能需要傳入的參數是數組,那么在 remix 中我們測試時該怎么傳入對應的數組參數呢?

以下是一個 solidity 代碼的示例:

// SPDX-License-Identifier:MIT
pragma solidity ^0.8.0;
contract StringDemo{function parameterDemo(uint[5] memory _arr)public pure returns(uint) {    return _arr[1];}
}

以上的 parameterDemo 方法接收一個固長數組,在此部署后如何進行傳參呢?

我們只需要傳入一個 [] 所包裹的值集合即可,記得一定要是長度為5的數組,例如傳入數據 [1,3,2,5,9]:

四、方法重載

solidity中支持重載,注意,是重載而不是重寫 override。

在 solidity 中的同名函數,但參數不同的函數為函數的重載,例如以下示例:

// SPDX-License-Identifier:MIT
pragma solidity ^0.8.7;
contract  PayDemo{function OverLoading(address)public pure returns(string memory){return "address";}function OverLoading(uint256)public pure returns(string memory){return "uint256";}function OverLoading(uint256[] memory)public pure returns(string memory){return "int256[]";}
}

以上示例中分別創建了 3 個同名函數,但參數不同,通過不同的參數返回不同的值,部署合約后如下:
在這里插入圖片描述
你會發現這樣不就是體現了可以重名嘛,和傳不同參數,本質上好像沒啥區別。

這是因為這是重載在外部的可視化體現是這樣的,若我們在合約中使用一個函數進行調用就不一樣了,例如此時再合約中添加一個方法:

uint256[] u256Arr=[1,2,3,4,5,6];
function CallOverLoading(uint256 _c)public view returns(string memory){string memory res;if(_c==1){res = OverLoading(0x7C4e30a43ecC4d3231b5B07ed082329020D141F3);}else if(_c==2){res =  OverLoading(125);}else if(_c==3){res = OverLoading(u256Arr);}return res;
} 

此時為了等下的傳入數組,在這里參加農歷 uint256 的數組,隨后創建一個 方法 CallOverLoading 接收一個參數 _c,并且在方法中判斷這個 _c 的值,從而給 OverLoading 傳入不同的參數,看看是否會返回不一樣的值,注意,在這里需要把 public 改為 private 會比較舒服一點,當然你不改也可以:
在這里插入圖片描述

改了之后部署就會顯示一個 方法,這樣看起來比較爽:
在這里插入圖片描述

接著輸入不同的值:
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

這樣就舒服多了。

五、constant

constant 在 solidity 中常量的修飾符,通過使用 constant 對變量修飾后,變量轉為常量且不可變,若修改將會報錯:
在這里插入圖片描述

六、函數修改器 modifier

在 solidity 中有一個函數修改器可作為前置、中置或者后置方法,有點像 ASP.NET 中的母版頁(最起碼差不多十年不碰了,不懂還有沒有這個概念),又有點像 ThinkPHP 中的前置方法,可以在指定某個函數調用前、中執行該函數,下面是一個示例:

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.6;
contract ModifierTest{modifier checkAge(uint val){require(val<10,"Age < 10");_;}modifier checkHeight(uint val){require(val>260,"Height < 260");_;}function osVal(uint age,uint height) external pure checkAge(age) checkHeight(height){age+=1;}
}

以上代碼中使用 modifier 創建了函數修改器,modifier 之后是對應的函數修改器名稱,可以接收參數或者不接收參數,其中的 “_;” 表示使用這個修改器的函數代碼位置,例如:

modifier checkHeight(uint val){require(val>260,"Height < 260");_;}

在被 osVal 方法調用后,osVal 方法中代碼的位置就等于在“_;”位置進行填充。在 osVal 中使用這些修改器只需要再其后說明即可,并且可以傳入對應的參數,調用后效果如下:
在這里插入圖片描述

“三明治”用法:

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.6;
contract ModifierTest{uint public age=0;modifier sandwich(){age+=1;_;age+=1;}function osVal() external sandwich(){age+=1;}
}

三明治用法就是用于中間:

在這里插入圖片描述

七、合約銷毀

在 solidity 中,selfdestruct 是一個合約銷毀方法,在部署時初始化函數中記錄 msg.sender 后,通過一個方法使用 selfdestruct 傳入 owner 即可對當前合約進行銷毀:

// SPDX-License-Identifier:MIT
pragma solidity ^0.8.7;
contract  selfdestructDemo{address owner;constructor () {owner = msg.sender;}function kill() public {require (msg.sender == owner);selfdestruct(payable(owner));}}

不過在此要注意,selfdestruct 傳入 owner 參數時需要將 owner 通過 payable 類型強轉,否則將會出現如下錯誤:
在這里插入圖片描述

待完善補充 將 逐步完善(重要的知識點或在后面章節單章更新)

事件 /索引 indexed
自定義錯誤
abi.encode/abi.encodePacked
interface
keccak256

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

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

相關文章

Android之實現點擊布局縮小然后再放大動畫

1、需求 現在需要實現點擊View先縮小然后再放大效果 2、代碼實現 在res的anim目錄下面&#xff0c;寫anim_small.xml文件 <?xml version"1.0" encoding"utf-8"?> <set xmlns:android"http://schemas.android.com/apk/res/android"…

如何在web api中使用SignalR

說明&#xff1a; 在webapi中使用signalr&#xff0c;使用IIS 環境&#xff1a; vs2012, .net4.5 第一步&#xff1a;建web api項目 第二步&#xff1a;nuget導入signalr Install-Package Microsoft.AspNet.SignalR Install-Package Microsoft.Owin.Cors &#xff08;用于…

Directx11學習筆記【二】 將HelloWin封裝成類

我們把上一個教程的代碼封裝到一個類中來方便以后的使用。 首先新建一個空工程叫做MyHelloWin&#xff0c;添加一個main.cpp文件&#xff0c;然后新建一個類叫做MyWindow,將于窗體有關的操作封裝到里面 MyWindow.h文件 1 /***************************************************…

Badboy自動化測試工具11 導出腳本用于Jmeter并發測試

本節主要講解利用Jmeter進行并發測試和引入圖像報表 1. 在Jmeter中打開上節課&#xff08;10&#xff09;Badboy導出的在拉手網查詢KTV的腳本Lashou_Search.jmx. 2. 右擊Lashou節點&#xff0c;Add->Listener->Aggregate Graph & Graph Results 3. 對圖像報表進行配置…

ArcGIS實驗教程——實驗三十九:ArcGIS多元分類(ISO聚類分析、最大似然分類、主成分分析)案例教程

ArcGIS實驗視頻教程合集:《ArcGIS實驗教程從入門到精通》(附配套實驗數據)》 文章目錄 一、ISO聚類1. ISO聚類簡介2. ISO聚類進行非監督分類實驗操作二、最大似然分類1. 最大似然簡介2. 最大似然分類實驗案例三、主成分分析1. 主成分分析簡介2. 主成分分析實驗案例四、配套實…

ABP Framework 5.3.0 版本新增功能和變更說明

ABP Framework 5.3.0 穩定版已在2022年6月14日正式發布。以下是本版本的新增功能&#xff1a;? “開始”頁面提供創建單層項目選項? 啟動模板提供 PWA 支持? Volo.Abp.Gdpr.Abstractions 包介紹? 將發件箱中的事件批量發布到事件總線? eShopOnAbp 項目改進和電子書公告? …

智能合約開發——TypeScript 基礎(全)

TS 準備 首先我們準備一個目錄&#xff0c;使用 dos 進入到某目錄&#xff0c;當然你直接 vs 打開終端執行也是沒有問題的&#xff1a; 執行以下命令安裝 typescrip&#xff08;不用進入目錄&#xff0c;直接安裝即可&#xff09;&#xff1a; npm install -g typescript我是…

查看MySQL的當前日期

select current_date(); 查看MySQL的當前日期轉載于:https://www.cnblogs.com/dengyg200891/p/5972698.html

【ArcGIS風暴】ArcGIS支持的柵格數據格式大全及格式轉換案例精解

ArcGIS功能異常強大,支持多種常見的柵格數據格式,并可實現多個柵格格式的自由轉換。 在ArcGIS中,常見的柵格數據格式有:TIFF、BMP、ENVI、Esri BIL、Esri BIP、Esri BSQ、GIF、GRID、IMAGINE Image、JP2、JPG、和PNG。 BIL —Esri 波段按行交叉格式文件BIP —Esri 波段按像…

Android之靠譜的獲取本地相冊圖片

1、需要申請手機讀寫的權限 AndroidMani.xml里面配置權限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 我們一般采用RxPe…

利用Signalr實現手機端App掃碼登錄web頁面

實現原理&#xff1a; 1、web登錄頁面&#xff0c;利用jquery.qrcode展示一個隨機生成的登錄碼的二維碼&#xff1b; 2、手機App掃描二維碼取得登錄碼&#xff1b; 3、手機App將本地用戶id登錄碼通過api提交服務器&#xff1b; 4、服務器api&#xff0c;收到手機App請求&am…

【ArcGIS風暴】ArcGIS柵格影像(NDVI)歸一化處理的兩種方法精解

【ArcGIS遇上Python】ArcGIS批量處理柵格影像(NDVI)歸一化完整案例代碼 圖像歸一化是指對圖像進行了一系列標準的處理變換,使之變換為一固定標準形式的過程,該標準圖像稱作歸一化圖像。 原始圖像在經歷一些處理或攻擊后可以得到多種副本圖像,這些圖像在經過相同參數的圖像…

[從C到C++] 1.3 C++布爾類型(bool)

布爾類型(bool)是C新增的一種基本數據類型。在標準的C語言中并未定義bool類型&#xff0c;如果需要使用bool類型&#xff0c;程序員可以通過宏定義來自定義一個bool類型&#xff0c;定義語句如下&#xff1a; #define bool int #define false 0 #define true 1 也就是將int型定…

以小見大:一個領域建模的簡單示例,理解“領域驅動”。

背景&#xff1a;航空公司為了確保飛行路線不發生沖突&#xff0c;需要開發一款飛行路線管理軟件。過程&#xff1a;我們先去找這個領域的專家&#xff0c;自然是作為平時管理和維護機場飛行秩序的工作人員&#xff1b;我們第一個目標就是與他們溝通&#xff0c;也許我們并不能…

hibernate -- hello world

http://developer.51cto.com/art/201202/315931_all.htm轉載于:https://www.cnblogs.com/iOS-mt/p/5973646.html

Android之底部Dialog里面放EditText點擊布局頂上去效果

1、需求 在底部Dialog里面放EditText點擊,布局需要頂上去,不頂上去很煩。 2、Dialog里面關鍵樣式屬性 <item name="android:windowFullscreen">false</item> 3、布局代碼簡單試下 樣式 <style name="DialogTheme" tools:ignore="…

SignalR ——Android實踐

SignalR 的版本&#xff1a;aspnetcore-2.2, Java SignalR-1.0.0 一、先說幾個點 1、我使用SignalR的時候服務器使用的是自簽名的HTTPS證書&#xff0c;所以OkHttp是無法直接解析的&#xff0c;會報錯。需要修改SignalR里面OkHttp部分的源碼&#xff0c;讓其信任所有的HTTPS連…

【ArcGIS遇上Python】ArcGIS批量處理柵格影像(NDVI)歸一化完整案例代碼

文章《ArcGIS柵格影像(NDVI)歸一化處理的兩種方法精解》詳細介紹了ArcGIS中進行NDVI影像歸一化處理的兩種方法,但是無法批量進行,本文就放大招用Python實現批量NDVI歸一化處理,大大提高了工作效率,還不趕快Get了? 完整Python代碼: import arcpy from arcpy import env…

Spark1.0.0 屬性配置

1&#xff1a;Spark1.0.0屬性配置方式Spark屬性提供了大部分應用程序的控制項&#xff0c;而且能夠單獨為每一個應用程序進行配置。在Spark1.0.0提供了3種方式的屬性配置&#xff1a;SparkConf方式 SparkConf方式能夠直接將屬性值傳遞到SparkContext&#xff1b;SparkConf能夠對…

Lync Server 2010遷移至Lync Server 2013部署系列 Part1: 擴展AD架構

由于最近直在忙Lync 升級&#xff0c;好久沒有更新博客了&#xff0c;今天開始將對最近做的Lync Server 2010遷移至Lync Server 2013項目做一個系列的部署操作更新&#xff0c;希望能給即將在企業中部署的兄弟們有所幫助&#xff0c;在這個測試環境中&#xff0c;企業 前端池共…