深入理解Solidity 三

Solidity函數聲明和類型

  • ?函數的值類型有兩類:內部(internal)類型和外部(external)類型
  • 內部函數只可以在當前合約內部被調用(即在當前代碼塊內,包括內部庫函數和繼承函數),因為他們不能在當前合約的上下文中的外部被執行。調用一個內部函數是通過跳轉到它的入口標簽來實現的,就像在當前合約的內部調用一個函數
  • 外部函數是由一個地址和一個函數的簽名組成,可以通過外部函數調用傳遞或者返回
  • 調用內部函數,直接使用名字f
  • 調用外部函數:this.f(當前合約),a.f(外部合約)
  • 除了使用外部函數調用外,還可以使用繼承機制

例子(外部函數調用)

contract C{uint a;function f() public{}
}
contract D{function g() public{C c = new C();c.f();}
}

例子(繼承機制)

  • 可以使用internal函數/public函數,不可以使用private函數
  • D繼承C合約,只會把交叉的函數編譯上傳
contract C{uint a;function f() public{}
}
contract D is C{function g() public{f();}
}

函數的可見性

  • 函數的可見性可以指定為external、public、internal或者private;對于狀態變量,不可以設置為external,默認是internal
  • external:外部函數作為合約接口的一部分,意味著我們可以從其他合約和交易中調用。一個外部函數f不可以從內部調用(即f不起作用,但是this.f可以)。當接收到大量的數據的時候,外部函數有時候會更有效率
  • public:public函數是合約接口的一部分,相當于定義了一個view類型的可以返回參數的函數,可以在內部或者通過消息調用。對于public狀態變量,會自動生成一個getter函數

例子

uint public a;//將a聲明為public,就相當于為a定義了如下的函數形式
function a() public view returns (uint){return a;
}
  • internal:這些函數和狀態變量只能是內部訪問(即從當前合約內部或者從其他派生的合約訪問),不可以使用this
  • private:private函數和狀態變量僅在當前定義他們的合約中使用,并且不能被派生合約使用。

函數狀態可變性

  • payable:允許從消息調用中接收以太幣Ether
  • constant:和view相同,一般只修飾狀態變量,不允許賦值(除了初始化之外)
 constructor()public payable{}//創建合約的同時需要往合約上面轉錢
  • pure:純函數,不允許修改或者訪問狀態
  • view:不允許修改狀態

函數狀態可變性

  • 修改狀態變量
  • 產生事件
  • 創建其他合約
  • 使用selfdestruct(自殺/自毀)
  • 通過調用發送以太幣
  • 調用任何沒有標記為view或者pure的函數
  • 使用低級調用
  • 使用包含特定操作嗎的內聯匯編

以下是被認為從狀態中進行讀取

  • 讀取狀態變量
  • 訪問this.balance或者<address>.balance
  • 訪問block、tx、msg中任意成員(除了msg.sig和msg.data之外)
  • 調用任何未標記為pure的函數
  • 使用包含某些操作碼的內聯匯編

函數修飾器 modifier

  • 使用修飾器modifier可以輕松改變函數的行為。例如,他們可以在執行函數之前自動檢查某個條件。修飾器modifier是合約的可繼承屬性,并可能被派生合約覆蓋
  • 如果同一個函數有多個修飾器modifier,他們之間可以使用空格隔開,修飾器modifier會依次檢查執行。

代碼

contract Purchase{address public seller;constructor() public{seller = msg.sender;}modifier onlySeller(){require(msg.sender == seller,"Only seller");_;}function f() public view onlySeller returns(uint){return 200;}
}

效果展示

  • msg.sender是合約的部署者,只有合約的部署者調用f函數,返回200,剩余的人會返回錯誤信息,only seller
  • require(msg.sender == seller,"Only seller");逗號之前是檢查條件,之后是返回報錯信息,檢查條件在代碼流程之前執行
  • _;將代碼流程嵌套到這里,指代檢查條件執行之后,執行代碼的邏輯。(函數體)

回退函數(fallback)

  • 回退函數(fallback function)是合約中的特殊函數;沒有名字,不能有參數也不能有返回值
  • 如果在一個到合約的調用中,沒有其他函數與給定的函數標示符匹配(或者沒有提供調用函數),你們這個函數(fallbacj函數)會被執行
  • 每當合約收到以太幣(沒有任何數據),回退函數就會執行。此外,為了接收以太幣,fallback函數必須標記為payable。如果不存在這樣的函數,則合約不能通過常規交易接收以太幣
  • 在上下文中只有很少的gas可以用來完成回退函數的調用,所以使fallback函數的調用盡量廉價很重要

代碼

pragma solidity >0.4.99  <0.6.0;
contract Sink{function() external payable{}
}
contract Test{function() external {x=1;}uint x;
}contract Caller{function calllTest(Test test)public returns(bool){(bool success,) = address(test).call(abi.encodeWithSignature("nonExistingFunction()"));require(success);address payable testPayable = address(uint160(address(test)));return testPayable.send(2 ether);}
}

