最近有点背...

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;
}
}

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

函数类型

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

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

用Java搭建一条区块链

前言

为了更好的理解区块链的底层实现原理,决定自己动手模拟实现一条区块链。

思路分析

通过之前的学习,从文本知识的角度,我们知道,创世区块、记账原理、挖矿原理、工作量证明、共识机制等等区块链的相关知识。

创建一条区块链,首先默认构造创世区块。在此基础上,我们可以发布交易,并进行挖矿,计算出工作量证明,将交易记录到区块中,每成功的挖一次矿,块高就+1。当然在此过程中,可能会出现“造假”的问题。也就是说,每一个新注册的节点,都可以有自己的链。这些链长短不一,为了保证账本的一致性,需要通过一种一致性共识算法来找到最长的链,作为样本,同步数据,保证每个节点上的账本信息都是一致的。

数据结构