当前位置: 首页 > 编程日记 > 正文

Solidity基础入门知识(十)函数的访问权限和可见性

链客,专为开发者而生,有问必答!

此文章来自链客区块链技术问答社区,未经允许拒绝转载。

在这里插入图片描述

下面来继续介绍作为一个分布式网络语言所特有的internal和external这两种不同的函数调用方式,以及Solidity提供的对函数调用时的可见性控制语法。

一、调用方式

Solidity封装了两种函数的调用方式internal和external。

internal

internal调用,实现时转为简单的EVM跳转,所以它能直接使用上下文环境中的数据,对于引用传递时将会变得非常高效(不用拷贝数据)。

在当前的代码单元内,如对合约内函数,引入的库函数,以及父类合约中的函数直接使用即是以internal方式的调用。我们来看个简单的例子:

pragma solidity ^0.4.0;

contract Test {

function f(){}//以`internal`的方式调用function callInternally(){f();}

}

在上述代码中,callInternally()以internal的方式对f()函数进行了调用。

external

external调用,实现为合约的外部消息调用。所以在合约初始化时不能external的方式调用自身函数,因为合约还未初始化完成。下面来看一个以external方式调用的例子:

pragma solidity ^0.4.0;

contract A{

function f(){}

}

contract B{

//以`external`的方式调用另一合约中的函数function callExternal(A a){a.f();}

}

虽然当前合约A和B的代码放在一起,但部署到网络上后,它们是两个完全独立的合约,它们之间的方法调用是通过消息调用。上述代码中,在合约B中的callExternal()以external的方式调用了合约A的f()。

external调用时,实际是向目标合约发送一个消息调用。消息中的函数定义部分是一个24字节大小的消息体,20字节为地址,4字节为函数签名。

this

我们可以在合约的调用函数前加this.来强制以external方式的调用。需要注意的是这里的this的用法与大多数语言的都不一致。

pragma solidity ^0.4.0;

contract A{

function f() internal{}function callInternally(){f();}//以`external`的方式调用//f()只能以`internal`的方式调用//Untitled3:7:9: Error: Member "f" not found or not visible after argument-dependent lookup in contract Afunction callExternally(){//this.f();}

}

调用方式说明

上面所提到的internal和external指的函数调用方式,请不要与后面的函数可见性声明的external,public,internal,private弄混。声明只是意味着这个函数需要使用相对应的调用方式去调用。后续说明中会用以某某方式调用,来强调是对调用方式的阐述以加以区分。

二、函数的可见性

Solidity为函数提供了四种可见性,external,public,internal,private。

external

声明为external的可以从其它合约或通过Transaction进行调用,所以声明为external的函数是合约对外接口的一部分。

不能以internal的方式进行调用。

有时在接收大的数据数组时性能更好。

pragma solidity ^0.4.5;

