什么是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声明的前面,可以有多个修饰符。