Solidity教程

441 阅读4分钟

什么是Solidity?

以太坊Solidity是一种面向智能合约的高级语言,其语法与JavaScript类似。solidity是用于生成在EVM上执行的机器级代码的工具。solidity编译器获取高级代码并将其分解为更简单的指令。

以太坊合约中的solidity

合约是以太坊去中心化应用程序的基本构建模块。所有变量和函数都是合约的一部分,这是所有项目的起点。一个名为MyFirst的空合约看起来像这样:

pragma solidity ^0.4.24;
contract MyFirst{

}

solidity合约必须得有头部版本号声明,每行结尾用;结尾

Solidity文件的布局

源文件可以包含任意数量的合约定义,包括指令和pragma指令。

Version Pragma

Version Pragma是定义代码使用的Solidity编译器版本的声明。

pragma solidity ^0.4.24;

导入其他源文件

Ethereum Solidity支持与JavaScript中可用的导入语句非常相似的导入语句,尽管Solidity不知道default export的概念。

在全局级别,可以使用以下形式的import语句:

import "filename";

上述语句将所有全局符号从filename导入当前全局范围。

import * as symbolName from "filename";

注释

就像任何其他语言一样,Solidity可以使用单行和多行注释。

// This is a single-line comment. 

/* This is 
a multi-line 
comment */

现在,在我们进一步深入了解Solidity教程之前,应该知道以太坊有三个可以存储项目的区域。

  • 存储Storage:所有合约状态变量所在的位置。每个合约都有自己的存储,并且在函数调用之间是持久的。
  • 内存Memory:保存临时值并在(外部)函数调用之间擦除,并且使用起来更便宜。
  • 堆栈Stack:保存小的局部变量并且几乎可以免费使用,但只能保存有限数量的值。

对于几乎所有类型,都无法指定它们应存储的位置,因为它们在每次使用时都会被复制。

变量

变量类型,变量类型分为状态变量与局部变量

pragma solidity 0.4.24;

contract Test {
    //状态变量,默认是私有的
    string public name = "hello";
    
    function testFun() {
        //局部变量,不能使用public修饰
        int num = 10; 
    }
}

数据类型

1、bool布尔类型

关键词:bool,值是常数,即true或false。

pragma solidity 0.4.24;

constact  Test {
   bool a = true;
   bool public b = false;//使用public修饰暴露出去调用
}

2、整型,int/uint (uint8到uint256,步长为8(无符号,最多为256位),int8默认为int256)表示有符号和无符号的不同位数整数。

pragma solidity 0.4.24;

constact  Test {
   int8 a = 10;
   uint16 b = 15;
   
   function add() returns(int8) {
      return a + (int8)b;//强制转换
   }
}

3、字符串,String:字符串文字用双引号或单引号如“foo”或’bar’编写。

pragma solidity 0.4.24;

constact  Test {
   strting a = "hello world";
}

4、定长字节数组(Fixed-size byte array),关键字有bytes1,bytes2,bytes3...bytes32。

  • byte 表示bytes1,bytes1存储1个字节即8位,bytes2存储2个字节步长递增。
  • length,表示字节数组的长度,只读。返回的是bytes类型的长度,不是值得长度。
  • 长度不能修改
  • 可以通过下标获取
  • 元素值只读不能修改
pragma solidity 0.4.24;

constact  Test {
   bytes1 public a = "h";
   bytes2 public b = "hh";
   bytes6 public c = "hhhhhh";
   
   function get_len() returns(int256) {
      return c.length;
   }
}

5、有理数和整数常量 表达式中直接出现的数字常量(整数,小数,科学计数(2e20:20*10^20)等)

6、枚举(Enums)

  • 自定义类型
  • 至少要有一个元素,默认位uint8。
  • Enum Gender { Male,Female }
  • 不要忘了花括号
Enum Gender { Male,Female }
Gender default = Gender.made

7、函数类型

函数定义

function 函数名称(可选参数) 修饰符 返回值() {
   函数体
}

例:
function add() returns(int8) {
      return a + (int8);
}

//返回多个值
function add(int8,string) returns(int8,string) {
      return (a,b);//多个返回值使用元组
}

构造函数

pragma solidity 0.4.24;

constact  Test {
   //进去合约就执行,一般设置初始化后不变的数据
   constractor() {
      
   }
   
   function test() returns(int256) {
      return c;
   }
}

修饰符

  • public 公有,拥有以太坊账户都能调用,可以修饰状态变量。

  • private 私有,只有合约内部可以调用,可以修饰状态变量。

  • view/constant 函数会读取但是不会修改任何合约的状态变量。

  • prue 函数不使用任何合约的状态变量。

  • payable 调用函数需要付钱,钱付给了智能合约账户。

  • returns 返回值函数声明中使用

  • external 仅合约外部可以调用,合约内部使用this调用

  • internal 仅合约内部和继承的合约可以调用

    修饰符在returns声明的前面,可以有多个修饰符。