contract FuntionTest{

function externalFunc() external{}function callFunc(){//以`internal`的方式调用函数报错//Error: Undeclared identifier.//externalFunc();//以`external`的方式调用函数this.externalFunc();}

}

声明为external的externalFunc()只能以external的方式进行调用,以internal的方式调用会报Error: Undeclared identifier.。

public

函数默认声明为public。

public的函数既允许以internal的方式调用,也允许以external的方式调用。

public的函数由于被外部合约访问,是合约对外接口的一部分。

pragma solidity ^0.4.5;

contract FuntionTest{

//默认是public函数function publicFunc(){}function callFunc(){//以`internal`的方式调用函数publicFunc();//以`external`的方式调用函数this.publicFunc();}

}

我们可以看到声明为public的publicFunc()允许两种调用方式。

internal

在当前的合约或继承的合约中,只允许以internal的方式调用。

pragma solidity ^0.4.5;

contract A{

//默认是public函数function internalFunc() internal{}function callFunc(){//以`internal`的方式调用函数internalFunc();}

}

contract B is A{

//子合约中调用function callFunc(){internalFunc();}

}

上述例子中声明为internal的internalFunc()在定义合约,和子合约中均只能以internal的方式可以进行调用。

private

只能在当前合约中被访问(不可在被继承的合约中访问)。

即使声明为private,仍能被所有人查看到里面的数据。访问权限只是阻止了其它合约访问函数或修改数据。

pragma solidity ^0.4.5;

contract A{

//默认是public函数function privateFunc() private{}function callFunc(){//以`internal`的方式调用函数privateFunc();}

}

contract B is A{

//不可调用`private`function callFunc(){//privateFunc();}

}

上述例子中,声明为private的privateFunc()只能在定义的合约中以internal的方式进行调用。

相关文章:

Sass (Syntactically Awesome StyleSheets)

Sass (Syntactically Awesome StyleSheets) Sass 是对 CSS 的扩展,让 CSS 语言更强大、优雅。 它允许你使用变量、嵌套规则、 mixins、导入等众多功能, 并且完全兼容 CSS 语法。 Sass 有助于保持大型样式表结构良好, 同时也让你能够快速开始小…

键盘的相关设置

一、键盘风格 UIKit框架支持8种风格键盘。 typedef enum { UIKeyboardTypeDefault, // 默认键盘:支持所有字符 UIKeyboardTypeASCIICapable, // 支持ASCII的默认键盘 UIKeyboardTypeNumbersAndPunctuation, // 标准电…

python全栈开发基础【第十七篇】面向对象反射和内置方法

一、静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直…

区块链笔记分享

链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 区块链笔记分享:技术和数学基础: 高位的hash的逆向过程除了穷举,没有更有效的办法,这个过程在目前的计算能力下必然…

BZOJ4766: 文艺计算姬

Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 737 Solved: 402[Submit][Status][Discuss]Description "奋战三星期,造台计算机"。小W响应号召,花了三星期造了台文艺计算姬。文艺计算姬比普通计算机有更多的艺术细胞。普通计算机能计算一个…

Android调用远程Service的参数和返回值都需要实现Parcelable接口

import android.os.Parcel;import android.os.Parcelable; public class Person implements Parcelable{   private Integer id;   private String name;   private String pass;   public Person() {     super();   } public Person(Integer id, String name, …

git的简单命令

git init 初始化管理库 git add file_name 将文件添加到文件管理库 git commit -m “xxx” 将文件提交到文件管理库(xxx:说明文字) git status 查看当前状态 git diff 查看文件改动的地方 git log 查看历史版本提交记录(如果觉…

区块链概念:Hash 算法

链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 区块链概念1:Hash 算法 作用在学习哈希算法前,我们需要知道哈希在区块链的作用哈希算法的作用如下:区块…

java 文件操作

文件操作——File File表示目录信息 listFiles方法 File的listFiles方法用于返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。其方法定义: File[] listFiles()返回值:抽象路径名数组,这些路径名表示此抽象路径名表示的…

三维等值面提取算法(Dual Contouring)

上一篇介绍了Marching Cubes算法,Marching Cubes算法是三维重建算法中的经典算法,算法主要思想是检测与等值面相交的体素单元并计算交点的坐标,然后对不同的相交情况利用查找表在体素单元内构建相应的网格拓扑关系。Marching Cubes算法简单&a…

设置status bar的颜色

statusBar显示电池电量、时间、网络部分标示的颜色只能设置两种颜色: 默认的黑色(UIStatusBarStyleDefault)白色(UIStatusBarStyleLightContent) 配置info.plist文件 1.View controller-based status bar appearance…

EOS与以太坊有哪些区别?

链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 以太坊是一个专门为开发和运行去中心化应用(DAPP)搭建的智能合约平台;EOS与以太坊类似,同样…

Quartz 2D基本图形的绘制

基本步骤: 1.获取绘图上下文 2.创建并设置路径 3.将路径添加到上下文 4.设置上下文状态 5.绘制路径 6.释放路径 #import "YGView.h" //屏幕尺寸#define kScreenSize [UIScreen mainScreen].bounds.size//屏幕宽高定义#define kscreenWidth [[UIScr…

命令行程序增加 GUI 外壳

Conmajia © 2012 Updated on Feb. 21, 2018 命令行大家都用过: 图 1 命令行程序工作界面 现在想办法为它做一个 GUI 外壳,实际效果参考图 2. 图 2 带 GUI 外壳的命令行程序 程序思路是这样的: 通过运行 cmd.exe 来操作命令行&#xff0c…

人月神话阅读笔记07

第1章 焦油坑焦油坑的意思说明了即使你足够强大,也无法摆脱束搏而沉到坑底。IT项目也是这样,不论是开发大型软件系统还是小型项目,都会遇到诸多复杂的问题和影响因素,项目本身就是一个足够复杂的动态系统,没有最优&…

区块链隐私:交易还是计算?

链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 区块链隐私:交易还是计算? 隐私”是什么意思?在区块链生态系统中,“隐私”这个词被用于许多不同的语…

8 ServletContext

1 为什么需要ServletContext 技术 显示网站多少人在线,显示当前登录者是第几位登录者等信息。 2 什么是ServletContext 可以把它想象成一个服务器上的公共空间,每个用户都可以访问到它。 Web 容器在启动时,它会为每个Web 应用程序都创建一个对…

IOS沙盒Files目录说明和常用操作

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 读取Documents目录代码 NSArray *pathsDocumentsNSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString *pathDocu…

iOS一些实用的技巧

获取触摸的点- (CGPoint)locationInView:(UIView *)view; - (CGPoint)previousLocationInView:(UIView *)view;自动适应父视图大小self.view.autoresizesSubviews YES;self.view.autoresizingMask UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;把pli…

在公共区块链中通过加密保护数据

链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 隐私限制 在处理或交换业务文件时,贸易伙伴可能需要某些隐私因素。 (1)交易数据的隐私性: 交易数据仅供交易双方阅读。 (2)交…

python xml模块学习

xml打开方式 # xml有两种打开方式 # 1. 打开文件,读取XML内容 str_xml open(xman.xml, r).read() print(str_xml)# 将字符串解析成xml特殊对象,root代指xml文件的根节点 root ET.XML(str_xml) # 读取字符串,将字符串转为Element对象 pri…

实例 - 购物车 (列表、循环)

salary int(input(Please input your money:))product [(iphone6s,5800),(mac bood,9000),(coffee,32),(python book,80),(bicyle,1500), ]shopping []while True:#打印商品内容n 1for i,v in product:print(n,.,i,v)n 1#引导用户选择商品choice input(选择购买商品编号:…

右滑手势导航返回的相关设置

iOS7之后提供了右滑返回上一级界面的手势,但是自定义返回按钮会失效,解决办法如下: -(void)viewWillAppear:(BOOL)animated{ [superviewWillAppear:animated]; if([self.navigationController respondsToSelector:selector(interacti…

区块链编程完全指南:平台、语言与结论

链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 区块链,代表着未来的发展方向。是的,在文章开头,我们首先给出这样的结论。当然,认定未来将围…

基于QProbe创建基本Android图像处理框架

先来看一个GIF 这个GIF中有以下几个值得注意的地方这个界面是基本的主要界面所应该在的地方。其右下角有一个“”号,点击后,打开图像采集界面在这个界面最上面的地方,显示的是当前图像处理的状态。(一般来说,是成功/不…

iOS三种拨打电话的方法

1,这种方法,拨打完电话回不到原来的应用,会停留在通讯录里,而且是直接拨打,不弹出提示NSMutableString* str[[ NSMutableStringalloc ] initWithFormat : "tel:%" , "xxxxxxxxxxx" ];[[UIApplica…

查询今天是周几?

<?php $wdate(w); $weekarray( "0">"星期日", "1">"星期一", "2">"星期二", "3">"星期三", "4">"星期四", "5">"星期五",…

区块链学习之-发布合约

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 命令行编译&#xff0c;发布合约1. 编译合约&#xff0c;编译不了curl --data ‘{“jsonrpc”:“2.0”,“method”: “eth_compileSolidi…

Codeforces 900D Unusual Sequences:记忆化搜索

题目链接&#xff1a;http://codeforces.com/problemset/problem/900/D 题意&#xff1a; 给定x,y&#xff0c;问你有多少个数列a满足gcd(a[i]) x 且 ∑(a[i]) y。 题解&#xff1a; 由于gcd(a[i]) x&#xff0c;所以y一定是x的倍数&#xff0c;否则无解。 那么原题就等价于…

对AFNetworking的简单封装

#import "YGLoadDataManager.h"#import "AFNetworking.h"implementation YGLoadDataManager#pragma mark -- GET请求 -- (void)getWithURLString:(NSString *)URLStringparameters:(id)parameterssuccess:(void (^)(id))successfailure:(void (^)(NSError …