智能合约 Solidity 常见关键字总结

最近在写智能合约,对常见的关键字简单总结一哈...

函数类型定义如下:

function (<parameter types>)   {public | private | internal | external}  [modifier]  [pure|constant|view|payable]    [returns (<return types>)]

1、public/private/internal/external 函数可见性分析

  • public : 任意访问(合约中函数默认);公共函数是合约接口的一部分,可以通过内部调用或通过消息调用。对公共状态变量而言,会有的自动访问限制符的函数生成。
  • private :仅当前合约内;私有函数和状态变量仅仅在定义该合约中可见, 在派生的合约中不可见,可防止其他合约访问和修改信息。
  • internal :仅当前合约及所继承的合约(状态变量声明时默认)
  • external : 仅外部访问(在内部也只能用外部访问方式访问);外部函数是合约接口的一部分,这意味着它们可以从其他合约调用, 也可以通过事务调用。外部函数f不能被内部调用(即 f()不执行,但this.f()执行)。外部函数,当他们接收大数组时,更有效。

public

当一个状态变量的权限为public类型时,它就会自动生成一个可供外部调用的get函数

只有public类型的函数才可以供外部访问

状态变量声明时,默认为internal类型,只有显示声明为public类型的状态变量才会自动生成一个和状态变量同名的get函数以供外部获取当前状态变量的值。

函数声明时默认为public类型,和显式声明为public类型的函数一样,都可供外部访问。

internal

internal类型的状态变量可供外部和子合约调用。

internal类型的函数和private类型的函数一样,智能合约自己内部调用,它和其他语言中的protected不完全一样。

子合约只能继承父合约中的所有的public类型的函数,可以对其进行重写,不能继承internal/private的函数

  • 内部(internal)函数只能在当前合约内被调用(在当前的代码块内,包括内部库函数,和继承的函数中),访问函数直接用函数名 f。
  • 外部(external)函数由地址和函数方法签名两部分组成,可作为外部函数调用的参数,或返回值,访问函数用 this.f 。

函数可以被定义为external, public, internal or private,缺省是 public。

对状态变量而言, external是不可能的,默认是 internal。

2、pure/constant/view/payable 函数的限制访问

constant、view、pure三个函数修饰词的作用是告诉编译器,函数不改变/不读取状态变量,这样函数执行就可以不消耗gas了,因为不需要矿工来验证。

在Solidity v4.17之前,只有constant,后续版本将constant拆成了view和pure。

2.1、PAYABLE

一个函数要进行货币操作必须要带上payable关键字。

2.2、VIEW

view的作用和constant一模一样,可以读取状态变量但是不能改

2.3、PURE

pure则更为严格,pure修饰的函数不能改也不能读状态变量,智能操作函数内部变量,否则编译通不过。

2.4、CONSTANT

常量

状态变量可以被定义为constant,常量。这样的话,它必须在编译期间通过一个表达式赋值。赋值的表达式不允许:1)访问storage;2)区块链数据,如now,this.balance,block.number;3)合约执行的中间数据,如msg.gas;4)向外部合约发起调用。

目前仅有值类型和字符串支持常量。

常函数

函数也可被声明为常量,这类函数将承诺自己不修改区块链上任何状态。

3、其他常见函数

3.1、回退函数fallback function

每一个合约有且仅有一个没有名字的函数。这个函数无参数,也无返回值。如果调用合约时,没有匹配上任何一个函数(或者没有传哪怕一点数据),就会调用默认的回退函数。

此外,当合约收到ether时(没有任何其它数据),这个函数也会被执行。在此时,一般仅有少量的gas剩余,用于执行这个函数(准确的说,还剩2300gas)。所以应该尽量保证回退函数使用少的gas。

function() {x=1;}

3.2、事件EVENT

在介绍事件前,我们先明确事件,日志这两个概念。事件发生后被记录到区块链上成为了日志。总的来说,事件强调功能,一种行为;日志强调存储,内容。

事件是以太坊EVM提供的一种日志基础设施。事件可以用来做操作记录,存储为日志。也可以用来实现一些交互功能,比如通知UI,返回函数调用结果等。

 event transfer(address indexed _from, address indexed _to, uint indexed value);

3.3、继承Inheritance

contract mortal is owned

3.4、抽象Abstract Contracts

抽象函数是没有函数体的的函数

function utterance() returns (bytes32);

3.5、Storage(指针传递)

3.6、Memory(值传递)

越看越懵...

猜你喜欢

转载自blog.csdn.net/Black_BearB/article/details/81000513
今日推荐