注解

  • 調用合約中不存在的函數和轉錢的時候會調用回退函數
  • 回退函數適用在合約5.0版本以上

事件(event)

  • 事件是以太坊EVM提供的一種日志基礎設施。事件可以用來做操作記錄,存儲為日志。也可以用來實現一些交互功能,比如通知UI,返回函數的調用結果
  • 當定義的事件被觸發時,可以將事件存儲到EVM的交易日志中,日志是區塊鏈中的一種特殊的數據結構;日志和合約相互關聯,與合約的存儲合并存入到區塊鏈條中,只要某個區塊可以訪問,其相關的日志就可以訪問,但是在合約中是不可以之間訪問日志和事件數據
  • 可以通過日志實現簡單支付驗證SPV,如果一個外部實體提供了一個帶有這種證明的合約,它可以檢查日志是否真實存在于區塊鏈中

異常處理

  • 適用狀態恢復異常來處理異常。這樣的異常將會撤銷對于當前的調用(及其所有的子調用)中的狀態所做的所有的更改,并且向調用者返回錯誤
  • 函數的assert和require用于判斷條件,并且在不滿足條件的時候拋出異常
  • assert()一般只應用于測試內部的錯誤,并且檢查異常
  • require()應用于確保滿足有效的條件(如輸入或合約的狀態變量),或者驗證調用外部合約的返回值
  • revert()用于拋出異常,它可以標記一個錯誤并且將當前調用回退

單位

  • 以太幣單位之間的換算就是在數字后邊加上wei、finney、szabo或者ether來實現,如果沒有單位,缺省為wei

時間

  • 秒是缺省單位,在時間單位之間,數字后面帶有seconds、minutes、hours、days、weeks和years的可以進行換算?但是這些后綴不可以直接用在變量的后邊,如果需要使用到時間單位(例如days)來將輸入變量轉換為時間,可以使用如下方式
function f(uint start,uint daysAfter)public{if (now >= start + daysAfter * 1 days)
}

?

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

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

相關文章

HTTP狀態代碼及其定義

狀態行包含HTTP版本、狀態代碼、與狀態代碼對應的簡短說明信息。在大多數情況下&#xff0c;除了Content-Type之外的所有應答頭都是可選的。但Content-Type是必需的&#xff0c;它描述的是后面文檔的MIME類型。雖然大多數應答都包含一個文檔&#xff0c;但也有一些不包含&#…

安裝solc模塊4.25版本

使用國產阿里云的cnpm 如果不知道cnpm 參考鏈接 安裝solc模塊4.25版本 npm i solc0.4.25 --save -g查看安裝是否成功 可以配置軟連接使用solc&#xff0c;我的沒有配置 solcjs --version

conda關鍵命令

創建環境 創建名字為python3的虛擬環境&#xff0c;并且指定conda的python版本為3.6--name也可以縮寫為-namepython3.6 是指定python的版本號,如果不指定就默認為裝anaconda時python版本python3是創建的新的虛擬環境的名字&#xff0c;創建完&#xff0c;虛擬環境安裝在anacon…

GDB 調試程序 詳解 使用實例

用GDB調試程序 GDB概述 ———— GDB是GNU開源組織發布的一個強大的UNIX下的程序調試工具。或許&#xff0c;各位比較喜歡那種圖形界面方式的&#xff0c;像VC、BCB等IDE的調試&#xff0c;但如果你是在UNIX平臺下做軟件&#xff0c;你會發現GDB這個調試工具有比VC、BCB的圖形化…

在pycharm中使用conda虛擬環境(conda虛擬環境是已經創建好的),解決python安裝包文件很費勁的問題

查看conda的虛擬環境 使用PyCharm連接conda創建的虛擬環境&#xff0c;需要一個前提就是虛擬環境必須存在&#xff0c;使用conda env list命令查看虛擬環境列表打開PyCharm軟件 打開pycharm&#xff0c;選擇File->setting->Project:****->Project Interperter&#…

YUV測試序列下載地址

1、http://www.tkn.tu-berlin.de/research/vid/&#xff08;此網站已經移走&#xff0c;正在尋找。&#xff09; CIF&#xff1a; Akiyo、Bridge (far) 、Bridge (close) 、Bus 、Container 、Coastguard 、Flower 、Football 、Foreman 、Hall 、Highway 、Mobile & Calen…

flask 安裝flask_resultful

命令如下 conda install -c https://conda.anaconda.org/conda-forge flask-restful

完成一個H.265/HEVC碼流分析工具

