Skip to content

Commit

Permalink
init
Browse files Browse the repository at this point in the history
  • Loading branch information
xiaomeng79 committed Feb 7, 2025
1 parent e984c44 commit de0760e
Show file tree
Hide file tree
Showing 9 changed files with 727 additions and 36 deletions.
27 changes: 0 additions & 27 deletions 13区块链/3共识.md

This file was deleted.

9 changes: 0 additions & 9 deletions 13区块链/4通证经济.md

This file was deleted.

234 changes: 234 additions & 0 deletions 13区块链/coins/eth.md
Original file line number Diff line number Diff line change
Expand Up @@ -137,5 +137,239 @@ ETH2.0 按照 epoch 出块,每一个 epoch 有 32 slot,每一个 slot 可以
- 将创建的交易插入待发送队列
- 更改提币条目状态为已生成提币交易

## **2. 以太坊区块的组成**
每个以太坊区块由 **区块头(Block Header)、区块体(Block Body)** 组成。

### **📌 以太坊区块结构**
| **字段** | **描述** |
|---------|---------|
| **区块头(Block Header)** | 存储区块的元数据 |
| **区块号(Block Number)** | 区块的高度 |
| **父区块哈希(Parent Hash)** | 上一个区块的哈希值 |
| **状态根(State Root)** | 交易执行后的全局状态 |
| **交易默克尔根(Transactions Root)** | 交易列表的 Merkle 树根 |
| **收据默克尔根(Receipts Root)** | 交易收据的 Merkle 树根 |
| **Gas 限制(Gas Limit)** | 该区块可消耗的最大 Gas |
| **Gas 使用量(Gas Used)** | 该区块实际消耗的 Gas |
| **时间戳(Timestamp)** | 该区块生成的时间 |
| **区块体(Block Body)** | 存储交易数据 |
| **交易列表(Transactions)** | 该区块包含的所有交易 |
| **叔块列表(Ommers)** | PoW 时代包含的孤块 |

---

## **3. 以太坊区块链数据结构**
### **📌 以太坊区块链由以下 3 棵默克尔树组成**
1️⃣ **账户状态树(State Trie)**:存储账户余额、Nonce、智能合约状态
2️⃣ **交易树(Transactions Trie)**:存储区块中的交易数据
3️⃣ **收据树(Receipts Trie)**:存储每笔交易的执行结果

**采用 Patricia Merkle Trie(Patricia 默克尔前缀树)**
**高效支持状态存储和查询**

---

## **4. 以太坊区块生成流程**
1️⃣ **交易广播**:用户发起交易,交易被广播到网络
2️⃣ **验证交易**:节点检查交易的合法性(签名、余额、Gas 限制)
3️⃣ **共识机制**
- **PoW 时代(以前)**:矿工进行工作量证明(Ethash 算法)
- **PoS 时代(Ethereum 2.0)**:验证者(Validator)负责打包区块
4️⃣ **交易执行**:虚拟机(EVM)运行交易,更新账户状态
5️⃣ **存储数据**:状态更新并写入状态树
6️⃣ **新区块添加到链**:区块被确认后添加到链中

## **6. 以太坊交易结构**
每个以太坊交易(Transaction)都包含**发送者、接收者、金额、Gas、签名等信息**

### **📌 交易结构**
| **字段** | **描述** |
|---------|---------|
| **Nonce** | 账户已发出的交易数量 |
| **Gas Price** | 交易的 Gas 价格 |
| **Gas Limit** | 交易可消耗的最大 Gas |
| **To** | 交易接收方地址 |
| **Value** | 发送的 ETH 数量 |
| **Data** | 智能合约调用数据(如合约函数) |
| **签名(Signature)** | 发送者对交易的数字签名 |

**智能合约交易(调用合约)**`to` 字段指向合约地址
**普通转账交易**`to` 字段指向用户地址



# 📌 以太坊交易票据(Transaction Receipt)详细解析

## **1. 交易票据的作用**
以太坊交易票据(Transaction Receipt)是 **交易执行后的证明**,记录了交易的最终状态,例如:
- 交易是否成功
- 消耗的 Gas 量
- 事件日志(Event Logs)
- 合约创建地址(如果是创建合约的交易)
- 交易影响的状态变更

每笔交易的票据存储在 **Receipts Trie** 中,是 **可验证的执行结果**

---

