最近有点背...
  • About Me

  • 兴趣爱好



  • 上一张

Solidity函数修改器的基本概念及应用

基本概念

函数修改器可以一定程度上改变函数的行为。可以作为函数执行的先行条件,如果符合函数修改器定义的条件,才可以执行函数体内容。关于函数修改器,可以把理解成if的变相。

函数修改器定义

函数修改器的定义语法如下:

1
2
3
4
5
6
7
8
modifier 修改器名 {
条件体..
_;
}

function a() 修改器名 {
函数体..
}

当要执行a()时,会先去执行修改器,判断条件体,如果符合条件,才会继续执行a();如果不符合条件,a()将不执行。”_;”在这里表示的是a().
通过一个小栗子,直观的感受下:

Solidity的结构体与映射

结构体(Structs)

Solidity提供结构体来自定义类型,自定义的类型是引用类型。
结构体内可以包含整型、字符串、数组、结构体、映射等数据类型。
如果你尝试对memory的映射类型赋值,会报错
Error: Member "map" is not available in struct StructMappingInitial.A memory outside of storage.
另外,结构体的可见性,目前只支持internal.只能在当前合约或者子合约中使用,而且引用结构体为参数的函数必须显性的声明为internal。
我们通过实例来理解它。

Solidity数组详解

创建一个数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
pragma solidity ^0.4.0;

contract Test {
uint[5] arr = [0,1,2,3,4];//创建一个定长的数组
uint[] storageArr;

function a() public {

uint[5] memory arr1 = [uint(0),1,2,3,4];//uint8显示的转换为uint256,否则会报类型错误。
uint[] memory memoryArr;
//storageArr[0] = 12;
//memoryArr[0] = 13; //执行会报VM error: invalid opcode.,原因是数组还没有执行初始化。

storageArr = new uint[](5);
memoryArr = new uint[](5);

storageArr[0] = 12;
memoryArr[0] = 13;
}
}

诗和远方还是柴米油盐?


我希望每个人都有足够的运气与足够的勇气,去见到命运里不同的风。

2018年3月4日 星期日 晴

文/深海逐豚

Solidity的函数类型以及可见性分析(类比Java)

函数类型

函数也是一种类型(值类型),它是函数的调用方式。函数类型可以被赋值吗,作为参数和返回结果。函数可以分为两类:内部函数(Internal)和外部函数(External)。

  • 内部函数Internal(默认)
    只能在当前合约内被调用(在当前的代码块内,包括内部库函数,和继承的函数中)。
  • 外部函数External
    由地址和函数方法签名两部分组成,可作为外部函数调用的参数,或返回值。
    1
    function (<parameter types>) {internal|external} [pure|constant|view|payable] [returns (<return types>)]