Oracle public view,【易錯概念】以太坊Solidity函數的external/internal,public/private,view/pure/payable區別...

4acc913d84cc

1. 函數類型:內部(internal)函數和外部(external)函數

函數類型是一種表示函數的類型。可以將一個函數賦值給另一個函數類型的變量,也可以將一個函數作為參數進行傳遞,還能在函數調用中返回函數類型變量。 函數類型有兩類:- 內部(internal)函數和 外部(external) 函數:

內部函數只能在當前合約內被調用(更具體來說,在當前代碼塊內,包括內部庫函數和繼承的函數中),因為它們不能在當前合約上下文的外部被執行。 調用一個內部函數是通過跳轉到它的入口標簽來實現的,就像在當前合約的內部調用一個函數。

外部函數由一個地址和一個函數簽名組成,可以通過外部函數調用傳遞或者返回。

函數類型表示成如下的形式

function () {internal|external} [pure|constant|view|payable] [returns ()]

與參數類型相反,返回類型不能為空 —— 如果函數類型不需要返回,則需要刪除整個 returns () 部分。

函數類型默認是內部函數,因此不需要聲明 internal 關鍵字。 與此相反的是,合約中的函數本身默認是 public 的,只有當它被當做類型名稱時,默認才是內部函數。

有兩種方法可以訪問當前合約中的函數:一種是直接使用它的名字,f ,另一種是使用 this.f 。 前者適用于內部函數,后者適用于外部函數。

如果當函數類型的變量還沒有初始化時就調用它的話會引發一個異常。 如果在一個函數被 delete之后調用它也會發生相同的情況。

如果外部函數類型在 Solidity 的上下文環境以外的地方使用,它們會被視為 function 類型。 該類型將函數地址緊跟其函數標識一起編碼為一個 bytes24 類型。。

請注意,當前合約的 public 函數既可以被當作內部函數也可以被當作外部函數使用。 如果想將一個函數當作內部函數使用,就用 f 調用,如果想將其當作外部函數,使用 this.f 。

除此之外,public(或 external)函數也有一個特殊的成員變量稱作 selector,可以返回 ABI 函數選擇器:

pragma solidity ^0.4.16;

contract Selector {

function f() public view returns (bytes4) {

return this.f.selector;

}

}

如果使用內部函數類型的例子:

pragma solidity ^0.4.16;

library ArrayUtils {

// 內部函數可以在內部庫函數中使用,

// 因為它們會成為同一代碼上下文的一部分

function map(uint[] memory self, function (uint) pure returns (uint) f)

internal

pure

returns (uint[] memory r)

{

r = new uint[](self.length);

for (uint i = 0; i < self.length; i++) {

r[i] = f(self[i]);

}

}

function reduce(

uint[] memory self,

function (uint, uint) pure returns (uint) f

)

internal

pure

returns (uint r)

{

r = self[0];

for (uint i = 1; i < self.length; i++) {

r = f(r, self[i]);

}

}

function range(uint length) internal pure returns (uint[] memory r) {

r = new uint[](length);

for (uint i = 0; i < r.length; i++) {

r[i] = i;

}

}

}

contract Pyramid {

using ArrayUtils for *;

function pyramid(uint l) public pure returns (uint) {

return ArrayUtils.range(l).map(square).reduce(sum);

}

function square(uint x) internal pure returns (uint) {

return x * x;

}

function sum(uint x, uint y) internal pure returns (uint) {

return x + y;

}

}

另外一個使用外部函數類型的例子:

pragma solidity ^0.4.11;

contract Oracle {

struct Request {

bytes data;

function(bytes memory) external callback;

}

Request[] requests;

event NewRequest(uint);

function query(bytes data, function(bytes memory) external callback) public {

requests.push(Request(data, callback));

NewRequest(requests.length - 1);

}

function reply(uint requestID, bytes response) public {

// 這里要驗證 reply 來自可信的源

requests[requestID].callback(response);

}

}

contract OracleUser {

Oracle constant oracle = Oracle(0x1234567); // 已知的合約

function buySomething() {

oracle.query("USD", this.oracleResponse);

}

function oracleResponse(bytes response) public {

require(msg.sender == address(oracle));

// 使用數據

}

}

注解

Lambda 表達式或者內聯函數的引入在計劃內,但目前還沒支持。

2. 函數可見性說明符:public,private,external,internal