## **2. 交易票据的结构**
### **📌 以太坊票据的关键字段**
| **字段** | **描述** |
|---------|---------|
| **transactionHash** | 交易哈希 |
| **transactionIndex** | 交易在区块中的索引 |
| **blockHash** | 交易所属区块的哈希 |
| **blockNumber** | 交易所属区块的高度 |
| **from** | 交易发送者 |
| **to** | 交易接收者(或 `null`,如果是合约创建) |
| **cumulativeGasUsed** | 区块内所有交易累积的 Gas 消耗 |
| **gasUsed** | 当前交易实际消耗的 Gas |
| **contractAddress** | 如果是合约创建交易,则为新合约地址,否则为 `null` |
| **logs** | 交易执行过程中触发的事件日志 |
| **logsBloom** | 用于快速索引日志的布隆过滤器 |
| **status** | 交易状态:`1` 表示成功,`0` 表示失败 |

---

## **3. 交易票据示例**
可以使用 **Go Ethereum (geth) 的 RPC API** 获取交易票据。
使用 `eth_getTransactionReceipt` 获取票据信息:

### **📌 示例 JSON 交易票据**
```json
{
"transactionHash": "0x12345...",
"transactionIndex": 1,
"blockHash": "0xabcde...",
"blockNumber": 12345678,
"from": "0xSenderAddress...",
"to": "0xReceiverAddress...",
"cumulativeGasUsed": 150000,
"gasUsed": 50000,
"contractAddress": null,
"logs": [
{
"address": "0xContractAddress...",
"topics": ["0xddf252ad...", "0xSender...", "0xReceiver..."],
"data": "0x00000000000000000000000000000000000000000000000000000000000003e8"
}
],
"logsBloom": "0x...",
"status": "0x1"
}

```

## 使用 Go 解析以太坊交易票据
```go
package main

import (
"context"
"encoding/json"
"fmt"
"log"
"math/big"

"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethclient"
"github.com/ethereum/go-ethereum/core/types"
)

func main() {
// 连接以太坊 RPC 节点
client, err := ethclient.Dial("https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID")
if err != nil {
log.Fatal(err)
}

// 交易哈希
txHash := common.HexToHash("0x交易哈希值...")

// 获取交易票据
receipt, err := client.TransactionReceipt(context.Background(), txHash)
if err != nil {
log.Fatal(err)
}

// 打印交易票据
printReceipt(receipt)
}

// 打印交易票据信息
func printReceipt(receipt *types.Receipt) {
jsonData, err := json.MarshalIndent(receipt, "", " ")
if err != nil {
log.Fatal(err)
}

fmt.Println("交易票据信息:")
fmt.Println(string(jsonData))

fmt.Println("\n解析字段:")
fmt.Println("交易哈希:", receipt.TxHash.Hex())
fmt.Println("交易状态:", receipt.Status) // 1: 成功, 0: 失败
fmt.Println("区块高度:", receipt.BlockNumber.Uint64())
fmt.Println("Gas 消耗:", receipt.GasUsed)

// 解析事件日志
for _, log := range receipt.Logs {
fmt.Println("\n事件日志地址:", log.Address.Hex())
fmt.Println("日志 Topics:", log.Topics)
fmt.Println("日志数据:", log.Data)
}
}

```

## 解析事件日志
```solidity
event Transfer(address indexed from, address indexed to, uint256 value);
function transfer(address to, uint256 value) public {
emit Transfer(msg.sender, to, value);
}
```
触发 Transfer 事件后,在 logs 里存储:
```json
{
"address": "0xTokenContractAddress...",
"topics": [
"0xddf252ad...", // Transfer 事件哈希
"0xSenderAddress...",
"0xReceiverAddress..."
],
"data": "0x00000000000000000000000000000000000000000000000000000000000003e8"
}

```

## Go 解析日志
```go
for _, log := range receipt.Logs {
fmt.Println("事件地址:", log.Address.Hex())
for i, topic := range log.Topics {
fmt.Printf("Topic %d: %s\n", i, topic.Hex())
}
fmt.Println("数据:", log.Data)
}

```

## 票据存储:Receipts Trie 结构
以太坊交易票据存储在 **Receipts Trie** 中,每个区块都维护一棵 **默克尔帕特里夏树(MPT)** 来存储:

### **📌 关键结构**
- `blockHeader.receiptRoot`:存储 **Receipts Trie** 的根哈希
- **优势**
- 高效存储
- 快速验证

### **📌 计算过程**
1. 计算每个交易的 `receiptHash`
2. 组成 **Receipts Trie**
3. 生成 `receiptRoot`,存入 **区块头(Block Header)**



Loading

0 comments on commit de0760e

Please sign in to comment.