文章目录

      • 1.版本指令和contract关键字
        • 合约
        • 版本指令
        • 实战
      • 2.状态变量和整数
        • 状态变量
        • 无符号整数uint
        • 实战
      • 3.数学运算
        • 实战
      • 4.结构体
        • 实战
      • 5.定义函数
        • 实战

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。

  1. 在右边的输入框里输入 ^0.4.20,我们的合约基于这个版本的编译器。
  2. 建立一个空合约 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将由一个十二位数字组成。

  1. 定义 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位。

  1. 建立一个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”。

实战

在我们的程序中,我们终于要创造出蚂蚁啦,每个蚂蚁将拥有多个属性,所以这是一个展示结构体的完美例子。

  1. 建立一个struct 命名为 Ant。
  2. 我们的 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);

实战

在我们的应用里,我们要能创建蚂蚁,让我们写一个函数做这件事吧!

  1. 建立一个函数 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) {      }}