一、Solidity是什么?
Solidity 是一门面向合约的、为实现智能合约而创建的高级编程语言。这门语言受到了 C++,Python 和 Javascript 语言的影响,设计的目的是能在 以太坊虚拟机(EVM) 上运行。
Solidity 是静态类型语言,支持继承、库和复杂的用户定义类型等特性。
二、Solidity学习所需注意的知识点
1、Solidity和其他语言最大不同之处在于,在编写任何一个代码之前,需要在文件顶部标明Solidity使用版本。
所有的 Solidity 源码都必须冠以 “version pragma” — 标明 Solidity 编译器的版本. 以避免将来新的编译器可能破坏你的代码。
代码格式为:(1)pragma solidity ^0.X.Y;或(2)pragma solidity >=A <B
(1)其中Y可以为0,^表示不低于 ^0.X.Y的版本均可,但不能用0.(X+1)开头的任何版本;
(2)表示版本号大于等于A,小于B的任何版本均可
(建议用第一种,第二种有时会报错,因为我还没完全学会Solidity,所以目前还不知道为什么。)
2、类似大多数编程语言需要建立类class,Solidity也需要建立类似的东西。因为Solidity是智能合约语言,所以Solidity中,用合约contract作为标志。
3、大多数合约contract是部署在区块链主链上,但要执行合约需要花比特币,所以合约contract可以部署在侧链上,这样就不用花比特币了。
4、Solidity和大多数编程语言不同,使用uint类型。uint 无符号数据类型, 指其值不能是负数,对于有符号的整数存在名为 int 的数据类型。(注: Solidity中, uint 实际上是 uint256代名词, 一个256位的无符号整数。你也可以定义位数少的uints — uint8, uint16, uint32, 等…… 但一般来讲,使用简单的 uint, 除非在某些特殊情况下,比如为了节省空间所做出的优化。)
5、在 Solidity 中,数学运算很直观明了,与其它程序设计语言相同:
加法: x + y;减法: x - y;乘法: x * y;除法: x / y;取模 / 求余: x % y 。
Solidity 还支持 乘方操作 (如:x 的 y次方:x ** y)。
6、如果你想建立一个集合,可以用 数组这样的数据类型. Solidity 支持两种数组: 静态数组和动态数组:
// 固定长度为2的静态数组:
uint[2] fixedArray;
// 固定长度为5的string类型的静态数组:
string[5] stringArray;
// 动态数组,长度不固定,可以动态添加元素:
uint[] dynamicArray;
你也可以建立一个 结构体类型的数组
// 这是动态数组,我们可以不断添加元素
Zombie[] zombies;
(注意:建立静态数组的时候uint8,uint16等不能混用,uint8变为uint16会出错。在建立动态数组时,若用uints[] 建立,则会出现以可以容纳最大数据的最短的uints的类型规定uints,例如uints[] = [1, 2, 3] 不能添加256,因为1、2、3可以用uint8(最小)类型容纳,而256需要uint16才能容纳,两者不能相互转化,会报错。所以在建立动态数组的时候尽量采用uint[] ,以便后续添加数据不会出错。)
7、定义 public 数组, Solidity 会自动创建 getter 方法.
格式为: Zombie[] public zombies;(在结构体和数组名称之间加入public)。
8、数组可以用array.push(x)方法,将x加入数组中,且x位于数组的末尾。
9、Solidity定义函数用function,函数也分为public和private。
例如:function _createZombie(string _name, uint _dna) private{}
function _createZombie(string _name, uint _dna) public{}。
10、Solidity字符串类型也是用string标识。
11、习惯上函数里的变量都是以“ _ ”开头以区别全局变量。这是一个很好的编程习惯,在很多正规教程中也是这样编写的,习惯后可以更好理解教程中各变量的意义。
12、Solidity可以用类似Java的方法创建结构体。
13、要想函数返回一个数值,按如下定义:
function _createZombie(string _name, uint _dna) public returns (string) {}
Solidity 里,函数的定义里可包含返回值的数据类型(如本例中 string)。
14、没有改变任何值或者写任何东西,这种情况下我们可以把函数定义为 view, 意味着它只能读取数据不能更改数据:
例如:function sayHello() public view returns (string) {}