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; }