-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
f4ae5dc
commit 34a7b7a
Showing
6 changed files
with
322 additions
and
24 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
### EVM 是什么? | ||
|
||
[EVM](https://learnblockchain.cn/tags/EVM?map=EVM)(Ethereum Virtual Machine,以太坊虚拟机)是[以太坊](https://learnblockchain.cn/tags/以太坊?map=EVM)的核心组件之一。它是一种图灵完备的虚拟机,允许任何人通过[智能合约](https://learnblockchain.cn/tags/智能合约?map=EVM)在区块链上运行代码。 | ||
|
||
[Solidity](https://learnblockchain.cn/tags/Solidity?map=EVM)语言 与 EVM, 类似语 Java 与 JVM,由于 EVM 的存在,让以太坊成为一个全球无需可的计算机。 | ||
|
||
|
||
|
||
### EVM 执行原理 | ||
|
||
1. **合约编译/部署**:智能合约通常使用[Solidity](https://learnblockchain.cn/tags/Solidity?map=EVM)语言编写,然后编译成[EVM字节码](https://learnblockchain.cn/tags/EVM%E5%AD%97%E8%8A%82%E7%A0%81),编译后的字节码通过交易的方式部署到[以太坊](https://learnblockchain.cn/tags/以太坊?map=EVM)链。 | ||
2. **执行交易**:每次调用智能合约方法时,都会生成一个交易,这个交易包含了要执行的函数(选择器)以及相关的输入数据。 | ||
3. **Gas 计算**:在EVM中,每条指令的执行都需要消耗一定的[Gas](https://learnblockchain.cn/tags/Gas?map=EVM)。Gas 机制用于防止网络资源被滥用。每个交易发送者在发起交易时需要预先指定愿意支付的最大 Gas 量。 | ||
4. **指令执行**:EVM 以堆栈为基础架构,字节码被加载到 EVM 后,依次执行每条指令。这些指令可以进行算术运算、堆栈操作、存储操作、条件跳转等。 | ||
5. **存储与内存**:EVM 具有两种主要的存储区域:永久存储(Storage)和临时内存(Memory)。永久存储用于保存智能合约状态,存储在区块链上;临时内存用于在交易执行过程中存储中间数据,交易结束后会被清空。 | ||
6. **结果返回**:指令执行完毕后,EVM 返回执行结果。如果执行成功,状态改变和输出结果会被记录到区块链上;如果执行失败,则回滚所有状态变化,并返回错误信息。 | ||
7. **账户状态更新**:根据交易的执行结果,更新相关账户的状态(例如余额、存储数据等)。 | ||
|
||
|
||
|
||
EVM 执行过程中的关键点在于其去中心化和一致性。所有节点都运行相同的EVM代码,确保每个节点在处理同一交易时都能得到相同的结果。 | ||
|
||
EVM 是一个封闭沙盒环境,只能读取链内部的状态。 | ||
|
||
|
||
|
||
## EVM 兼容链 | ||
|
||
由于 EVM 具有灵活性和强大的计算能力,能够支持各种复杂的去中心化应用(DApps),这也是[以太坊](https://learnblockchain.cn/tags/以太坊?map=EVM)生态系统繁荣的基础。 | ||
|
||
也因此发展出了很多 [EVM](https://learnblockchain.cn/tags/EVM?map=EVM) 兼容链,他们是实现(EVM)规范的区块链,使得这些链能够运行以太坊上编写的智能合约,并与以太坊上的工具和基础设施兼容。 | ||
|
||
|
||
|
||
常见的 EVM 兼容链:**BNB Chain (原币安智能链 BSC)**、**Polygon(以前称为 Matic)**、Avalanche、Fantom | ||
|
||
|
||
|
||
## 进一步阅读 | ||
|
||
[理解 EVM - 探究Solidity 背后的秘密](https://learnblockchain.cn/column/22) | ||
|
||
[以太坊 EVM 谜题破解](https://learnblockchain.cn/column/21) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,143 @@ | ||
## Foundry 简介 | ||
|
||
|
||
|
||
[Foundry](https://learnblockchain.cn/tags/Foundry?map=EVM) 是一种用于以太坊智能合约开发的先进工具集。它由 Paradigm 开发,是一个快速、便捷和高效的智能合约开发框架,提供了编译、测试、调试和部署合约的完整工具链。Foundry 的设计目标是提高开发效率简化 [Solidity](https://learnblockchain.cn/tags/Solidity?map=EVM) 智能合约的开发流程。 | ||
|
||
### Foundry 的主要组件 | ||
|
||
1. **Forge**: | ||
- Forge 是 Foundry 的核心命令行工具,用于编译、测试和部署智能合约。 | ||
- 主要功能包括: | ||
- 编译:`forge build` 命令编译智能合约。 | ||
- 测试:`forge test` 命令运行测试,支持快速和高效的单元测试。 | ||
- 部署:`forge create` 命令用于将合约部署到区块链上。 | ||
2. **Cast**: | ||
- Cast 是 Foundry 的另一重要工具,提供了与以太坊网络进行交互的命令行界面。 | ||
- 功能包括发送交易、查询链上数据、调用智能合约等。例如,`cast send` 命令用于发送交易,`cast call` 命令用于调用合约方法。 | ||
3. **Anvil**:一个高性能的本地测试网络,用于模拟以太坊区块链环境。它提供了快速的交易确认和丰富的测试功能,便于开发和调试。 | ||
|
||
4. **Chisel**: 一个先进的Solidity REPL。它可以用来快速测试在本地或 fork 网络上的 Solidity 片段的行为。 | ||
|
||
### 使用 Foundry 的示例 | ||
|
||
以下是使用 Foundry 编写、测试和部署智能合约的基本步骤: | ||
|
||
1. **安装 Foundry**: | ||
- 通过以下命令安装 Foundry: | ||
```sh | ||
curl -L https://foundry.paradigm.xyz | bash | ||
foundryup | ||
``` | ||
|
||
2. **初始化项目**: | ||
- 使用 `forge init` 命令初始化一个新的智能合约项目: | ||
```sh | ||
forge init my-foundry-project | ||
cd my-foundry-project | ||
``` | ||
|
||
3. **编写智能合约**: | ||
- 在 `src` 目录下编写你的智能合约,例如 `HelloWorld.sol`: | ||
```solidity | ||
// SPDX-License-Identifier: MIT | ||
pragma solidity ^0.8.0; | ||
contract HelloWorld { | ||
string public message; | ||
constructor(string memory _message) { | ||
message = _message; | ||
} | ||
function setMessage(string memory _message) public { | ||
message = _message; | ||
} | ||
} | ||
``` | ||
|
||
4. **编译合约**: | ||
- 使用 `forge build` 命令编译合约: | ||
```sh | ||
forge build | ||
``` | ||
|
||
5. **测试合约**: | ||
- 在 `test` 目录下编写测试文件,例如 `HelloWorld.t.sol`: | ||
```solidity | ||
// SPDX-License-Identifier: MIT | ||
pragma solidity ^0.8.0; | ||
import "forge-std/Test.sol"; | ||
import "../src/HelloWorld.sol"; | ||
contract HelloWorldTest is Test { | ||
HelloWorld hello; | ||
function setUp() public { | ||
hello = new HelloWorld("Hello, Foundry!"); | ||
} | ||
function testInitialMessage() public { | ||
assertEq(hello.message(), "Hello, Foundry!"); | ||
} | ||
function testSetMessage() public { | ||
hello.setMessage("Hello, Ethereum!"); | ||
assertEq(hello.message(), "Hello, Ethereum!"); | ||
} | ||
} | ||
``` | ||
|
||
6. **运行测试**: | ||
- 使用 `forge test` 命令运行测试: | ||
```sh | ||
forge test | ||
``` | ||
|
||
7. **合约部署** | ||
|
||
Forge 提供 create 命令和 script 两个方式部署: | ||
|
||
`create` 命令部署合约,方法如下: | ||
|
||
``` | ||
forge create src/HelloWorld.sol:HelloWorld --constructor-args "Hello" --rpc-url <RPC_URL> --private-key $PRIVATE_KEY | ||
``` | ||
|
||
复杂一些的合约,更多的使用 script, 在 `scripts` 目录下创建一个新的部署脚本,例如 `DeployHelloWorld.s.sol`: | ||
|
||
```solidity | ||
// SPDX-License-Identifier: MIT | ||
pragma solidity ^0.8.0; | ||
import "forge-std/Script.sol"; | ||
import "../src/HelloWorld.sol"; | ||
contract DeployHelloWorld is Script { | ||
function run() external { | ||
vm.startBroadcast(); | ||
new HelloWorld("Hello, Foundry!"); | ||
vm.stopBroadcast(); | ||
} | ||
} | ||
``` | ||
|
||
在这个脚本中,`vm.startBroadcast()` 和 `vm.stopBroadcast()` 用于指示在区块链上广播交易。`new HelloWorld("Hello, Foundry!");` 是部署合约的命令。 | ||
``` | ||
forge script scripts/DeployHelloWorld.s.sol --rpc-url <RPC_URL> --private-key $PRIVATE_KEY --broadcast | ||
``` | ||
|
||
|
||
|
||
|
||
## 更多 | ||
|
||
1. DeCert.me Foundry 开发教程: https://decert.me/tutorial/solidity/tools/foundry | ||
|
||
2. Foundry 文档: 英文: https://book.getfoundry.sh/ 中文:https://learnblockchain.cn/docs/foundry/i18n/zh/ | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
## Solidity | ||
|
||
[Solidity](https://learnblockchain.cn/docs/solidity/) 是一门面向合约的、为实现智能合约而创建的高级编程语言,也是用于开发[以太坊](https://learnblockchain.cn/tags/以太坊?map=EVM)智能合约)最受欢迎的语言之一。这门语言受到了 C++,Python 和 Javascript 语言的影响,其设计目的是能在 [以太坊虚拟机(EVM)](https://learnblockchain.cn/2019/04/09/easy-evm/) 上运行。 | ||
|
||
Solidity 是静态类型语言,具备面向对象特性:支持继承、库、接口和复杂的用户定义类型、 | ||
|
||
Solidity 中文文档:可阅读[Solidity最新中文文档](https://learnblockchain.cn/docs/solidity/) | ||
|
||
> Solidity 更新较快,历史版本文档:[0.8.0 更新列表](https://learnblockchain.cn/docs/solidity/080-breaking-changes.html) , [0.7 更新列表](https://learnblockchain.cn/docs/solidity/070-breaking-changes.html) , [0.6 更新列表](https://learnblockchain.cn/docs/solidity/060-breaking-changes.html) , [0.5 更新列表](https://learnblockchain.cn/docs/solidity/050-breaking-changes.html) 。 | ||
### Solidity 的实例 | ||
|
||
一个简单的 Solidity 智能合约示例如下: | ||
|
||
```solidity | ||
// SPDX-License-Identifier: MIT | ||
pragma solidity ^0.8.0; | ||
contract SimpleStorage { | ||
uint256 private data; | ||
// 设置数据 | ||
function set(uint256 _data) public { | ||
data = _data; | ||
} | ||
// 获取数据 | ||
function get() public view returns (uint256) { | ||
return data; | ||
} | ||
} | ||
``` | ||
|
||
- `pragma solidity ^0.8.0;`:指定 Solidity 编译器的版本。 | ||
- `contract SimpleStorage`:定义一个名为 `SimpleStorage` 的合约。 很类似其他语言定义一个类。 | ||
- `uint256 private data;`:定义一个私有的 `uint256` 类型变量 `data`。 | ||
- `function set(uint256 _data) public`:定义一个公开的 `set` 函数,用于设置 `data` 的值。 | ||
- `function get() public view returns (uint256)`:定义一个公开的 `get` 函数,用于返回 `data` 的值。 | ||
|
||
### Solidity 开发工具 | ||
|
||
开发 Solidity 智能合约时,可以使用以下工具: | ||
|
||
1. **Remix IDE**: | ||
- [Remix](https://remix.ethereum.org/) 是一个基于浏览器的开发环境,提供了编写、编译、调试和部署 Solidity 智能合约的全套工具。 | ||
2. **Hardhat**: | ||
- [Hardhat](https://learnblockchain.cn/tags/Hardhat?map=EVM) 是一个 Solidity 开发工具,可以轻松地编写、测试和部署智能合约。Hardhat 使用 Node 进行包管理,如果你熟悉 Node 及 Javascript, Hardhat 将非常简单上手。 | ||
3. **Foundry**: | ||
- [Foundry](https://learnblockchain.cn/tags/Foundry?map=EVM) 是一个 Solidity 开发工具,用于构建、测试、模糊、调试和部署Solidity智能合约, Foundry 的优势是以Solidity 作为第一公民,完全使用 Solidity 进行开发与测试,如果你不太熟悉 JavaScript , 使用 Foundry 是一个非常好的选择,而且Foundry 构建、测试的执行速度非常快。 | ||
4. Truffle: 不推荐使用 | ||
5. **OpenZeppelin**: | ||
- [OpenZeppelin](https://learnblockchain.cn/tags/OpenZeppelin?map=EVM) 提供了可复用的智能合约库和安全工具,帮助开发者编写安全的合约。 | ||
|
||
|
||
|
||
## 更多 | ||
|
||
|
||
|
||
专栏:[全面掌握Solidity智能合约开发](https://learnblockchain.cn/column/1) | ||
|
||
DeCert.me 教程:https://decert.me/tutorial/solidity/intro/ | ||
|
||
线上课程:https://learnblockchain.cn/course/28 | ||
|
||
线下集训:[OpenSpace Web3*BootCamp ](https://learnblockchain.cn/openspace/1) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
**去中心化自治组织(DAO)**:建立去中心化的组织结构,用于社区治理和集体决策。 |
Oops, something went wrong.