經過大約一個月左右的業余時間&#xff0c;終于初步完成一個H.265/HEVC碼流分析工具。時間包括平時的周末、晚上&#xff0c;以及調休的集中時間。當然&#xff0c;中秋回家過節不寫代碼。截至今天&#xff0c;經過多種H.265序列測試&#xff0c;也有各種工具對比&#xff0c;基…

Linux中創建用戶并且配置sudo權限,百分百簡單有效

配置步驟如下&#xff1a; 登陸或切換到root用戶下&#xff1b;因為只有root用戶才具有權限進行用戶的添加&#xff0c;使用命令sudo su&#xff0c;切換為管理員用戶添加用戶 adduser -m youuser&#xff0c;并且在home路徑下創建同名的用戶文件夾passwd youuser&#xff0c;…

Java 計算兩個日期之間的相差天數

代碼如下 package com.data.dp;import org.apache.commons.lang3.StringUtils;import java.text.ParseException; import java.text.SimpleDateFormat;public class testDate {public static void main(String[] args) throws ParseException {SimpleDateFormat df new Simpl…

【HEVC】目前H265分析軟件推薦

2014-11-14liuwri本帖最后由 zxdaemon 于 2012-12-25 04:06 PM 編輯 1&#xff0c;Codecvisa&#xff1a; http://codecian.com/國產軟件&#xff0c;從最早的H264visa發展至今&#xff0c;感覺從剛開始的玩票&#xff0c;發展到今天專業級別的商業軟件&#xff0c;值得支持。軟…

將IPFS 配置服務器,電腦連接遠程服務器,環境配置

先前安裝配置的步驟省略&#xff0c;僅僅涉及后期的環境修改步驟 1&#xff0c;找到配置文件config&#xff0c;現需要使用命令ipfs init&#xff0c;從而生成.ipfs文件 ipfs init cd ~/.ipfs2&#xff0c;使用命令ls查看當前文件夾下面所包含的文件&#xff0c;正常情況小會…

Golomb及指數哥倫布編碼原理介紹及實現

文章來源&#xff1a; https://www.cnblogs.com/wangguchangqing/p/6297792.html &#xff0c; 寫的不錯&#xff0c;轉發出來。 2017年的第一篇博文。 本文主要有以下三部分內容&#xff1a; 介紹了Golomb編碼&#xff0c;及其兩個變種&#xff1a;Golomb-Rice和Exp-Golo…

解決ipfs 出現Error: can‘t publish while offline: pass `--allow-offline` to override的問題

原因 出現這個問題的原因是因為&#xff0c;ipfs未與公網上的節點相互連接&#xff0c;因此此時處于離線狀態 使用場景 部署自己的博客&#xff0c;后期的改動&#xff0c;累計追加在同一個地址&#xff0c;這個地址是唯一的&#xff0c;也就是創建ipfs生成的ID號 步驟 1&…

HEVC 編解碼資源

資料 overview 等 csvt系列詳見HHI主頁&#xff0c;適合&#xff1a;入門 Encoder Description 適合入門 Recommendation H.265 pdf 2016-12-22 標準文檔&#xff0c;適合&#xff1a;提高&#xff1b;解碼 High Efficiency Video Coding (HEVC): Algorithms and Architectures…

安裝ipfs-http-client出現constants@0.1.2 install: node build.js > index.browser.js錯誤的解決辦法

錯誤截圖 原先的命令 npm install --save-dev ipfs-http-client 修改后的命令 npm install --save-dev ipfs-http-client --unsafe-permtrue --allow-root

安裝ipfs-api的命令變了,最新版的命令如下

原先使用的命令安裝ipfs-api npm install --save-dev ipfs-api 現在使用的命令安裝ipfs-api npm install --save-dev ipfs-http-client 官方文檔 參考教程 官方文檔

執行truffle unbox react報錯,出現Error: connect ECONNREFUSED 0.0.0.0:443問題的解決辦法

前提&#xff1a;我是用的是MAC系統&#xff0c;不知道使用windows系統是否也可以 react-box 項目構建 localhost:ReactDapp liyuechun$ truffle unbox react-boxStarting unbox... ? Preparing to download box ? Downloading Unbox failed! RequestError: Error: connect…

區塊鏈相關問題 理解

本博客針對區塊鏈的部分問題進行詳解&#xff0c;希望幫助大家對于區塊鏈有一個更好的理解 1&#xff0c;如果散布虛假交易&#xff0c;怎么整&#xff1f;&#xff08;誰欠我XXX比特幣&#xff09; 1&#xff0c;可以發起虛假交易&#xff0c;但是很難被全網的節點接收并寫入…

區塊鏈的相關知識點

1&#xff0c;密碼學原理 密碼學原理 1&#xff0c;collision resistance 哈希函數 &#xff0c;目前還是很安全的&#xff0c;沒有找到任何不同的內容其哈希是一致的情形。哈希碰撞&#xff08;這個在數學上面是沒法證明的&#xff0c;都是日常的實踐表明&#xff0c;無法找…