Solidity

开篇文章记录实习期间学习Solidity编程的相关内容。

参考页面:

Solidity中文文档(v0.8.17)

Solidity官方文档(v0.8.20)


基础

在学习Solidity语言之前,需要了解一些前置知识,包括:

  • 区块链基础
  • 以太坊虚拟机

另外,若想要深入理解智能合约以及虚拟机是如何运行的,可以参考这两篇文章:完全理解以太坊智能合约深入浅出以太坊虚拟机

智能合约示例

存储合约示例

将一个数据保存到链上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.9.0;

contract SimpleStorage {
uint storedData;

function set(uint x) public {
storedData = x;
}

function get() public view returns (uint) {
return storedData;
}
}

货币合约示例

一个最简单的加密货币

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.4;

contract Coin {
// 关键字“public”让这些变量可以从外部读取
address public minter;
mapping (address => uint) public balances;

// 轻客户端可以通过事件针对变化作出高效的反应
event Sent(address from, address to, uint amount);

// 这是构造函数,只有当合约创建时运行
constructor() {
minter = msg.sender;
}

function mint(address receiver, uint amount) public {
require(msg.sender == minter);
balances[receiver] += amount;
}

// Errors allow you to provide information about
// why an operation failed. They are returned
// to the caller of the function.
error InsufficientBalance(uint requested, uint available);


function send(address receiver, uint amount) public {
if (amount > balances[msg.sender])
revert InsufficientBalance({
requested: amount,
available: balances[msg.sender]
});

balances[msg.sender] -= amount;
balances[receiver] += amount;
emit Sent(msg.sender, receiver, amount);
}
}

以上示例代码可以等学习完语法回头再看。


Solidity详解

合约结构

相当于OOP语言中的类,具有可继承性,可以包含状态变量、函数、事件、错误、结构体等声明

状态变量

状态变量是永久存储在合约存储中的值。

1
2
3
4
5
6
pragma solidity >=0.4.0 <0.9.0;

contract TinyStorage {
uint storedXlbData; // 状态变量
// ...
}

函数

函数是代码的可执行单元,可以在合约内部或者外部定义。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.1 <0.9.0;

contract TinyAuction {
// Mybid function defined inside of a contract
function Mybid() public payable {
// ...
}
}

// Helper function defined outside of a contract
function helper(uint x) pure returns (uint) {
return x * 2;
}