《深入掌握以太坊核心技术》--09-Solidity简介
Solidity简介
- Solidity是一门面向合约的、为实现智能合约而创建的高级编程语言。设计的目的是能在以太坊虚拟机(EVM)上运行。
- Solidity是静态类型语言,支持继承、库和复杂的用户定义类型。
- 内含的类型除了常见编程语言的标准类型,还包括address等以太坊独有的类型,Solidity源码文件通常以.sol作为扩展名。
- 可以在Remix上进行Solidity编程。Remix是一个基于Web浏览器的IDE,它可以让你编写Solidity智能合约,然后部署并运行该智能合约。
语言特性
Solidity的语法接近于 JavaScript,是一种面向对象的语言。但作为一种真正意义上运行在网络上的去中心化合约,又有很多不同:
-
以太坊底层基于账户,而不是UTXO,所以增加了一个特殊的 address 的数据类型用于定位用户和合约账户。
-
语言内嵌框架支持支付。提供了 payable 等关键字,可以在语言层面直接支持支付。
-
使用区块链进行数据存储。数据的每一个状态都可以永久存储,所以在使用时需要确定变量使用内存,还是区块链存储。
-
运行环境是在去中心化的网络上,所以需要强调合约或函数执行的调用方式。(内部调用与外部调用)
-
不同的异常机制。一旦出现异常,所有的执行都将会被回撤,这主要是为了保证合约执行的原子性,以避免中间状态出现的数据不一致。
Solidity源码和智能合约
Solidity源代码要成为可以运行在以太坊上的智能合约,需要经历如下步骤:
- 用Solidity编写的智能合约源代码需要先使用编译器编译为字节码(bytecode),编译过程中会同时产生智能合约的二进制接口规范(Application Binary Interface,简称 ABI)(链上合约与外部交互的通道)
- 通过交易(Transaction)的方式将字节码部署到以太坊网络,每次成功部署都会产生一个新的智能合约账户
- 使用JavaScript编写的 DApp 通常通过 web3.js + ABI 去调用智能合约中的函数来实现数据的读取和修改
Remix上开发测试solidity
public:public类型的状态变量,编译器会自动生成一个同名的get方法,即可在外面直接观察到这个变量
function price() public view returns(unint)public {
return price;
}
string public str = “12345”;
定义变量时:变量类型在可见性修饰符之前,顺序颠倒时编译会报错,string长度无限,可能会消耗大量gas,同时在remix输入时要用双引号来括起""
,同时存储的是16进制内容,用户输入UTF-8字符,但需要将UTF-8字符转换成到16进制再存入进来,然后若与用户交互则又转回UTF-8字符
pragma solidity ^0.4.22;
contract SimpleStorage {
uint myData;
uint public price;
string public str = "12345";
bytes32 str2;
// 构造函数是一种特殊类型的函数,用于在合约被创建时进行初始化操作。
//在 Solidity 的旧版本中(例如 0.4.x 版本),构造函数的语法是使用合约的名称作为函数名。
//但是在 Solidity 的新版本中(例如 0.5.x 版本及更高版本),
//构造函数的语法已经改变,现在应该使用关键字 constructor 来定义构造函数。
// 构造方法可以带有参数,在部署合约时需要传入参数
constructor(bytes32 initStr2, uint initAge) public {
str2 = initStr2;
age = initAge;
}
function setData(uint newData) public {
myData = newData;
}
// view:只读返回状态变量。
// 虽然不添加 view 关键字程序也能正常执行, 但是不直观,而且编译时可能会有警告
function getData() public view returns (uint) {
return myData;
}