Solidity 基础
一、定义
Solidity 是一门面向合约的、为实现智能合约而创建的高级编程语言。这门语言受到了 C++,Python 和 Javascript 语言的影响,设计的目的是能在以太坊虚拟机(EVM)上运行。
Solidity 是静态类型语言,支持继承、库和复杂的用户定义类型等特性
Remix是 Solidity 在线开发环境,包括编译、部署、测试等等。
二、以太坊虚拟机
以太坊虚拟机 EVM 是智能合约的运行环境。它不仅是沙盒封装的,而且是完全隔离的,也就是说在 EVM 中运行代码是无法访问网络、文件系统和其他进程的。甚至智能合约之间的访问也是受限的。
每笔交易都收取一定数量的 gas ,目的是限制执行交易所需要的工作量和为交易支付手续费。EVM 执行交易时,gas 将按特定规则逐渐耗尽。
EVM 的指令集量应尽量少,以最大限度地避免可能导致共识问题的错误实现。所有的指令都是针对”256 位的字(word)”这个基本的数据类型来进行操作。具备常用的算术、位、逻辑和比较操作。也可以做到有条件和无条件跳转。
1、存储、内存、栈
- 每个账户有一块持久化内存区称为 存储(storage) 。 存储是将 256 位字映射到 256 位字的键值存储区
- 第二个内存区称为 内存(memory) ,合约会试图为每一次消息调用获取一块被重新擦拭干净的内存实例。 内存是线性的,可按字节级寻址,但读的长度被限制为 256 位,而写的长度可以是 8 位或 256 位
- EVM 不是基于寄存器的,而是基于栈的,因此所有的计算都在一个被称为 栈(stack) 的区域执行。 栈最大有 1024 个元素,每个元素长度是一个字(256 位)
三、源文件结构
源文件中可以包含 版本标识指令 、 导入源文件指令 和任意多个合约定义 。
1、版本标识
关键字 pragma 版本标识指令,版本标识 pragma 指令通常只对本文件有效,所以我们需要把版本标识添加到项目中所有的源文件。 如果使用了 import 导入其他的文件, 标识 pragma 并不会从被导入的文件加入到导入的文件中
pragma solidity ^0.4.0;
2、导入其他源文件
- 全局引入,这种形式已经不建议使用,因为它会无法预测地污染当前命名空间:
import "filename"; - 自定义命名空间引入,推荐使用:
import * as symbolName from "filename";
import "filename" as symbolName; - 分别定义引入,解决命名冲突
import {symbol1 as alias, symbol2} from “filename”
引入文件路径时要注意,非. 打头的路径会被认为是绝对路径
3、合约定义
关键字 contract 定义一个合约,一般格式如下:
contract TinyStorage {
}
4、注释
两种方式, 单行(//), 多行使用 (/…/)
四、合约结构
在 Solidity 语言中,合约类似于其他面向对象编程语言中的 类。每个合约中可以包含 状态变量 、 函数 、 函数 、 事件 、 结构体 、和 枚举类型 的声明,且合约可以从其他合约继承。还有一些特殊的合约,如:库 和接口
- 状态变量 :永久地存储在合约存储中的值
- 函数 :合约中代码的可执行单元,函数调用可发生在合约内部或外部
- 函数修饰器 :可以用来以声明的方式修改函数语义
- 事件 :能方便地调用以太坊虚拟机日志功能的接口
- 结构体 :将几个变量组合在一起形成的自定义类型
- 枚举 :特殊的自定义类型,类型的所有值可枚举的情况
五、完整源文件示例
pragma solidity ^0.5.10; //版本标识
import * as symbolName from “filename1”//源文件引用
import “./filename2”//源文件引用
contract exampleContract{ //合约定义
uint storedXlbData;//状态变量
function () { //匿名函数,一个合约最多一个
}
function Mybid() public payable { // 定义函数
}
modifier onlySeller() { // 修饰器
_;
}
function abort() public onlySeller { // 修饰器用法
}
event HighestBidIncreased(address bidder, uint amount); // 事件
function bid() public payable {
emit HighestBidIncreased(msg.sender, msg.value); // 触发事件
}
struct Voter { // 结构体
uint weight;
bool voted;
}
enum State { Created, Locked, InValid } // 枚举
}
library exampleLibrary { //库定义
}
interface exampleInterface { //接口定义
}