Solidity的下载
个人推荐新手可以优先使用Remix练手
Remix
如果你想要尝试利用Solidity编写智能合约,可以尝试使用Remix,因为其不需要任何安装。
Solidity语法详解
Solidity源文件结构
源文件包含了关于合约定义的所有内容,包括指令集和版本指令。
版本注释
源文件需要在开头指明版本号,预防在更新的编译器中无法正常编译。版本注释长成这样:
pragma solidity ^0.4.14;
此类源文件可以被0.4.x版本的编译器编译,无法在0.4.0之前或0.5.0之后的编译器中编译。
引入外部源文件
语法结构
Solidity支持import
,非常像js中的引入操作,但是Solidity没有类似default export
这样的操作。对于import的举例如下:
import ("filename");
或者只引入部分成员函数
import * as symbolName from "filename";
// which is equal to
import "filename" as symbolName;
import {symbol1 as alias, symbol2} from "filename";
注释的写法
单行注释可以用\\
,多行注释用\*...*\
。
// This is a single-line comment.
/*
This is a
multi-line comment.
*/
另外还有一种称为Natspec注释,表示该文档尚未写入。用\\\
或者\**...*\
表示,直接在函数声明或者语句上方使用。你可以用Doxygen-style 标记来记录该功能,注释条件以进行正式的验证,并提供说明,当用户尝试调用此功能时,将该文本返回给用户。
下面的例子我们记录了合约的标题,两个输入参数及返回值的解释。
pragma solidity ^0.4.0;
/** @title Shape calculator. */
contract shapeCalculator {
/** @dev Calculates a rectangle's surface and perimeter.
* @param w Width of the rectangle.
* @param h Height of the rectangle.
* @return s The calculated surface.
* @return p The calculated perimeter.
*/
function rectangle(uint w, uint h) returns (uint s, uint p) {
s = w * h;
p = 2 * (w + h);
}
}
合约的数据结构
Solidity中的合约类似于面向对象语言中的类。每个合约包含状态变量(State Variables),函数(Functions),函数修饰器(Function Modifiers),事件(Events),结构体类型(Structs Types),枚举类型(Enum Types)的声明。
状态变量
状态变量是始终存在于合约存储器(Storage)中的值。
pragma solidity ^0.4.0;
contract SimpleStorage {
uint storedData; // State variable
// ...
}
状态变量类型(Types),常用的包括布尔型(bool),整型(int/uint),地址(address)等。状态变量的可见度(Visibility and Getters),主要是external(内不可见外可见),public(内外可见),internal(内可见外不可见),private(内外不可见)。
值类型
布尔型 (Booleans)
bool
: 取值为常量true
和false
。
操作符:
!
逻辑取反&&
逻辑与||
逻辑或==
相等!=
不等
整型 (Integers)
int
/ uint
:可变长度的有符号和无符号整型数。关键词uint8
到uint256
的位数按照8位逐渐增长至256位。int和uint分别为int256和uint256的别名。
操作符:
- 比较操作:
<=
,<
,==
,!=
,>
,>=
,结果类型为bool
。 - 位操作:
&
,|
,^
(按位异或),~
(按位取反) - 算数符操作:
+
,-
, 一元-
, 一元+
,*
,/
,%
(取余),**
(求幂),<<
(左移),>>
(右移)
地址成员 (Member of Address)
address
:是一个20字节长度的值。其有balance
及transfer
两个成员,可以通过balance
来查询地址余额,以及通过transfer
来给某个地址打钱。对于Address的详解参见 Address Related。
address x = 0x123;
address myAddress = this;
// 如果地址x的钱少于10wei且我的地址myAddress的余额多于10wei,则我给x打10wei。
if (x.balance < 10 && myAddress.balance >= 10) x.transfer(10);
函数
函数是智能合约中可执行代码单元
pragma solidity ^0.4.0;
contract SimpleAuction {
function bid() payable { // Function
// ...
}
}
可在合约内部或者外部调用函数(Function Calls),并且也拥有不同的可见度(Visibility and Getters)。
函数修饰器
函数修饰器可以通过声明方式修改函数的语义(详见Function Modifiers)
pragma solidity ^0.4.11;
contract Purchase {
address public seller;
modifier onlySeller() { // Modifier
require(msg.sender == seller);
_;
// _;可以理解为将require(msg.sender == seller)在被修饰函数中优先执行。
}
function abort() onlySeller { // Modifier usage
// ...
}
}
事件
事件是以太坊虚拟机日志工具的便利接口。
pragma solidity ^0.4.0;
contract SimpleAuction {
event HighestBidIncreased(address bidder, uint amount); // Event
function bid() payable {
// ...
HighestBidIncreased(msg.sender, msg.value); // Triggering event
}
}
详解请参阅智能合约章节中的事件小结(Events),了解有关事件如何声明以及如何在dapp中的使用。
结构体类型
结构体是用户自定义的数据结构,可以将几个变量组委一体,详解请参阅结构体小节(Structs)。
pragma solidity ^0.4.0;
contract Ballot {
struct Voter { // Struct
uint weight;
bool voted;
address delegate;
uint vote;
}
}
枚举类型
枚举用于创建有限值集的自定义类型,详解请参阅结构体小节(Structs)。
pragma solidity ^0.4.0;
contract Purchase {
enum State { Created, Locked, Inactive } // Enum
}
This work is licensed under a CC A-S 4.0 International License.