Solidity编程:智能合约实现之基础
Solidity之Hello world
Hello.sol
pragma solidity ^0.4.18
contract Hello{
function helloWorld() return(string){
return "hello World";
}
}
然后将程序复制到Remix中编译运行。
代码演示运行方式:
- VS Code IDE: 代码编写,基本的语法检测
VS code配置:
- Remix IDE: 简单代码编写运行环境
- Truffle环境: 生产环境,较为复杂的代码编译部署
Remix IDE简介:
- 基于浏览器的solidity编辑环境
- 可以在内存中模拟合约,直接运行,而不需要部署等复杂流程
- http://remix.ethereum.org直接使用
- https://github.com/ethereum/remix-ide也可以安装到本地
- Remix文档:http://remix.readthedocs.io/
Remix三种运行模式
- 默认模式:javascript vm
- 通过本地私有网络的rpc端口,链接到本地私有网络进行调试
- 使用Metamask插件提供的网络
Remix编译程序:
Remix运行程序:
Solidity源文件布局
Solidity源文件结构:
- 版本声明
- 一般形式:pragma solidity ^0.4.0
- 上述编译器需求:0.40≤version<0.50
- Pragma是pragmatic information的简称
- 遵循npm版本定义
npm版本语义:
- 导入其他源文件
- import “filename”: 此语句将从“filename”中导入所有的全局符号到当前全局作用域中
- import * as symbolName from “filename” : 创建一个新的全局符号symbolName,其成员均来自“filename”中全局符号
- import {symbol1 as alias, symbol2} from “filename”: 创建新的全局符号alias和symbol2,分别从“filename”引用symbol1和symbol2
- import " filename" as symbolName;
- 路径表示:1. 同Linux shell基本一致 2. 以/作为目录分割符,以.表示当前目录,以…表示父目录 3.可以映射到能通过诸如ipfs、http或者git发现的资源
- 注释
典型solidity文件实例:
metacoin合约例子
- 命令行:truffle unbox metacoin
- truffle的unbox包含多个例子
- metacoin是一个基础的货币系统例子,包含了智能合约的核心特性
metacoin安装示意图:
文件目录结构
智能合约结构
合约类似于类的概念,可包含:状态变量、函数、函数修饰器、事件、结构类型和枚举类型
状态变量: 是永久性存储在合约存储中的值。
函数:合约中代码的可执行单元
函数修饰器:可以用来以声明的方式改良函数语义。
事件:以太坊虚拟机日志接口
结构类型:与C语言等的struct基本一致
枚举:创建有一定数量的值的自定义类型,与C++等语言中的定义相同。
示例代码:
- 迷恋猫的合约代码:https://github.com/axiomzen/cryptokitties-bounty
Solidity编程规范
- Solidity编程规范主要参照了python的pep8
- 主要提供编码风格的一致性
- 并非强制的一致性要求
代码缩进:
- 使用4个空格缩进
- 使用tab或者空格键完成缩进
- 避免混合使用tab和空格键
空行:
- 一个合约的前面,留两个空行
- 合约之间,保留两个空行
- 函数之间,保留一个空行
- 如果只声明函数,没有实现,可以不保留。
源文件编码方式:
- UTF-8或者ASCII编码
- Vs code默认为utf-8
引入声明:
- 一般在代码开始引入声明
空格的使用规范:
- 括号、中括号、花括号之后避免使用空格
- 逗号和分号之前避免使用空格
- 赋值符前后避免多个空格
控制结构:
- 花括号和声明同一行
- 右括号和左括号声明保持相同缩进位置
- 左括号后应回车
- 以上建议也同样适用于if、else、while、for等
- if、while、for条件语句之间必须空行
- 如果只有单条语句可以不需要使用括号
- 对于if语句如果包含else或者else if语句,则else语句要与if的右花括号放在一行
函数声明:
- 对于简短函数声明,将函数体的左括号和函数名放在同一行
- 右括号和函数声明保持相同的缩进
- 左括号和函数名之间要增加一个空格
- 对于参数较多的函数声明可将所有参数逐行显示,并保持相同的缩进
- 函数声明的右括号单独一行
- 左花括号单独一行
变量声明:
- 对于数组变量声明,类型和数组中括号之间不能有空格
- 赋值运算符两边要有一个空格。
命名规范:
- 合约和库:CapWords规范命名(首字母大写)。如:SimpleToken、Player
- 事件:CapWords规范命名(首字母大写)。如AfterTransfer、Deposit
- 结构体:CapWords规范命名(首字母大写)
- 函数名使用大小写混合(构造函数除外)。如getBalance, transfer。
- 局部变量命名,大小写混合。如initialSupply,account。
- 常量全部使用大写字母并用下划线分隔,如MAX_BLOCKS
- 功能修饰符,大小写混合。如onlyAfter
- 当和内置或者保留名称冲突时建议使用本规范
代码注释:
- 单行(//)
- 多行使用(/…/)
- 文档注释写文档用。三个斜杠///或者/**…*/,可以使用Doxygen语法,以支持生成对文档的说明,参数验证的注解,或者是在用户调用这个函数时,弹出确认内容。
Doxygen的注释风格: