1.版本指令和contract关键字
下面将学习什么是合约,并尝试如何创建合约。
合约
智能合约(Smart Contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约实质上是一套以数字形式定义的承诺(Promises),包括合约参与方可以在上面执行这些承诺的协议。
Solidity的代码都包裹在合约里面,所有变量和函数都属于一个合约。contract 关键字用于声明一个合约。
这是一个名为 HelloWorld 的空合约:
contract HelloWorld {
}
版本指令
所有的Solidity源码都必须指明版本,用于标明Solidity编译器的版本,这样是为了避免将来新的编译器可能破坏你的代码。pragma 指令用于声明Solidity的版本。
例如: pragma solidity ^0.4.20;
下面就是一个最基本的合约例子:
pragma solidity ^0.4.20;
contract HelloWorld {
}
注:Solidity指定版本号的表达式遵循“NPM版本语义”,多数情况下,我们使用 ^ 就可以了。
实战
为了创建我们的小蚂蚁, 让我们先建立一个基础合约,称为 AntFamily。
- 在右边的输入框里输入 ^0.4.20,我们的合约基于这个版本的编译器。
- 建立一个空合约 AntFamily。
pragma solidity ^0.4.20;
contract AntFamily {
}
2.状态变量和整数
在上一个章节,我们已经为我们的合约做了一个外壳,下面将学习Solidity中如何使用变量。
状态变量
状态变量定义在合约内部的,但是不在函数内部的变量,它会永久地保存在合约存储空间中,也就是说它们会被写入区块链中,这就好比数据写入一个数据库中。 下面是一个状态变量的例子:
contract HelloWorld {
// 这个无符号整数将会永久的被保存在区块链中
uint myUnsignedInteger = 10;
}
在上面的例子中,定义 myUnsignedInteger 为 uint 类型,并赋值10。
无符号整数uint
uint是Solidity支持的基本数据类型之一,意思是无符号整型(unsigned integer),指其值不能是负数,对于有符号的整数存在名为 int 的数据类型。
实战
我们的蚂蚁DNA将由一个十二位数字组成。
- 定义 dnaDigits 为 uint 数据类型, 并赋值 12。
pragma solidity ^0.4.20;
contract AntFamily {
uint dnaDigits = 12;
}
3.数学运算
在 Solidity中,数学运算与其它程序设计语言相同:
- 加法: x + y
- 减法: x - y
- 乘法: x * y
- 除法: x / y
- 取模: x % y
- 幂运算:x ** y
下面是一个幂运算的例子:
// 表示6的2次方
uint a = 6 ** 2;
实战
每只小蚂蚁都有属于他自己的DNA基因,为了保证我们蚂蚁的DNA只含有12个字符,我们先造一个uint数据,让它等于10^12。这样一来以后我们可以用模运算符 % 把一个整数变成12位。
- 建立一个uint类型的变量,名字叫dnaModulus, 令其等于 10 的 dnaDigits 次方.
pragma solidity ^0.4.20;
contract AntFamily {
uint dnaDigits = 12;
uint dnaModulus = 10 ** dnaDigits;
}
4.结构体
有时你需要更复杂的数据类型,Solidity支持通过结构体来定义新的类型,使用 struct 关键字来定义结构体:
struct Book {
string name;
uint page;
}
结构体允许你生成一个更复杂的数据类型,它可以有多个属性。
注:我们刚刚引入了一个新的基本数据类型 string 。 字符串类型用于保存任意长度的UTF-8编码数据。 如: string message = “Hello world”。
实战
在我们的程序中,我们终于要创造出蚂蚁啦,每个蚂蚁将拥有多个属性,所以这是一个展示结构体的完美例子。
- 建立一个struct 命名为 Ant。
- 我们的 Ant 结构体有两个属性: name (类型为 string), 和 dna (类型为 uint)。
pragma solidity ^0.4.20;
contract AntFamily {
uint dnaDigits = 12;
uint dnaModulus = 10 ** dnaDigits;
struct Ant {
string name;
uint dna;
}
}
5.定义函数
在 Solidity中使用 function 关键字定义一个函数,函数是合约代码的可执行单元,函数定义的基本语法如下:
function buyBook(string _name, uint _count) {
}
这是一个名为 buyBook 的函数,它有两个参数:一个是string类型,另一个是uint类型。现在函数内部还是空的。
注:习惯上函数里的变量都是以(_)开头 (但不是硬性规定) 以区别全局变量。我们整个教程都会沿用这个习惯。
我们的函数定义如下:
buyBook(“fishBook”, 100);
实战
在我们的应用里,我们要能创建蚂蚁,让我们写一个函数做这件事吧!
- 建立一个函数 createAnt。 它有两个参数: _name (类型为string), 和 _dna (类型为uint)。
pragma solidity ^0.4.20;
contract AntFamily {
uint dnaDigits = 12;
uint dnaModulus = 10 ** dnaDigits;
struct Ant {
string name;
uint dna;
}
function createAnt(string _name, uint _dna) {
}
}