Solidity语言简介

Solidity是一种用于编写智能合约的高级语言。Solidity程序需要运行在以太坊虚拟机(EVM)上。
语言特性
语法接近于JavaScript,是一种面向对象的编程语言。但却拥有多种其他语言没有的特性。
1. 由于以太坊底层是基于账户的,所以需要一个特殊的address类型。用于定位用户、定位智能合约、定位合约的代码(智能合约本身也需要一个账户)。
2. 由于Solidity语言本身是支持支付的,提供了一个特殊的关键字:payable。可以在语言层面直接支持支付。
3. 存储需要使用区块链,数据的每一个状态都是可以永久存储的,所以需要确定变量使用内存还是区块链。
4. 运行环境是在去中心化的网络上,所以会比较强调合约或函数执行的调用方法。因为原来一个简单的函数变为了一个网络上的节点中的代码执行。
5. 异常处理,一旦出现异常,所有的执行都会被回撤。主要是为了保证合约执行的原子性。以避免中间状态出现的数据不一致。
Demo
pragma solidity ^0.4.0;
contract Calc
{
    function add(uint a, uint b) returns(uint)
    {
        return a + b;
    }
}


函数类型
   可以将函数声明作为数据类型,类似C/C++中的函数指针。函数类型可以用于声明变量,也可以用于函数的参数和返回值。
数据存储位置(内存或区块链中)
memory   storage
数组、struct可以使用memory或storage
函数参数类型默认是memory的。直接在函数中声明的局部变量默认是storage


数组
数组可以是一维的,也可以是多维的。可以是固定长度,也可以是可变长度。
函数传入数组参数值时要使用中括号([…])
如[1,2,3,4]


结构体(struct)
struct用于自定义数据类型,成员可以是string、int、uint、address、结构体。
结构体可以用于函数的返回值,但是返回结构体的函数只能在合约内部调用。如果在函数中要返回结构体中的变量值,需要用返回多个值的函数。


映射(字典mapping)
通过key获取对应的value
key:可以是除了映射类型外的任何类型的值。
value:可以是任何类型的值,包括映射。


重置变量(delete)
delete:重置变量
uint、int:0
string:””
address
struct
{
int a;
string s;
}
delete不能重置mapping 类型的变量
mapping(uint=>string) public names;
delete names;


结构控制
Solidity不支持goto和switch。
if …else…   while    do while     for  break; continue;  return  ? :


view函数与pure函数
0.4.17以前,  用constant修饰函数,0.4.17以后,用view取代constant
view修饰的函数,只能读取storage变量的值,不能写入。
pure修饰的函数,不能对storage变量进行读写。


函数调用(使用new创建合约)
函数的调用方式:
1.普通的调用
2.命名参数调用
3.调用另外一个合约中的函数(使用new创建合约)


返回多值函数与多值解构
function fun() public returns(uint, bool, string)
{
     return (10,true,’abc’);
}


以太坊计量单位
ether = 以太币//比特币
wei
finney
szabo


时间计量单位
seconds、minutes、hours、days、weeks和years


异常处理
一旦发生异常,所有的操作都会回滚。
异常处理函数:
assert(bool condition)   // 0xfe  无效
用于检测内部错误
require(bool condition)  // 0xfd   reback
用于检测输入和外部组件
revert()
reback


合约成员的访问权限
external
用external声明的合约成员可以被其他的合约和交易调用。但不能直接调用(不能直接调用f()),应该使用this.f()。外部函数有时在接收大数组时会更有效率。
public
与external类似,可以在外部和内部调用。
internal
用internal声明的函数和变量只能在内部使用,但可以继承。
private
只能在内部调用,不能继承。


getter函数
Solidity为成员变量自动生成了getter函数。
在同一个合约中,访问合约的成员变量,可以通过内部的方式(data),也可以通过外部的方式(this.data())。
如果要访问另外一个合约中的成员变量,只能通过this.data()。


支持函数重载
继承
合约支持多继承,但同时只会创建一个合约。 编译器会将父合约的所有成员都复制到子合约中。
如果子合约函数与父合约函数相同,则不复制,相当于重写(override)父合约的相同函数。


抽象合约
抽象合约:合约中包含没有实现的函数。
如果一个合约从另一个抽象合约继承,但并没有实现所有的抽象函数,那么当前合约仍然是一个抽象合约。
抽象合约是不能部署到以太坊上的。


接口
限制
1.不能从其他的合约和接口继承
2.不能定义构造函数
3.不能定义变量
4.不能定义结构体和枚举



库与合约类似,但库的目的是在一个指定的地址,仅部署一次,然后通过EVM中复用代码。这就意味着库函数调用时,代码是在调用库函数的合约的上下文中执行。通过this可以获得调用合约。
库的限制:
1.不能定义状态变量
2.不能继承或被继承
3.不能接收以太(ether)

你可能感兴趣的:(区块链)