Solidity 入门教学
1、 简介
1.1 Solidity是什么
Solidity 是一门面向合约的、为实现智能合约而创建的高级编程语言。这门语言受到了 C++,Python 和 Javascript 语言的影响,设计的目的是能在以太坊虚拟机(EVM)上运行。
Solidity 是静态类型语言,支持继承、库和复杂的用户定义类型等特性。
内含的类型除了常见编程语言中的标准类型,还包括 address等以太坊独有的类型,Solidity 源码文件通常以 .sol 作为扩展名
目前尝试 Solidity 编程的推荐方式是使用 Remix。Remix是一个基于 Web 浏览器的 IDE,它可以让你编写 Solidity 智能合约,然后部署并运行该智能合约。
1.2 Solidity语言特性
Solidity的语法接近于JavaScript,是一种面向对象的语言。但作为一种真正意义上运行在网络上的去中心合约,它又有很多的不同:
以太坊底层基于帐户,而不是 UTXO,所以增加了一个特殊的address 的数据类型用于定位用户和合约账户。
语言内嵌框架支持支付。提供了 payable 等关键字,可以在语言层面直接支持支付。
使用区块链进行数据存储。数据的每一个状态都可以永久存储,所以在使用时需要确定变量使用内存,还是区块链存储。
运行环境是在去中心化的网络上,所以需要强调合约或函数执行的调用的方式。
不同的异常机制。一旦出现异常,所有的执行都将会被回撤,这主要是为了保证合约执行的原子性,以避免中间状态出现的数据不一致。
1.3 Solidity源码和智能合约
Solidity 源代码要成为可以运行在以太坊上的智能合约需要经历如下的
步骤:
用 Solidity 编写的智能合约源代码需要先使用编译器编译为字节码(Bytecode),编译过程中会同时产生智能合约的二进制接口规范(Application Binary Interface,简称为ABI);
通过交易(Transaction)的方式将字节码部署到以太坊网络,每次成功部署都会产生一个新的智能合约账户;
使用 Javascript 编写的 DApp 通常通过 web3.js + ABI去调用智能合约中的函数来实现数据的读取和修改。
1.4 合约结构
**状态变量(State Variables)**作为合约状态的一部分,值会永久保存在存储空间内。
**函数(Functions)**合约中可执行的代码块。
**函数修饰器(Function Modifiers)**在函数声明中,用来补充修饰函数的语义。
**事件(Events)**非常方便的 EVM 日志工具接口。
2、 Solidity编译器安装以及简单使用
Remix 是一个开源的 IDE,是一个浏览器在线编辑器。作为 Solidity 智能合约开发环境,Solidity IDE Remix(在线浏览器编辑器)提供基本的编译、部署至本地或测试网络、执行合约等功能。
这部分在提前测试阶段做过了,所以这次由于时间比较紧张,就没有再做一次。
3、Solidity基础操作
3.1 Solidity源文件布局
源文件可以被版本杂注pragma所注解,表明要求的编译器版本
pragma solidity ^0.4.0;
这样,源文件将既不允许低于 0.4.0 版本的编译器编译, 也不允许高于(包含) 0.5.0 版本的编译器编译(第二个条件因使用 ^ 被添加)。 这种做法的考虑是,编译器在 0.5.0 版本之前不会有重大变更,所以可确保源代码始终按预期被编译。 上面例子中不固定编译器的具体版本号,因此编译器的补丁版也可以使用。
import(导入其它源文件)
Solidity 所支持的导入语句import,语法同 JavaScript(从ES6 起)非常类似
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;
这条语句等同于 import * as symbolName from “filename”;
注释
可以使用单行注释(//)和多行注释(/…/)
// 这是一个单行注释。
/*
这是一个
多行注释。
*/