public:內部、外部均可見(參考為存儲/狀態變量創建 getter 函數)

private:僅在當前合約內可見

external:僅在外部可見(僅可修飾函數)——就是說,僅可用于消息調用(即使在合約內調用,也只能通過 this.func 的方式)

internal:僅在內部可見(也就是在當前 Solidity 源代碼文件內均可見,不僅限于當前合約內,譯者注)

函數可見性說明符格式:

function myFunction() returns (bool) {

return true;

}

3. 函數修改器

pure 修飾函數時:不允許修改或訪問狀態——但目前并不是強制的。

view 修飾函數時:不允許修改狀態——但目前不是強制的。

payable 修飾函數時:允許從調用中接收 以太幣Ether 。

constant 修飾狀態變量時:不允許賦值(除初始化以外),不會占據 存儲插槽storage slot 。

constant 修飾函數時:與 view 等價。

anonymous 修飾事件時:不把事件簽名作為 topic 存儲。

indexed 修飾事件時:將參數作為 topic 存儲。

4. 參考

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

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

相關文章

c-style字符字符串_C字符串-能力問題與解答

c-style字符字符串C programming String Aptitude Questions and Answers: In this section you will find C Aptitude Questions and Answers on Strings, String is the set of characters and String related Aptitude Questions and Answers you will find here. C編程Stri…

PHP Smarty template for website

/******************************************************************************* PHP Smarty template for website* 說明&#xff1a;* 之前一直在想將MVC的方式加在PHP做的網站上&#xff0c;這樣比較好處理&#xff0c;相對來說比較好* 處理…

ftp連接oracle服務器,使用SSL加密連接FTP - 架建SSL安全加密的FTP服務器(圖)_服務器應用_Linux公社-Linux系統門戶網站...

四、使用SSL加密連接FTP啟用Serv-U服務器的SSL功能后&#xff0c;就可以利用此功能安全傳輸數據了&#xff0c;但FTP客戶端程序必須支持SSL功能才行。 如果我們直接使用IE瀏覽器進行登錄則會出現圖4顯示的錯誤信息&#xff0c;一方面是以為沒有修改默認的端口21為990&#xff0…

c# 情感傾向_C否則-能力傾向問題與解答

c# 情感傾向C programming if else Aptitude Questions and Answers: In this section you will find C Aptitude Questions and Answers on condition statements – if else, nested if else, ladder if else, conditional operators etc. C語言編程如果有問題&#xff0c;請…

springboot中使用緩存shiro-ehcache

在pom.xml中注入緩存依賴&#xff0c;版本(Sep 09, 2016)spring-context-support 包含支持UI模版&#xff08;Velocity&#xff0c;FreeMarker&#xff0c;JasperReports&#xff09;&#xff0c; 郵件服務&#xff0c; 腳本服務(JRuby)&#xff0c; 緩存Cache&#xff08;EHCa…

oracle 微信公眾號,關于微信公眾號貼代碼的方法

微信公眾號碼上貼代碼一直一來都是個頭疼的問題。吐槽一句&#xff1a;要是后臺編輯器支持markdown就好了。今天教大家用在線markdown排版工具&#xff0c;把代碼完美貼到微信公眾號上。長話短說&#xff0c;今天用到的兩個工具&#xff1a;首先&#xff0c;以一段代碼為例。假…

計算理論 形式語言與自動機_下推式自動機(PDA)| 計算理論

計算理論 形式語言與自動機Pushdown Automaton (PDA) is a kind of Automaton which comes under the theory of Computation that appoints stack. The word Pushdown stands due to the fact that the stack can be pushed down as operations can only work on the elements…

運維人員究竟如何提升價值,持續獲得高薪?

作者簡介&#xff1a;老男孩&#xff0c;北京老男孩IT教育創始人&#xff0c;17年IT經驗&#xff0c;資深Linux實戰專家&#xff0c;IT培訓界實戰派頂尖大師&#xff0c;國內將實戰心理學體系大量注入IT運維培訓領域的第一人&#xff0c;多本IT暢銷圖書作者&#xff0c;51CTO金…

Webservice soap wsdl區別之個人見解

Web Service實現業務訴求&#xff1a;Web Service是真正“辦事”的那個&#xff0c;提供一種辦事接口的統稱。WSDL提供“能辦的事的文檔說明”&#xff1a;對要提供的服務的一種描述格式。我想幫你的忙&#xff0c;但是我要告訴你我都能干什么&#xff0c;以及干這些事情需要的…

java uuid靜態方法_Java UUID nameUUIDFromBytes()方法及示例

java uuid靜態方法UUID類名UUIDFromBytes()方法 (UUID Class nameUUIDFromBytes() method) nameUUIDFromBytes() method is available in java.util package. java.util包中提供了nameUUIDFromBytes()方法 。 nameUUIDFromBytes() method is used to get a UUID constructed fr…

清空 linux 服務器,Linux服務器清理

Why?廢話不多說直接來圖&#xff0c;可以看出磁盤已經快要滿了未清之前What?可以看出mnt文件夾占用的最大&#xff0c;然后進入mnt目錄里通過命令,根據文件大小對該路徑下文件排序du -h --max-depth1我們服務器出現磁盤快滿了的原因是因為&#xff0c;服務器部署了多個tomcat…

Git中的AutoCRLF與SafeCRLF換行符問題

2019獨角獸企業重金招聘Python工程師標準>>> 原文&#xff1a;http://www.cnblogs.com/flying_bat/archive/2013/09/16/3324769.html 最近在使用GitHub&#xff0c;發現不時沒有修改過的文件要提交&#xff0c;對比發現文件全部修改&#xff0c;但找不到不一樣的地方…

stringwriter_Java StringWriter getBuffer()方法與示例

stringwriterStringWriter類的getBuffer()方法 (StringWriter Class getBuffer() method) getBuffer() method is available in java.io package. getBuffer()方法在java.io包中可用。 getBuffer() method is used to get the StringBuffer that holds the present buffer valu…

linux 下郵件服務器,Linux 下搭建Postfix郵件服務器

Linux 下搭建Postfix郵件服務器詳解&#xff1a;1、首先關閉sendmail服務service sendmail stop2、chkconfig sendmail off(關閉開機自啟動)3、修改DNS正解文件&#xff0c;使DNS能夠解析郵箱服務添加下面兩行mail.zhubf.com. IN A 172.17.17.2zhubf.com. IN M…

Java PipedInputStream close()方法與示例

PipedInputStream類close()方法 (PipedInputStream Class close() method) close() method is available in java.io package. close()方法在java.io包中可用。 close() method is used to close this PipedInputStream and free all system resources linked with this stream…

Coreseek Windows下安裝調試

由于項目需要全文檢索&#xff0c;后面就去網上查了下資料&#xff0c;找到了Sphinx【中文是獅身人面像】這個全文檢索引擎&#xff0c;聽說挺好用的&#xff0c;不過沒有中文分詞。后面又去找了一下&#xff0c;找到了Coreseek&#xff0c;一款中文全文檢索/搜索軟件。 一、Sp…

linux sudo命令全稱,linux sudo命令的概念與使用

1.sudo介紹本文引用地址&#xff1a;http://www.eepw.com.cn/article/201610/305498.htmsudo是linux下常用的允許普通用戶使用超級用戶權限的工具&#xff0c;允許系統管理員讓普通用戶執行一些或者全部的root命令&#xff0c;如halt&#xff0c;reboot&#xff0c;su等等。這樣…

java 方法 示例_Java語言環境getISOCountries()方法與示例

java 方法 示例區域設置類getISOCountries()方法 (Locale Class getISOCountries() method) getISOCountries() method is available in java.util package. getISOCountries()方法在java.util包中可用。 getISOCountries() method is used to return an array of string that …

android shape.xml 屬性詳解

轉載源:http://blog.csdn.net/harvic880925/article/details/41850723 一、簡單使用 剛開始&#xff0c;就先不講一堆標簽的意義及用法&#xff0c;先簡單看看shape標簽怎么用。 1、新建shape文件 首先在res/drawable文件夾下&#xff0c;新建一個文件&#xff0c;命名為&#…

linux檢查防火墻是否阻擋端口,淺析linux查看防火墻狀態和對外開放的端口狀態...

1.查看防火墻狀態查看防火墻狀態 systemctl status firewalld開啟防火墻 systemctl start firewalld關閉防火墻 systemctl stop firewalld開啟防火墻 service firewalld start若遇到無法開啟先用&#xff1a;systemctl unmask firewalld.service然后&#xff1a;systemctl star…