Skip to content

Commit

Permalink
add introduce
Browse files Browse the repository at this point in the history
  • Loading branch information
xilibi2003 committed Jun 30, 2024
1 parent f4ae5dc commit 34a7b7a
Show file tree
Hide file tree
Showing 6 changed files with 322 additions and 24 deletions.
43 changes: 43 additions & 0 deletions eth/EVM.md
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)
2 changes: 1 addition & 1 deletion eth/eips/ERC721.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
## ERC721
ERC721 是一种用于创建非同质化代币(NFT)的以太坊标准。与 ERC20 标准不同,ERC721 代币是独特的,每个代币都有其独特的属性和价值。
ERC721 是一种用于创建[非同质化代币(NFT)](https://learnblockchain.cn/tags/NFT)的以太坊标准。与 ERC20 标准不同,ERC721 代币是独特的,每个代币都有其独特的属性和价值。

### ERC721 的特点

Expand Down
143 changes: 143 additions & 0 deletions eth/开发/Foundry.md
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/


67 changes: 67 additions & 0 deletions eth/开发/Solidity.md
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)

1 change: 1 addition & 0 deletions eth/生态应用/DAO.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
**去中心化自治组织(DAO)**:建立去中心化的组织结构,用于社区治理和集体决策。
Loading

0 comments on commit 34a7b7a

Please sign in to comment.