From 4c6aa13d66dbc314fa03b0b0ea25eabd5e50133d Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 00:01:43 +0000 Subject: [PATCH 01/92] Update commit status table --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6723db6..9262cc0 100644 --- a/README.md +++ b/README.md @@ -103,7 +103,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | ------------- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | | brucexu-eth | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | PayFv | ⭕️ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | -| chloezhu010 | ✅ | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| chloezhu010 | ✅ | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | coratann | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | luffythink | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | Henry | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | @@ -113,7 +113,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | mrmign | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | ghx1104 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | Coooder-Crypto | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | -| rayjun | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| rayjun | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | CJC824 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | William-02-02 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | hotoo | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | @@ -130,7 +130,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | DVDguzhou | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | armada2013 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | realgu | ✅ | ✅ | ⭕️ | ✅ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | -| Eizz0 | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | | +| Eizz0 | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | | kernel1983 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | JC13043DB | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | | GuoyangLiu24 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | @@ -634,6 +634,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 3d7fc28ade0a06567b4bd47d7bf979075a639ea0 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 01:21:32 +0000 Subject: [PATCH 02/92] Update commit status table --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9262cc0..c8ba37e 100644 --- a/README.md +++ b/README.md @@ -635,6 +635,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From f856f2dad4a189bbb391d273cbe85acadfca3619 Mon Sep 17 00:00:00 2001 From: cooper Date: Wed, 12 Feb 2025 11:41:27 +0800 Subject: [PATCH 03/92] update cooper.md --- cooper.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cooper.md b/cooper.md index 9f9fbca..a3e1181 100644 --- a/cooper.md +++ b/cooper.md @@ -289,7 +289,10 @@ EVM 字节码是程序的字节序列(8 位)的表示。字节码中的每 ### 2025.02.12 > 周三 -笔记内容 +#### 学习总结 +参考:https://epf.wiki/#/wiki/EL/evm + +细致的了解了EVM的执行流程,以及EVM的执行引擎。 ### 2025.02.13 > 周四 From b956582785887a5a85186d714c91c105e7d15a0e Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 03:43:18 +0000 Subject: [PATCH 04/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c8ba37e..8e9f8d2 100644 --- a/README.md +++ b/README.md @@ -134,7 +134,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | kernel1983 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | JC13043DB | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | | GuoyangLiu24 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| cooper | ⭕️ | ✅ | ✅ | ✅ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | +| cooper | ⭕️ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ✅ | | | | | | | | | | | | | | | | | | | | chyyynh | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | frankmint2024 | ✅ | ⭕️ | ✅ | ⭕️ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | | Amberrrrrr | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | @@ -636,6 +636,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 9b2cc0643ad417b1b6b6e84d01c49d1f4c1ee004 Mon Sep 17 00:00:00 2001 From: Bruce Xu <95468177+brucexu-eth@users.noreply.github.com> Date: Wed, 12 Feb 2025 16:59:57 +1300 Subject: [PATCH 05/92] Update brucexu-eth.md --- brucexu-eth.md | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/brucexu-eth.md b/brucexu-eth.md index a882632..d8f955a 100644 --- a/brucexu-eth.md +++ b/brucexu-eth.md @@ -190,10 +190,42 @@ Light clients are nodes that do not contain entire blockchain data. Instead, the 选择要验证的 tx 的相关 hash 即可,因为上层的 hash 节点都是计算生成的。 -TODO https://epf.wiki/#/eps/week1 - TODO 跑一下代码 https://github.com/dajuguan/lab/blob/main/eth/randao.py +# 2025.02.12 + +## https://epf.wiki/#/eps/week1 + +![image](https://github.com/user-attachments/assets/3635c3a4-c051-4557-a8cb-0621a5b84467) + +The Merge 的过程,其实是构建了一个平行的 Beacon Chain 一直在运行和检测,之后把 execution layer 接过来。 + +As hinted above, the main high level components of Ethereum are execution and consensus layer. These are 2 networks which are connected and dependent on each other. Execution layer provides the execution engine, handles user transaction and all state (address, contract data) while consensus implements the proof-of-stake mechanism ensuring security and fault tolerance. + +The traditional development cycle for new features or changes is Idea - Research - Development - Testing - Adoption. However, problems might arise at any moment of this cycle resulting in iterating again from the beginning. + +The coordination mainly happens via regular calls which are scheduled in the PM repo. + +The ideas and proposed changes from the community are coordinated using EIP process. Additionally, there are a few discussion forums. The biggest one discussing core upgrades is https://ethresear.ch. Another forum which is connected to the EIP process and serves for discussion about specific proposals is Ethereum Magicians. Lots of important discussion is also happening on the R&D Discord server (ping us in EPFsg discord to get an invite) and in client team groups. There are also offsites or workshops where many core developers meet in person to speed up the process face to face. + +通过 https://github.com/ethereum/pm 学习到的社区协调和管理经验: + +1. 通过创建 issues + tag 来放议题、会议链接等信息,例如 https://github.com/ethereum/pm/issues/1253 包括全部的会议,不仅仅是 ACDE ACDC +2. 提供了一个 Google Calendar 来快速添加,但是目前不知道是自动还是人工维护的 +3. 欢迎大家通过评论的方式,添加议题等 +4. 写清楚了议题如何添加、谁能参加、谁主持等 +5. ECH 提供了字幕稿,然后下面有个大表单,可以看到每次会议的录屏、notes、讨论等等 + +对 LXDAO 的启发: + +- 可以考虑将会议集中在这里管理,避免在论坛占用大家的注意力 +- 提供会议的速记和内容稿,作为社区周报的内容,而非比较制式的,重点在于引导大家讨论 + +TODO https://notes.ethereum.org/@mikeneuder/rcr2vmsvftv + +TODO https://epf.wiki/#/eps/week2 + + From c88180d21ac6db030ce6d3b1e37c67ad45f0db37 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 04:00:12 +0000 Subject: [PATCH 06/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8e9f8d2..d1b9e93 100644 --- a/README.md +++ b/README.md @@ -101,7 +101,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | Name | 2.06 | 2.07 | 2.08 | 2.09 | 2.10 | 2.11 | 2.12 | 2.13 | 2.14 | 2.15 | 2.16 | 2.17 | 2.18 | 2.19 | 2.20 | 2.21 | 2.22 | 2.23 | 2.24 | 2.25 | 2.26 | 2.27 | 2.28 | 3.01 | 3.02 | | ------------- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | -| brucexu-eth | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| brucexu-eth | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | PayFv | ⭕️ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | | chloezhu010 | ✅ | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | coratann | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | @@ -637,6 +637,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 11df980a8f3169c79cd108f8300518e756afc56c Mon Sep 17 00:00:00 2001 From: realgu <36865815+ChengruiGu@users.noreply.github.com> Date: Wed, 12 Feb 2025 12:26:04 +0800 Subject: [PATCH 07/92] Update realgu.md --- realgu.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/realgu.md b/realgu.md index 12e421a..8336313 100644 --- a/realgu.md +++ b/realgu.md @@ -34,6 +34,28 @@ timezone: Asia/Shanghai - 1e = 1 billion gwei - 一笔交易大概需要21000 gas unit,每个block 的 gas limit 目前大概 30m gas unit,base fee是 gwei / gas unit - 晕了 EL Spec 很难读下去,暂时跳过吧 -- + +### 2024.02.11 +State Trasition Function: +``` +func stf(parent types.Block, block types.Block, state state.StateDB) (state.StateDB, error) { //1 + if err := core.VerifyHeaders(parent, block); err != nil { //2 + // header error detected + return nil, err + } + for _, tx := range block.Transactions() { //3 + res, err := vm.Run(block.header(), tx, state) + if err != nil { + // transaction invalid, block is invalid + return nil, err + } + state = res + } + return state, nil +} +``` +问题: what exactly does a 'state' contains? what are the tries? + + From 3acb10334e2fbff59a60377e242dfa919baf117d Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 04:26:18 +0000 Subject: [PATCH 08/92] Update commit status table --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d1b9e93..9cd114e 100644 --- a/README.md +++ b/README.md @@ -638,6 +638,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 1d1bb2e2fab98aad47c60025a077fb42cbfcc1af Mon Sep 17 00:00:00 2001 From: jeasonzhang Date: Wed, 12 Feb 2025 12:41:56 +0800 Subject: [PATCH 09/92] Update JeasonZhang.md --- JeasonZhang.md | 177 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 175 insertions(+), 2 deletions(-) diff --git a/JeasonZhang.md b/JeasonZhang.md index 4e2e6d8..32f9025 100644 --- a/JeasonZhang.md +++ b/JeasonZhang.md @@ -529,10 +529,183 @@ ### 2025.02.12 -##### **EPF WIKI WEEK6** +##### **EPF WIKI Node Workshop** + +#### **I. 核心学习目标** + +**主题**: 以太坊客户端实践操作 +**目标**: 掌握执行层(EL)与共识层(CL)客户端的部署、配置及运维技能。 + +------ + +#### **II. 环境准备** + +##### **1. 系统要求** + +- **推荐系统**: Debian 12(支持Ubuntu/macOS,建议使用虚拟机统一环境) + +- **硬件配置**: 测试网节点无需高性能硬件(2核CPU/4GB RAM/50GB存储) + +- 基础工具安装: + + ```bash + sudo apt update && sudo apt install -y curl git gpg docker.io build-essential + ``` + +##### **2. 前置知识** + +- **客户端架构**: 复习[节点架构文档](https://ethereum.org/en/developers/docs/nodes-and-clients/node-architecture/) +- **Linux基础**: 掌握[基础命令行操作](https://ubuntu.com/tutorials/command-line-for-beginners) + +------ + +#### **III. 客户端部署流程** + +##### **1. 客户端选择与获取** + +- **推荐组合**: Geth(EL) + Lighthouse(CL) + +- 二进制验证(以Geth为例): + + ```bash + # 下载签名文件 + curl -O https://geth.ethereum.org/geth-linux-amd64-1.13.0-6c74b4e6.sig + # 验证签名 + gpg --verify geth-linux-amd64-1.13.0-6c74b4e6.sig + ``` + +##### **2. Docker快速部署** + +```bash +# 启动Geth测试网节点 +docker run -d -p 8545:8545 -v /data/geth:/root/.ethereum \ + ethereum/client-go --goerli --http --http.addr 0.0.0.0 + +# 启动Lighthouse共识客户端 +docker run -d -p 9000:9000 -p 9001:9001 -v /data/lighthouse:/root/.lighthouse \ + sigp/lighthouse lighthouse beacon --network holesky +``` + +##### **3. 测试网配置** + +- Holesky测试网: + + ```bash + geth --holesky --syncmode snap --http + lighthouse beacon --network holesky + ``` + +- Ephemery自定义创世块: + + ```bash + geth init --datadir ./ephemery ephemery-genesis.json + ``` + +------ + +#### **IV. 节点运维实践** + +##### **1. RPC接口使用** + +- 基础访问: + + ```bash + curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \ + http://localhost:8545 + ``` + +- 控制台交互: + + ```bash + geth attach http://localhost:8545 + > eth.syncing + ``` + +##### **2. 验证者管理** + +- 质押存款: + + ```bash + lighthouse account validator deposit \ + --network holesky \ + --keystore ./validator_keys \ + --deposit-value 32 + ``` + +##### **3. 系统服务配置** + +- systemd服务文件示例(Geth): + + ```ini + [Unit] + Description=Geth Execution Client + After=network.target + + [Service] + ExecStart=/usr/bin/geth --http --syncmode snap --cache 2048 + Restart=always + User=geth + + [Install] + WantedBy=multi-user.target + ``` + +------ + +#### **V. 进阶实践建议** + +##### **1. 节点监控** + +- Prometheus+Grafana方案: + + ```bash + # 安装Prometheus + docker run -d -p 9090:9090 -v /prometheus-data:/prometheus prom/prometheus + # 配置Grafana仪表盘(参考Coincashew指南) + ``` + +##### **2. 网络诊断** + +- P2P网络分析: + + ```bash + # 使用devp2p工具检查节点连接 + devp2p discv5 nodes -bootnodes enr://... + ``` + +##### **3. 客户端切换实验** + +- 执行层切换 + + (Geth → Erigon): + + ```bash + erigon --chain holesky --datadir ./erigon-data --http + ``` + +- 共识层切换 + + (Lighthouse → Nimbus): + + ```bash + nimbus_beacon_node --network=holesky --web3-url=http://localhost:8545 + ``` + +------ + +#### **VI. 关键资源推荐** + +- **节点维护指南**: [EthStaker Holesky指南](https://github.com/eth-educators/ethstaker-guides) +- **验证者监控**: [Grafana仪表板配置](https://www.coincashew.com/coins/overview-eth/guide-or-how-to-setup-a-validator-on-eth2-mainnet/part-i-installation/monitoring-your-validator-with-grafana-and-prometheus) +- **故障排查**: [合并后节点FAQ](https://notes.ethereum.org/@launchpad/node-faq-merge) + +------ + +通过本工作坊的系统实践,开发者将具备独立部署和维护以太坊全节点的能力,为参与网络验证或协议开发奠定基础。建议从测试网开始,逐步过渡到主网节点运维。 ### 2025.02.13 -##### **EPF WIKI WEEK7** +##### **EPF WIKI WEEK6** From d48d249509e07f604a3b3321560fc86f0116e0b9 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 04:42:11 +0000 Subject: [PATCH 10/92] Update commit status table --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9cd114e..394a2ff 100644 --- a/README.md +++ b/README.md @@ -639,6 +639,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 87ec93134de586b63f491760e28da6e39f1ad241 Mon Sep 17 00:00:00 2001 From: ztz Date: Wed, 12 Feb 2025 13:44:22 +0800 Subject: [PATCH 11/92] Update zt2.md --- zt2.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/zt2.md b/zt2.md index 63bfd8a..226fdfb 100644 --- a/zt2.md +++ b/zt2.md @@ -251,5 +251,35 @@ CA 具有两个附加属性: (注意,区块中的单个交易执行失败,整个区块都会被打回重来) +### 2025.02.12 + +#### Bridge + +无论是智能合约还是以太坊,其根本是建立在一个个的节点(node)之上,依靠节点上 EVM 虚拟机的计算能力实现上层业务逻辑的构造。 + +其缺陷在于,无论智能合约逻辑有如何复杂,但它永远只能够在以太坊钩织的数据里漫游而无法接触到以太坊网络以外的数据,因为 EVM 限制其获取以太坊网络以外的数据,如互联网数据。 + +脱离了外部世界的以太坊合约是不完整的,而“桥”则是一个构建起外部世界与以太坊世界数据流通的通道。 + +运行了 bridge 的服务,可以通过主动向以太坊链上的合约 push 外部世界的数据,从而完成外部数据上链的工作,这样,以太坊网络中,就存在了外部世界的数据,这通常维护在某个智能合约中。 + +![image](https://github.com/user-attachments/assets/2075b70e-4bb8-40b8-a0c3-7ee7ae4ba66f) + +同样,如果某个服务能够将两个链的数据进行互通,则也可以视作一种桥:Blockchain Bridges + +![image](https://github.com/user-attachments/assets/2ed7c94c-3782-4d36-b15b-17a3b0f538d3) + +这里就引入了另一个概念,预言机(Oracle):区块链预言机是位于以太坊与外部世界之间的实体,负责在两者之间传递信息。 + +预言机一般包括: + +- Oracle 智能合约部分:存在于以太坊中的代码,处理请求并协调内部与外部客户端之间的交互。 +- Oracle 外部接口(节点):与以太坊进行通信的计算机和服务器。节点是能够进行极其快速且低成本计算的中心化实体。它们还连接到外部数据源,并可以将这些数据发布到链上。 + +![image](https://github.com/user-attachments/assets/ea77b6ba-dfc6-4fa8-8d3b-4cc25fcfd002) + +预言机解决方案:[Chainlink](https://chain.link/): + +image From 531971c7aa6d0319bf4abd9e3fcd6e9e520f4372 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 05:44:38 +0000 Subject: [PATCH 12/92] Update commit status table --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 394a2ff..d7812b0 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | armada2013 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | realgu | ✅ | ✅ | ⭕️ | ✅ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | | Eizz0 | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | -| kernel1983 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| kernel1983 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | JC13043DB | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | | GuoyangLiu24 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | cooper | ⭕️ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ✅ | | | | | | | | | | | | | | | | | | | @@ -162,7 +162,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | liuxulife | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | | CHENFANGC | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | ppatrick007 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | -| zt2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| zt2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | yiwen4 | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | affe | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | dundun930326 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | @@ -640,6 +640,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 2b53131fc17b2133f694b0b8f9ce6595ddbf6583 Mon Sep 17 00:00:00 2001 From: d1xia <667070+dixia@users.noreply.github.com> Date: Wed, 12 Feb 2025 13:20:35 +0700 Subject: [PATCH 13/92] 12 Feb 2025 --- dixia.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/dixia.md b/dixia.md index 160bd31..ce13618 100644 --- a/dixia.md +++ b/dixia.md @@ -92,7 +92,7 @@ actually once is a validator is chosen to be a proposer, it can know therefore i https://www.paradigm.xyz/2023/04/mev-boost-ethereum-consensus https://epf.wiki/#/eps/week3 - + ### 2025.02.11 @@ -103,3 +103,9 @@ still not sure why a committe concept is needed after watch all these video PoW consensus use economic (hash power) to reach consensus which looks a lot simpler. Through it does give entity who has most computing power an advantage so it is more close to "real" economy where PoS could at certain time depeg from real economy power. As long as stakeholder/token holder has a little real world economy power(pay for server and bandwdith). (eth will have price but it is less impact by commodity price such as electricity ) it is easier to develop as independent set of stakerholders on its own economy compare to Bitcoin i.e. if someone is very good at investing/trading, he or she could acquire ether at lower price. But you alway need to pay for a market price for electricity. PoW resets the game each time but does make bitcoin's opeartion more close to "real world" + +### 2025.02.12 + +fork choice rule == LMD GHOST + + \ No newline at end of file From 5736813bb5026d57fe5f1d079bba0a1c57fd5e9e Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 06:21:42 +0000 Subject: [PATCH 14/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d7812b0..99d9efb 100644 --- a/README.md +++ b/README.md @@ -172,7 +172,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | ALiangNe | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | tienshaoku | ✅ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | | tannerang | ✅ | ⭕️ | ✅ | ⭕️ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | -| dixia | ✅ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | +| dixia | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | dajuguan | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | | timfaner | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | JeasonZhang | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | @@ -641,6 +641,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From d0240311811b133469b3a5e6ee0b3321e4b7fb67 Mon Sep 17 00:00:00 2001 From: H Jiang Date: Wed, 12 Feb 2025 15:31:59 +0800 Subject: [PATCH 15/92] 2.12 --- rectinajh.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rectinajh.md b/rectinajh.md index fdf3080..a4136bd 100644 --- a/rectinajh.md +++ b/rectinajh.md @@ -37,4 +37,7 @@ https://epf.wiki/#/wiki/protocol/history 今天学习执行层数据规范最初被指定是根据黄皮书来设计的 https://epf.wiki/#/wiki/EL/el-specs +### 2025.02.12 +今天学习执行层客户端的架构设计 +https://epf.wiki/#/wiki/EL/el-architecture From 13964e45f211e2d4690de3b79d8673aae26a9639 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=AE=E7=BD=97=E5=88=97=E5=A1=94=E5=88=A9=E4=BA=9A?= =?UTF-8?q?=E7=89=B9?= <31700009+zhouCode@users.noreply.github.com> Date: Wed, 12 Feb 2025 16:29:05 +0800 Subject: [PATCH 16/92] Update zhouCode.md --- zhouCode.md | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/zhouCode.md b/zhouCode.md index eef0800..660a2fd 100644 --- a/zhouCode.md +++ b/zhouCode.md @@ -541,7 +541,7 @@ func build(env Environment, pool txpool.Pool, state state.StateDB) (types.Block, ### 2025.02.11 -#### Study Group 2024 week3 学习 +#### Study Group 2024 week4 学习 #### 以太坊测试与安全 @@ -577,4 +577,46 @@ func build(env Environment, pool txpool.Pool, state state.StateDB) (types.Block, - 发现漏洞后通过[以太坊漏洞赏金计划](https://bounty.ethereum.org/)提交,最高可获得25万美元奖励。 - 公开披露需在修复后进行(参考[历史案例库](https://github.com/ethereum/eth-sec))。 +### 2025.02.12 + +#### Study Group 2024 week5 学习 + +#### **合并(The Merge)** + +- 以太坊从工作量证明(PoW)转向权益证明(PoS)的重要性,信标链(Beacon Chain)的启动与合并后的经济安全性提升。 +- 最终性(Finality)概念的引入(12.6分钟完成区块最终确认)。 +- 签名聚合(Signature Aggregation)和秘密领导者选举(Whisk协议)的研究进展。 + +#### **激增(The Surge)** + +- **数据可用性采样(DAS)**: 通过多项式承诺(如KZG)实现高效数据验证,支持Rollup扩展。 +- **EIP-4844(Proto-Danksharding)**: 引入“Blob”存储结构,降低Rollup数据成本,已上线主网。 +- **Rollup分类**: 乐观Rollup与零知识Rollup的对比,强调数据可用性对挑战机制的重要性。 + +#### **The Scourge** + +- **提议者-构建者分离(PBS)**: 减少验证者中心化风险,通过MEV-Boost临时方案过渡到协议内实现。 +- **最大有效余额(Max EB)**: 从32 ETH提升至2048 ETH,优化验证者效率。 +- **流动性质押(Liquid Staking)**: 探索降低罚没风险的新机制(如质押上限)。 + +#### **验证(The Verge)** + +- **Verkle树**: 取代Merkle树,实现更高效的轻客户端验证和状态证明,支持无状态验证。 +- **ZK化(ZK-SNARKs)**: 未来将共识层和执行层交易验证集成零知识证明,提升可扩展性。 + +#### **清洗(The Purge)** + +- **历史过期(EIP-4444)**: 节点不再存储超过1年的历史数据,依赖Portal Network等去中心化存储方案。 +- **状态简化**: 移除旧版协议支持(如RLP序列化),向SSZ过渡。 + +#### **挥霍(The Splurge)** + +- **账户抽象(ERC-4337)**: 支持智能合约钱包,实现社交恢复、批量交易等高级功能。 +- **EVM优化(EOF)**: 提升EVM兼容性,支持模块化升级。 +- **加密创新**: 全同态加密(FHE)、一次性签名(One-Shot Signatures)等前沿研究。 + +#### 其他关键讨论 + +- **量子抗性**: 长期规划中替换BLS签名,采用抗量子算法(如STARKs)。 +- **路线图复杂性**: 未来可能面临协议僵化(Ossification)风险,需平衡创新与稳定性。 From 707c3cb91ccf595d4cbd92130cde7d7602298630 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 08:29:28 +0000 Subject: [PATCH 17/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 99d9efb..97057e4 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | Henry | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | | d0d0d9 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | henryleo | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | -| zhouCode | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| zhouCode | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | mrmign | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | ghx1104 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | Coooder-Crypto | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | @@ -642,6 +642,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 9464ee70d46d5bf7411860c5f11511b59e5ad49e Mon Sep 17 00:00:00 2001 From: chenfang Date: Wed, 12 Feb 2025 17:35:08 +0800 Subject: [PATCH 18/92] feat: 20250212 note --- CHENFANGC.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHENFANGC.md b/CHENFANGC.md index d40a3e5..90ea742 100644 --- a/CHENFANGC.md +++ b/CHENFANGC.md @@ -172,4 +172,12 @@ EOA 可以发起交易,交易类型包括: 包括计算机、数学、密码学、算法、编程、网络、分布式系统和区块链、安全、终端、shell 脚本和版本控制…… (学不完,看不懂 T.T……今天工作量大,没有看视频啊) +### 2025.02.12 + +### 以太坊和形式化验证 + +- 协议验证、智能合约验证 + +安全和活跃的保证是以太坊去中心化基础设施的核心。形式化验证在验证以下各项的正确性方面起着关键作用 + From c741b5aa5e328ed36e5e145db7baab8d83376f43 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 09:38:47 +0000 Subject: [PATCH 19/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 97057e4..6a1c2d9 100644 --- a/README.md +++ b/README.md @@ -160,7 +160,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | Lvista | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | lanpan999 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | liuxulife | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | -| CHENFANGC | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| CHENFANGC | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | ppatrick007 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | zt2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | yiwen4 | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | @@ -643,6 +643,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 54d0e9e3c4cf32cadbeba6600acffc98c7e4f10c Mon Sep 17 00:00:00 2001 From: StarryDeserts Date: Wed, 12 Feb 2025 17:57:04 +0800 Subject: [PATCH 20/92] 2025.02.12 note MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 完成打卡 ✅ --- .starrydeserts_image/Layered-Architecture.png | Bin 0 -> 163806 bytes StarryDeserts.md | 115 +++++++++++++++++- 2 files changed, 112 insertions(+), 3 deletions(-) create mode 100644 .starrydeserts_image/Layered-Architecture.png diff --git a/.starrydeserts_image/Layered-Architecture.png b/.starrydeserts_image/Layered-Architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..8a6c7b0b7561d1074904062935be09cd50c58c98 GIT binary patch literal 163806 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�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 L-dz>G2GLD5y%w9Ln`AUE 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
  • q*K+R#V)sSZ<-yKzjcf25h8Cv*B zys519UDGi%^RlIz%w@F&P1#r|R(}mp;HzW4%pa!k4yP3|AZHS20D}*E4K@LB^hwW| z>;!nfeJZV|PD$R*x6K8^R7uEnr-&(Mc>)$QqFg`y`wMVwJc(Ov51#x)#D1YWLi)r0 zjajMg)-eGmiD9w5T>hjqM(_K0%HdN_IJ?0SUtJG5&X{FEVJvzZ%#9T)htth}qHq1X z!2q4SX4Ulcw9~|wIQ8wd+M=C8%StmPFZ3o?3no$Uda1(?H7)ZAd%cI@{5yBzre=GK zocy^4vW`w%aLHdOiVjUj4}@HB`NHx8BlAxERl7893VpT0uTJ*(N=;w7wqK$wDJsWl z!O|BKhXuFF!s|ev<)qjQhdl~Di{PzVxWuC&(G0S?hyXbmk3z|<#YV*f+*m@Lo_)&g zSFDlzM7sje79Jp`wR$8-JwiUC9H;Q0|GvfdQ}f@`#TsDieo>_SfvgT; zw03?ITLV!X*%qkBx&Hp0K?& za8p-wwv3!fRxzARf|b*G=S_O@Di-ji@u;aTrgGkU3C-&P79CM zVNNYJq|HKE^%I9p)Fs!8F!7%u8qv{8I_A{2DXGF+0#jnK;yqHrWiV|u*g8bBomQl~ z^L(>?t7^+$K&uBby>m~?fwZj-(Xc$pPh}V={LW5Hw8Tn{5w@6AQWMJ z1McF0&APqUcB!0sB~q-=G(#y*n$xIl)-oEx@CsZ{U-(}7@P1p0<#+?~_}ts$&9Ks5 zi>mF^rptm2h0XP#Ly~zP>0*fKyvkG|8ZNWnUfB{NO#%NSoG((RPG);O*7;SX$w_8b zGu6sN5I&O<6^1*XNb!(!TBGKDi7<0iY=G?G)SE^MLskljEBKn?HQ2bgN1rN@C$ZNbg zQWwxl@q%lr%4vN9y?(A+9!Irk!8IYJOl#7ooeT$l!rBa+o^QhsXFmB9tu3{{=@^yJ+jTzU+fE?bs zx1)w30>=G@-~5)tpij5CBM;5_6k`JPN6QkPU1DHizY&NQ1U$gX* z<(ia`p$rmtq$0jj zTn&#Tuzz&&rm>l!F&9t~u5)ioe<*qE&@D{+%UgOR9N(sJgsEG6rsG$a(AoCacSNDD z$@10TI1nnk5tvd`!~FX<4?{Or&oZeoo4aQS<`(kCoG=N6ItZ+bDcoUMo+vI`f&^sMK^ z+OY|BdV>~3GR^U(wd(ONeBu<~o~@Snx}~f`ndv7G3R%eY6GuyezK9NZ2+aTN5_tqa_PJ zFL5gt7d<~#JZW!%T=wT{>oP1Yzdqz?KL#VRkgJ0|k0n;oN5&&9jgvO`WK3J-zc(vE z{5?P3imAPn--VJr=^MpKyf;Ch1Rnhn$-cM-^h|_Lfw_ar5V7#Rt@GU=JDA^QPlf2` zOS-3k^65oo^2fdPyxl)3CJOB7!2Enk4occXTEpr#`%DpjO)RZv_s27!b@>SN16*?# zUcKF8>ULiSP}&{;JLveeBl*if(8csTx{dZ3EU*-LQlTSzV>kR#GG2fhFMWQMy$&rP8RUpz;e8!+{JSU{!uFi#&zBCIAZ&Yta;4kf`UDFmwf?v#Tlx9& q|Bn0rj(fjQ{GW9H|Ie6g`Kyjm-0(Q}RFMGuyQZXZrBKl-@c#jqM=`Ac literal 0 HcmV?d00001 diff --git a/StarryDeserts.md b/StarryDeserts.md index 241e2db..46f2069 100644 --- a/StarryDeserts.md +++ b/StarryDeserts.md @@ -396,9 +396,7 @@ timezone: Pacific/Auckland # 新西兰标准时间 (UTC+12) ------ -##### **代码示例** - -### **R代码:基础费用模拟** +##### **R代码:基础费用模拟** ```R calculate_base_fee_per_gas <- function( @@ -423,4 +421,115 @@ calculate_base_fee_per_gas <- function( } ``` + + +### 2025.02.12 + +#### 以太坊执行层架构(第1天) + +------ + +##### **客户端架构概览** + +###### 核心职责 + +1. **区块链数据验证与存储** + - 维护本地区块链副本 + - 通过默克尔树验证数据完整性 +2. **网络通信** + - 使用DevP2P协议进行点对点通信 + - 交易池(mempool)管理 +3. **共识层协作** + - 实现Engine API接口 + - 响应`forkChoiceUpdated`和`newPayload`调用 + +##### 分层架构 + +Layered-Architecture + +------ + +##### **EVM设计原理** + +###### 虚拟机核心特征 + +- **硬件无关性** + 通过`EVM字节码`实现跨平台一致性,类似JVM设计理念 +- **沙盒环境** + 每个交易在隔离环境中执行,保证状态变更原子性 + +###### 三明治复杂性模型 + +1. **外层(简单)** + - Solidity/Yul等高级语言 + - JSON-RPC接口 +2. **中间层(复杂)** + - 编译器(Solidity→EVM字节码) + - Gas计量系统 +3. **内层(简单)** + - EVM指令集(约140个操作码) + +------ + +##### **状态管理机制** + +###### 全局状态组成 + +| 组件 | 存储内容 | 数据结构 | +| -------- | ----------------------- | --------------- | +| 账户状态 | 余额/Nonce/合约代码哈希 | Merkle-Patricia | +| 合约存储 | 智能合约变量数据 | Merkle-Patricia | +| 交易收据 | 交易执行日志 | Bloom Filter | + +###### 状态转换公式 +$$\sigma_{t+1} \equiv \Upsilon(\sigma_t, T)$$ + +- $$\sigma_t$$: 当前状态 +- $$T$$: 交易集合 +- $$\Upsilon$$: 状态转换函数 + +------ + +##### **交易生命周期** + +###### 处理流程 + +1. **接收** + 通过JSON-RPC接口接收签名交易 +2. **验证** + - 签名有效性 + - Nonce连续性 + - Gas预算充足 +3. **传播** + 通过DevP2P协议广播至全网节点 +4. **打包** + 被矿工/验证者选入候选区块 +5. **执行** + 在EVM中触发状态转换 + +###### Gas计算模型 +$$\text{总Gas成本} = \text{固有成本} + \sum(\text{操作码Gas} \times \text{执行次数})$$ + +------ + +##### **网络层(DevP2P)** + +###### 关键协议 + +| 协议 | 功能 | 传输内容 | +| ------ | ------------ | ------------- | +| eth/66 | 区块同步 | 区块头/体数据 | +| eth/67 | 交易传播 | 原始交易数据 | +| les/4 | 轻客户端支持 | 状态证明 | + +###### 节点发现机制 + +1. 使用Kademlia DHT协议 +2. 通过ENR记录存储节点元数据 +3. 维护动态路由表(Bucket结构) + + + + + From 2389180100f008f87e87656380a3b0fa83a091c6 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 09:59:09 +0000 Subject: [PATCH 21/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6a1c2d9..b2bc004 100644 --- a/README.md +++ b/README.md @@ -124,7 +124,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | passer-byzhang | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | StillFantastic | ⭕️ | ✅ | ⭕️ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | | debugzhao | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | -| StarryDeserts | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| StarryDeserts | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | KieSun | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | | k66 | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | DVDguzhou | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | @@ -644,6 +644,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From d763d9e8cf5bafd8a9e7b682c94b3c484a2a30e1 Mon Sep 17 00:00:00 2001 From: Helios <131566676+HeliosLz@users.noreply.github.com> Date: Wed, 12 Feb 2025 18:30:13 +0800 Subject: [PATCH 22/92] Update HeliosLz.md --- HeliosLz.md | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) diff --git a/HeliosLz.md b/HeliosLz.md index c8eb137..bea409e 100644 --- a/HeliosLz.md +++ b/HeliosLz.md @@ -353,5 +353,155 @@ Week 1 | Protocol Intro * 由于以太坊协议的不断发展和多样化的客户端实现,测试成为确保网络安全的重要环节。测试工具包括 状态转换测试、模糊测试 和 RPC 测试 等,确保网络升级和新功能的稳定性。 +### 2025.02.12 + +**学习小组第二周 | 执行层(Execution Layer)** + +预读材料: + +节点和客户端 + +1. 节点(Node) + +在以太坊网络中,节点是任何参与网络的计算机系统,负责验证交易、维护区块链状态并传播信息。节点根据其角色和功能,可以分为几种类型: + +1.1 全节点(Full Node) + +全节点是最重要的节点类型,它存储并验证整个区块链的历史数据。全节点会下载并验证所有的区块和交易,确保每个区块都符合以太坊协议的规则。全节点负责: + +* 存储整个区块链数据(包括所有交易、区块头等)。 +* 验证每个新块是否符合共识规则。 +* 参与网络中的共识过程,帮助确保链的安全性。 +* 执行和验证每个交易(执行层部分)。 + +全节点有助于去中心化,因为它们不依赖于第三方进行数据验证。 + +1.2 轻节点(Light Node) + +轻节点不保存完整的区块链数据,而是只存储与当前活动相关的数据。这使得轻节点在资源消耗上比全节点低。轻节点通过与全节点连接来获取区块头和必要的数据。它们的主要特点是: + +* 只保存区块头,不存储完整的交易和状态数据。 +* 依赖全节点提供交易的验证结果。 +* 适用于需要低资源消耗的场景,例如手机钱包和轻量级应用。 + +轻节点的工作效率较高,但需要与其他全节点交互来验证交易和区块。 + +1.3 归档节点(Archive Node) + +归档节点是全节点的一种特殊类型,它不仅存储整个区块链的数据,还存储每个区块和交易的所有历史状态。归档节点的作用是提供历史数据查询的功能,特别适用于需要审计或历史数据的情况。归档节点的特点是: + +* 存储所有区块和交易的完整历史。 +* 提供完整的状态数据,可以查询历史时刻的状态。 +* 存储所有的帐户余额、智能合约数据等详细信息。 + +归档节点一般用于开发、分析和区块链数据分析场景,不常见于普通的以太坊网络使用。 + +2. 客户端(Client) + +客户端是与以太坊网络交互的软件,负责与其他节点进行通信,并执行相关任务,如发送交易、验证区块、同步状态等。每个客户端实现了以太坊协议的不同部分,具体有多个实现版本。客户端主要负责: + +* 与其他节点建立连接。 +* 获取、验证和处理区块和交易。 +* 与执行层、共识层以及网络层交互。 + +2.1 不同类型的客户端 + +以太坊有多个客户端实现,每个客户端都遵循相同的协议标准(以太坊协议),但是其内部实现可能有所不同。常见的以太坊客户端包括: + +* Geth(Go-Ethereum):这是最广泛使用的客户端之一,采用 Go 编程语言编写。Geth 提供了完整的以太坊节点功能,包括全节点、轻节点和矿工功能。它支持以太坊的主网、测试网和私人链。 +* Besu:这是一个由 Hyperledger 项目支持的以太坊客户端,采用 Java 编写。Besu 主要面向企业和企业级解决方案,支持以太坊 1.x 和 2.x。 +* Nethermind:另一个以太坊客户端实现,采用 C# 编写,注重性能和对 .NET 环境的支持。 +* OpenEthereum(以前的 Parity):这个客户端采用 Rust 编写,旨在提供高性能和轻量级的以太坊实现。它通常用于高效的交易处理和运行。 +* Lighthouse、Prysm、Nimbus:这些客户端是以太坊 2.0 的实现(即信标链客户端),它们实现了以太坊的共识层,用于支持以太坊的 PoS(权益证明)机制。 + +2.2 客户端的功能 + +客户端根据其类型和功能,承担着不同的职责: + +* 执行层(EL)客户端:处理交易的执行和状态更新。它通过虚拟机(EVM)执行每个交易,并更新状态树(state trie)。Geth、Besu 和 OpenEthereum 都是典型的执行层客户端。 +* 共识层(CL)客户端:与 PoS(权益证明)机制相关,负责维护和验证信标链(Beacon Chain)的状态。共识层客户端如 Prysm、Lighthouse 和 Nimbus 是以太坊 2.0 的组成部分。 +* P2P 网络层客户端:负责与其他节点进行通信,传播区块和交易。通过开发 P2P 协议,节点能够有效地传播信息并同步状态。 + +2.3 客户端交互 + +客户端通过以下方式与以太坊网络和其他节点进行交互: + +* JSON-RPC:客户端通过 JSON-RPC 接口与网络中的其他节点交互。这些接口包括发送交易、查询区块、获取节点信息等常见操作。 +* Gossip协议:节点通过 gossip 协议传播交易和区块。每当一个节点接收到新的区块或交易时,它会将其传递给其他连接的节点,确保网络中的每个节点都能同步。 +* Snap Sync:这种同步机制允许节点快速同步整个链的状态,它通过下载和应用块和状态的增量更新来实现高效的同步。 + + +以太坊:机制(基于这些幻灯片的讲座也可以在 YouTube 上观看:《以太坊执行层概述 - Dan Boneh》) + +1. 执行层概述 + +现实生活类比:银行的交易系统 + +想象你在一个银行账户中进行资金转账。这就类似于以太坊中的交易和状态更新。当你发起转账时: + +* 银行系统需要验证你的账户余额是否足够(类似于以太坊检查交易是否合法)。 +* 然后,它会执行转账操作,将资金从一个账户转移到另一个账户(类似于以太坊执行交易并更新状态树)。 +* 最后,银行系统更新你的账户余额,并将这次交易记录保存下来(类似于以太坊更新区块链的状态)。 + +2. 区块验证 + +现实生活类比:交易验证和审核 + +假设你去银行办理转账,银行会进行一系列的检查: + +* 交易验证:检查你是否有足够的余额,转账金额是否合理,接收人的账户是否有效等。 +* 状态更新:银行会根据验证结果,更新你的账户余额,并在系统中保存这次交易。 + +在以太坊中,每个区块都包含一组交易,执行层会逐一验证这些交易是否合法(如检查签名、余额、时间戳等)。如果某个交易不合法,整个区块会被拒绝。 + +3. EVM:以太坊虚拟机 + +现实生活类比:计算机处理器 + +以太坊虚拟机(EVM)类似于银行后台的计算机系统。每笔交易就像一条指令,EVM 就是执行这些指令的计算机处理器。每一条指令(如“转账”或“调用智能合约”)都会消耗一定的计算资源(类似于银行系统消耗资源处理转账)。EVM 会逐步执行这些指令,并更新状态。 + +4. Gas 机制 + +现实生活类比:交易手续费 + +当你去银行办理转账,银行通常会收取一定的手续费。这个手续费的多少取决于你转账的金额和银行的费用政策。以太坊中的 Gas 费用类似于这个手续费,它是执行交易和合约的代价。 + +* 比如,当你转账时,银行会检查你支付的手续费是否足够覆盖银行的成本,确保它能够处理你的请求。同样,以太坊会检查你支付的 Gas 是否足够覆盖执行交易的成本。 + +5. EIP-1559 费率机制 + +现实生活类比:动态收费系统 + +假设你在不同的时段去银行,银行可能会根据拥挤程度调整手续费:比如在高峰时段,手续费可能会增加;在低谷时段,手续费可能会降低。这类似于以太坊的 EIP-1559 机制,它通过动态调整“基础费用”(base fee),使得交易费用在网络负载较高时增加,负载较低时减少,从而确保交易的可预测性。 + +6. 状态转换函数(State Transition Function) + +现实生活类比:银行账单 + +当你进行交易时,银行系统会根据你的转账记录更新你的账单状态。这个过程就像以太坊中的状态转换函数。每一笔交易都改变了账户的状态(余额),并更新到系统中。状态转换函数确保每个账户的余额和状态正确。 + +7. 节点类型 + +现实生活类比:银行不同的服务 + +* 全节点(Full Node):就像银行的总账户系统,保存了所有的交易记录和账户信息,任何人都可以查询到所有的账单和历史交易。 +* 轻节点(Light Node):类似于银行的客户应用,你不需要保存所有的历史账单,只需要知道你自己的账户余额和最近的交易。 +* 归档节点(Archive Node):相当于银行的历史档案系统,专门用来存储所有的历史交易记录,可以查询过去很久以前的转账和交易信息。 + +8. P2P 协议:节点之间如何沟通 + +现实生活类比:银行之间的消息传递 + +当你在一个银行账户进行转账时,可能需要通过不同的银行进行资金转移。这就像以太坊的 P2P 协议,银行之间需要互相传递消息,确认转账的详细信息。在以太坊网络中,节点之间也通过 P2P 协议进行数据交换,确保每个节点都能得到最新的区块信息和交易。 + +9. Snap Sync + +现实生活类比:银行的实时更新 + +当你登录银行账户时,银行会迅速同步你最新的账户信息。这就像以太坊的 Snap Sync,它能确保节点快速同步最新的区块链状态,以便他们可以更快地验证和执行交易。 + +* 阶段 1:类似于银行下载最新的账户和交易数据。 +* 阶段 2:类似于银行确保所有账户信息和交易记录没有被篡改或遗漏。 + From 23e6aa307cefd4f7db54a98a82c0b356fb3fb95c Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 10:30:29 +0000 Subject: [PATCH 23/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b2bc004..18d7282 100644 --- a/README.md +++ b/README.md @@ -119,7 +119,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | hotoo | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | | JoscelynFarr | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | cherry-yl-sh | ✅ | ⭕️ | ⭕️ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | -| HeliosLz | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| HeliosLz | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | lllapland | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | passer-byzhang | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | StillFantastic | ⭕️ | ✅ | ⭕️ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | @@ -645,6 +645,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 3d04284b77f07f1d032f0c319a9f0bfff394cdcb Mon Sep 17 00:00:00 2001 From: Zaki <140870617+marvelshan@users.noreply.github.com> Date: Wed, 12 Feb 2025 19:17:07 +0800 Subject: [PATCH 24/92] Read: Besu and Reth --- marvelshan.md | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/marvelshan.md b/marvelshan.md index 3b5e6c6..bc01a63 100644 --- a/marvelshan.md +++ b/marvelshan.md @@ -588,6 +588,77 @@ EELS 則是構建在執行層上的規範,可以用於運行測試,驗證新 ### 2025.02.12 +#### Besu +- **私密交易**:僅限於部署或調用智能合約,無法進行 Ether 轉帳。 +- **私密智能合約**:只有指定的參與方節點可以讀取和寫入合約內容。 +- **應用場景**:適用於聯盟鏈中,特定企業之間的隱私保護需求,例如投票系統。 + +- 基本知識 + - **Ethereum 智能合約**:智能合約是可編程的區塊鏈協議,用於執行合約條款。 + - **Ballot 智能合約**:一個投票合約範例,包含投票權分配、投票、查看結果等功能。 + - **Besu 私密智能合約**:與一般智能合約的區別在於,只有參與方節點可以操作合約。 + +- Besu 私密交易參數設定 + - **PrivateFrom**:發起方的公鑰。 + - **PrivateFor**:參與方的公鑰列表。 + - **Payload**:智能合約的操作數據,編碼為 16 進位字串。 + - **GasLimit**:交易所需的 Gas 上限。 + - **Nonce**:交易序號,確保交易唯一性。 + +- 發佈私密智能合約 + - **步驟**: + 1. **定義候選人名單**:例如 `["Alice", "Bob", "Kevin"]`。 + 2. **型態轉換**:將候選人名單轉換為智能合約所需的 `[32]byte` 格式。 + 3. **參數打包**:使用 ABI 打包合約的建構函數參數。 + 4. **產生 Payload**:將合約的 Bytecode 與打包後的參數結合。 + 5. **產生 Private Raw Transaction**:使用 `NewContractCreation` 創建交易。 + 6. **發佈合約**:透過 `eea_sendRawTransaction` 發佈合約,並取得合約地址。 + +- 寫入私密智能合約 + - **賦予投票權**: + - 使用 `giveRightToVote` 函數,賦予特定帳戶投票權。 + - 打包參數並產生 Payload,發送私密交易。 + - **投票**: + - 使用 `vote` 函數,進行投票。 + - 打包參數並產生 Payload,發送私密交易。 + +- 讀取私密智能合約 + - **查看投票結果**: + - 使用 `winnerName` 函數,查看當前最高票的候選人。 + - 透過 `priv_call` RPC 方法讀取合約數據。 +--- +#### Reth + +1. **Reth 使用 MDBX 作為主要的資料庫** + - MDBX(Lightning Memory-Mapped Database Extended)是一個高效能、低開銷的鍵值存儲系統,專門設計來處理高並發讀寫操作。 + - Reth 透過一層 **抽象(abstraction)**,讓底層存儲層具有靈活性,未來若要更換 MDBX,變更的成本可以降到最低。 + +2. **Codecs(編碼/解碼)** + - Reth 透過 **Compact Trait** 來進行數據壓縮,比如: + - 壓縮 **無符號整數(unsigned integers)** 的前導 0 + - 優化存儲 **區塊頭(headers)、訪問列表(access-lists)** 等數據 + +3. **DB Abstractions(資料庫抽象層)** + - **Database Trait** + - 提供 **唯讀** 或 **讀寫** 交易的基本 API,讓 Reth 操作底層數據時不需要直接依賴 MDBX,而是透過這一層抽象來與資料庫交互。 + + - **Cursor(游標)** + - 用於 **遍歷資料庫**,提高查詢和計算效率。 + - **特點**: + - 適用於 **Merkle Root 計算**,因為連續存取數據比隨機讀取快得多。 + - 在寫入大量數據時,**先排序再寫入** 會大幅提升性能,游標可以幫助我們更有效地管理這個過程。 + +**Reth執行擴展(ExEx):** + +Reth引入了執行擴展(Execution Extensions,簡稱ExEx),這是一個框架,用於構建高性能和複雜的鏈下基礎設施作為執行後掛鉤。可用於實現Rollup、索引器、MEV機器人等,與現有方法相比,代碼量減少了10倍以上。這使得開發人員能夠以標準化的方式構建可重用的ExEx,類似於Cosmos SDK模組或Substrate Pallets的工作方式。 + +參考: + +[如何透過 Private Transaction 操作 Hyperledger Besu 私密智能合約](https://medium.com/bsos-taiwan/how-to-use-besu-private-smart-contract-51e33c5b6d62) + +[Paradigm:介紹 Reth 執行擴充(ExEx),建構高效能的鏈下基礎設施](https://web3caff.com/zh_tc/archives/103079) + +### 2025.02.13 From 07dcdcf896a591ddbc5f5befdcc4e6261abc6d41 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 11:18:09 +0000 Subject: [PATCH 25/92] Update commit status table --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 18d7282..72dcdd1 100644 --- a/README.md +++ b/README.md @@ -101,7 +101,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | Name | 2.06 | 2.07 | 2.08 | 2.09 | 2.10 | 2.11 | 2.12 | 2.13 | 2.14 | 2.15 | 2.16 | 2.17 | 2.18 | 2.19 | 2.20 | 2.21 | 2.22 | 2.23 | 2.24 | 2.25 | 2.26 | 2.27 | 2.28 | 3.01 | 3.02 | | ------------- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | -| brucexu-eth | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| brucexu-eth | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | PayFv | ⭕️ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | | chloezhu010 | ✅ | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | coratann | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | @@ -140,7 +140,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | Amberrrrrr | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | | yahsinhuangtw | ✅ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | | 0xKarl98 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| marvelshan | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| marvelshan | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | rogers3333 | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | deporter | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | LouisTsai-Csie | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | @@ -646,6 +646,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From f53138e2350f594364878756b3095e17bed190d8 Mon Sep 17 00:00:00 2001 From: Phoebe <51879065+Phoebe-dot@users.noreply.github.com> Date: Wed, 12 Feb 2025 19:40:45 +0800 Subject: [PATCH 26/92] Update phoebe-dot.md --- phoebe-dot.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phoebe-dot.md b/phoebe-dot.md index 4ea9c48..17b03a2 100644 --- a/phoebe-dot.md +++ b/phoebe-dot.md @@ -63,7 +63,7 @@ Note ### 2025.02.12 -Note +向AI 老师请教了一下关于ZK技术的底层逻辑,好难理解啊,是怎么把中文组成这样让人看不懂的句子的 😎 慢慢理解吧 大脑吸收需要时间 ### 2025.02.13 From 88fc3959e9687b0d0de6b12425bb99c4903cec52 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 11:41:04 +0000 Subject: [PATCH 27/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 72dcdd1..a7ebba3 100644 --- a/README.md +++ b/README.md @@ -177,7 +177,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | timfaner | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | JeasonZhang | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | LikKee | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| phoebe-dot | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | +| phoebe-dot | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ✅ | | | | | | | | | | | | | | | | | | | | PubYuCHe | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | ✅ | | | | | | | | | | | | | | | | | | | | | evanwu | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | lknxt1995 | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | @@ -647,6 +647,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 7fe468885d8cda45990627d5497eda4df027de3a Mon Sep 17 00:00:00 2001 From: Chloe Zhu <157523999+Chloezhu010@users.noreply.github.com> Date: Wed, 12 Feb 2025 13:23:58 +0100 Subject: [PATCH 28/92] Update chloezhu010.md --- chloezhu010.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/chloezhu010.md b/chloezhu010.md index 2ffa977..132c031 100644 --- a/chloezhu010.md +++ b/chloezhu010.md @@ -175,5 +175,30 @@ timezone: Europe/Berlin - Discv5: the discovery protocol - a kademlia based DHT to store ENR records - ENR (ethereum node record) contain routing info to establish connections between peers +### 2025.02.12 +- Pros Cons of Account vs UTXO + - Account: How it works in high level + - the blockchain maintains a global state composed of accounts + - each account has a balance (in smart contract, storage and code) + - tx directly modify the state of these accounts + - UTXO: How it works in high level + - the blockchain tracks unspent tx outputs + - a UTXO represents a chunk of crypto that has been created as an output of a tx, but has not yet been spent + - tx consume existing UTXO and create new ones + - Comparison + | | Account-based | UTXO-based | + | -------- | ------- | ------- | + | state representation | global state of accounts & balances | set of unspent tx outputs | + | tx logic | directly modify account balance | consume UTXOs and create new ones | + | complexity | easier for dev, esp. for smart contractss | more complex for devs, esp. for advanced logic | + | parallelizability | limited, as txs modifying the same account must be processed sequentially | high, as independent UTXOs can be processed in parallel | + +- Why MTP then Verkle tree +- What's RLP? What's its purpose? +- What's SSZ? What's its purpose? + - What's union? + - What's ephemeral header? +- What's discv5? +- From efe2ce6d0961aa62f61dffbcfafa5e5edd87db76 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 12:24:14 +0000 Subject: [PATCH 29/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a7ebba3..06eb213 100644 --- a/README.md +++ b/README.md @@ -103,7 +103,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | ------------- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | | brucexu-eth | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | PayFv | ⭕️ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | -| chloezhu010 | ✅ | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| chloezhu010 | ✅ | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | coratann | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | luffythink | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | Henry | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | @@ -648,6 +648,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 6f84e7a567b0e5200a41e8f609ce1b73c3b44c53 Mon Sep 17 00:00:00 2001 From: Chloe Zhu <157523999+Chloezhu010@users.noreply.github.com> Date: Wed, 12 Feb 2025 13:24:16 +0100 Subject: [PATCH 30/92] Update chloezhu010.md --- chloezhu010.md | 1 + 1 file changed, 1 insertion(+) diff --git a/chloezhu010.md b/chloezhu010.md index 132c031..7107df4 100644 --- a/chloezhu010.md +++ b/chloezhu010.md @@ -186,6 +186,7 @@ timezone: Europe/Berlin - a UTXO represents a chunk of crypto that has been created as an output of a tx, but has not yet been spent - tx consume existing UTXO and create new ones - Comparison + | | Account-based | UTXO-based | | -------- | ------- | ------- | | state representation | global state of accounts & balances | set of unspent tx outputs | From 262ca6bd6eaccf7cf2d4504c3504987c40b58782 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 12:24:33 +0000 Subject: [PATCH 31/92] Update commit status table --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 06eb213..ee57ff7 100644 --- a/README.md +++ b/README.md @@ -649,6 +649,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From e2cf129884e90a868a7a60b42b57fefab4084939 Mon Sep 17 00:00:00 2001 From: yck Date: Wed, 12 Feb 2025 20:36:09 +0800 Subject: [PATCH 32/92] Update KieSun.md --- KieSun.md | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/KieSun.md b/KieSun.md index 3fe1657..1537bb7 100644 --- a/KieSun.md +++ b/KieSun.md @@ -297,4 +297,52 @@ EIP-7702 和 EIP-3074 共同构成了以太坊账户抽象路线图的重要组 这个提案代表了以太坊在账户抽象方向上的重要一步,将为整个生态系统带来深远的影响。[1] ``` +### 2025.02.12 + +``` +# 以太坊共识层架构总结 + +## 核心主题 +本文主要介绍了以太坊共识层(CL)的架构设计、共识机制和工作原理。 + +## 关键要点 + +### 1. 共识协议架构 +- 以太坊采用双重共识协议组合:LMD GHOST 和 Casper FFG,合称为 Gasper [1] +- LMD GHOST 主要提供活性(liveness),确保链的持续运行 +- Casper FFG 提供安全性(safety),通过定期确认来保护链 [4] + +### 2. 分叉选择机制 +- 使用分叉选择规则来帮助网络达成一致的线性历史 [1][2] +- 主要通过选择"头区块"(head block)来隐式选择一个分支 +- 所有被选择的区块必须符合协议规则且其所有祖先区块也必须有效 [2] + +### 3. 系统架构组件 +主要包含两个核心组件 [6]: +- Beacon 节点:负责协调权益证明共识,与其他节点通信 +- 验证者:需要质押32 ETH,负责在PoS系统中提议区块 + +### 4. 状态转换机制 +- 每个节点通过应用状态转换函数来更新状态 [7] +- Beacon链是基于时隙(slot)驱动的,包含以下转换: + - 每时隙转换 + - 每区块转换 + - 每纪元转换 [8] + +### 5. 系统特性 +- 在网络条件良好时同时提供安全性和活性 +- 在网络分区等问题发生时优先保证活性 +- 执行层(EL)和共识层(CL)并行运行,通过Engine-API进行通信 [6] + +## 技术亮点 +- 采用模块化设计,将共识层和执行层分离 +- 通过双重共识协议互补,在实践中取得良好效果 +- 清晰的状态转换机制确保网络一致性 [7][8] + +## 实际应用 +- 以太坊主网是生产环境的实例,管理真实的ETH +- 提供测试网络供开发者和验证者测试新功能 +- 支持多客户端实现,提高系统的多样性和稳定性 [6] +``` + From b0291e084c35b077e606f8a26e2668454273cab6 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 12:36:24 +0000 Subject: [PATCH 33/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ee57ff7..e038e44 100644 --- a/README.md +++ b/README.md @@ -125,7 +125,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | StillFantastic | ⭕️ | ✅ | ⭕️ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | | debugzhao | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | StarryDeserts | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | -| KieSun | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | +| KieSun | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ✅ | | | | | | | | | | | | | | | | | | | | k66 | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | DVDguzhou | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | armada2013 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | @@ -650,6 +650,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 3e71c46ccddca9399de593c851e5da703ba2d0ff Mon Sep 17 00:00:00 2001 From: Chloe Zhu <157523999+Chloezhu010@users.noreply.github.com> Date: Wed, 12 Feb 2025 13:45:02 +0100 Subject: [PATCH 34/92] Update chloezhu010.md --- chloezhu010.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/chloezhu010.md b/chloezhu010.md index 7107df4..93c495d 100644 --- a/chloezhu010.md +++ b/chloezhu010.md @@ -194,7 +194,21 @@ timezone: Europe/Berlin | complexity | easier for dev, esp. for smart contractss | more complex for devs, esp. for advanced logic | | parallelizability | limited, as txs modifying the same account must be processed sequentially | high, as independent UTXOs can be processed in parallel | -- Why MTP then Verkle tree +- Why MPT then Verkle tree + - MPT + - a data structure, that combines merkle tree (provide cryptographic proofs to verify the data integrity) and patricia trie (a compressed trie that stores key-value pairs) + - Verkle tree + - more advanced data structure to address the issue of MPT + - vector commitment + merkle tree, it uses vector commitment (eg. polynomial commitments) to create smaller & more efficient proofs + - Comparison + + | | MPT | Verkle tree | + | -------- | ------- | ------- | + | proof size | large (scale with tree depth) | small (constant or logarithmic) | + | efficiency | less efficient for deep trees | more efficient for deep trees | + | stateless clients | inefficient due to large proof | efficient due to compact proof | + | scalability | limited by proof size & depth | better scalability for large states | + | cryptographic basis | merkle proof (hash-based) | vector commitment (eg. polynomial) | - What's RLP? What's its purpose? - What's SSZ? What's its purpose? - What's union? From 9027e2a121839e654fa3304d24b3f0ccec31f4c9 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 12:45:19 +0000 Subject: [PATCH 35/92] Update commit status table --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e038e44..555d0fc 100644 --- a/README.md +++ b/README.md @@ -651,6 +651,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 9ef3f98713ef1943b0fcc25bcc1f7521eecb89c7 Mon Sep 17 00:00:00 2001 From: Yahsin Date: Wed, 12 Feb 2025 21:16:51 +0800 Subject: [PATCH 36/92] Update yahsinhuangtw.md --- yahsinhuangtw.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/yahsinhuangtw.md b/yahsinhuangtw.md index dc13bd3..32f017e 100644 --- a/yahsinhuangtw.md +++ b/yahsinhuangtw.md @@ -50,4 +50,16 @@ https://youtu.be/UihMqcj-cqc?si=MqL3ac9Xg30LPJmE 這裡要強調的重點是,merkle tree 在以太坊驗證資料上持續扮演重要角色。以太坊技術底層中到處都有使用到 merkle tree,主要用途是在以太坊的驗證資料方面。你要驗證有龐大的 40 gb 的 state 資料的某一塊小小的資料時,你不需要全部 40 gb 都撈出來驗證,只要一小塊 tree 的某些節點資料拿出來就可以驗證。 +### 2025.02.12 + +今日晚上殘酷學習時間,拜讀了 Nic Lin 林老師今天發表的新文章「Ethereum Pectra 硬分叉介紹」https://medium.com/taipei-ethereum-meetup/ethereum-pectra-eips-introduction-1f90f4ea25d5 + +Screenshot 2025-02-12 at 9 12 55 PM + +中間段落提到,EIP-7251: Increase the MAX_EFFECTIVE_BALANCE 這段,提及 EIP-7251 之後,質押下限(MIN_ACTIVATION_BALANCE)仍然是 32 ETH,但上限(MAX_EFFECTIVE_BALANCE)大幅調高為 2048 ETH。這裡意思是之後就可以質押 32~2048 ETH 這麼大一個範圍。 + +Screenshot 2025-02-12 at 9 12 16 PM + +還有一段提到 EIP-7702 這個改進,最關鍵的改動是,之後 EOA 可以搖身一變成合約。老師文中舉例,如果你填一個 Safe 合約地址,那你的 EOA 就會變身成為 Safe 合約。 + From 041ad5bd7c3a20827ada12f5c9825dc0dd19708d Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 13:17:07 +0000 Subject: [PATCH 37/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 555d0fc..d1ff09a 100644 --- a/README.md +++ b/README.md @@ -138,7 +138,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | chyyynh | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | frankmint2024 | ✅ | ⭕️ | ✅ | ⭕️ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | | Amberrrrrr | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | -| yahsinhuangtw | ✅ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | +| yahsinhuangtw | ✅ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | ✅ | | | | | | | | | | | | | | | | | | | | 0xKarl98 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | marvelshan | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | rogers3333 | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | @@ -652,6 +652,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 04676c5ff65db7cd8eb78755160b03bb70470889 Mon Sep 17 00:00:00 2001 From: D9 <33143119+beyond009@users.noreply.github.com> Date: Wed, 12 Feb 2025 21:57:30 +0800 Subject: [PATCH 38/92] Update d0d0d9.md --- d0d0d9.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/d0d0d9.md b/d0d0d9.md index 4a1e29e..fd76fe9 100644 --- a/d0d0d9.md +++ b/d0d0d9.md @@ -145,6 +145,29 @@ An attestation contains both an LMD GHOST vote and an FFG vote. Optimally, all [共识介绍视频](https://www.youtube.com/watch?v=5gfNUVmX3Es) +### 2025.02.12 + +#### Research and Roadmap + +[Ethereum Roadmap](https://github.com/eth-protocol-fellows/protocol-studies/blob/main/docs/eps/presentations/week5.pdf) + +##### Scourge +(very) brief overview of MEV +ePBS / Inclusion Lists / MEV Burn +Max EB, Stake capping + +##### Verge +Verkle Trees +SNARKify everything + +##### Purge +【EIP-4444](https://eips.ethereum.org/EIPS/eip-4444) +Protocol simplifications + +##### Splurge +[EIP-1559 endgame](https://ethresear.ch/t/multidimensional-eip-1559/11651) +Account Abstraction +Deep cryptography From 2d54e666baace0a85f4a686cf4cf33d24fde9ed7 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 13:57:48 +0000 Subject: [PATCH 39/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d1ff09a..7d34da4 100644 --- a/README.md +++ b/README.md @@ -107,7 +107,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | coratann | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | luffythink | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | Henry | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | -| d0d0d9 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| d0d0d9 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | henryleo | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | zhouCode | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | mrmign | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | @@ -653,6 +653,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 46debf042d88930792f504e8a981e668688c259d Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 13:59:52 +0000 Subject: [PATCH 40/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7d34da4..b70e07a 100644 --- a/README.md +++ b/README.md @@ -155,7 +155,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | jjeejj | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | buctor41 | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | | zhwindy | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | -| rectinajh | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| rectinajh | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | letsgoexplore | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | Lvista | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | lanpan999 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | @@ -654,6 +654,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 8d3fe0fb00abc776d502a400c4e88077523d001f Mon Sep 17 00:00:00 2001 From: jjeejj Date: Wed, 12 Feb 2025 22:18:28 +0800 Subject: [PATCH 41/92] jjeejj add 2025.02.12 --- jjeejj.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/jjeejj.md b/jjeejj.md index 3fcad67..42f8f69 100644 --- a/jjeejj.md +++ b/jjeejj.md @@ -104,4 +104,10 @@ timezone: Pacific/Auckland # 新西兰标准时间 (UTC+12) 4. 网络同步 5. 主要的参与者是验证者 +### 2025.02.12 + +1. Week4: 主要讲测试和安全方面 + 1. 存在很多工具,都没有用过啊,感觉有点头大 + + From 316fedc018697f752d43288861b1a0e11d7a8794 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 14:19:03 +0000 Subject: [PATCH 42/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b70e07a..48e5c3d 100644 --- a/README.md +++ b/README.md @@ -152,7 +152,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | huahuahua1223 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | dethan3 | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | Azleal | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| jjeejj | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| jjeejj | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | buctor41 | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | | zhwindy | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | rectinajh | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | @@ -655,6 +655,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 41a497757faba32ff6b2f2ee97f6fe603f38fb66 Mon Sep 17 00:00:00 2001 From: ghx1104 <123364309+ghx1104@users.noreply.github.com> Date: Wed, 12 Feb 2025 22:19:18 +0800 Subject: [PATCH 43/92] Update ghx1104.md --- ghx1104.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/ghx1104.md b/ghx1104.md index 609e673..bc75e59 100644 --- a/ghx1104.md +++ b/ghx1104.md @@ -462,4 +462,32 @@ Splurge 包含一些额外的改进,进一步提升以太坊的功能: 使用 systemd 配置客户端自动启动,结合 Prometheus 和 Grafana 进行节点监控。 +### 2025.02.12 + +#### week6 + + +1. Hsiao-Wei Wang on Consensus Specs + +Hsiao-Wei Wang 是一位在以太坊共识协议方面具有深厚经验的研究者,主要关注以太坊的共识层(Consensus Layer)。他在演讲中可能会讨论 以太坊共识规范(Consensus Specs),这涉及到如何确保网络参与者在没有中央权威的情况下达成一致,以及如何保持网络的安全性和稳定性。 + +共识规范主要包括: + • 权益证明(PoS):以太坊从工作量证明(PoW)转向 PoS 后,如何确保验证者的选举和网络的持续一致性。 + • 信标链(Beacon Chain):用于协调共识层的机制,它通过区块链上的验证者来确保网络状态的同步。 + • 区块生成和验证:如何验证交易和生成新区块,并在分布式网络中保持一致。 + +在此话题中,Hsiao-Wei Wang 可能还会讨论 共识算法的改进、安全性分析 和 网络扩展性 等问题。 + +2. Sam Wilson on EELS + +Sam Wilson 可能会讨论 EELS(Ethereum Execution Layer Security),这是一个专注于提高以太坊执行层(Execution Layer)安全性的议题。执行层处理以太坊网络中的所有交易、智能合约和计算,因此其安全性至关重要。 + +EELS 可能涉及的内容包括: + • 智能合约的安全性:确保合约执行不被恶意攻击利用。 + • 交易处理和验证:确保交易的有效性和可靠性,避免恶意交易影响整个网络。 + • 数据存储和状态管理:确保以太坊节点在处理大量数据时,仍能保持高效且安全的操作。 + • 攻击防范机制:例如防止重放攻击、闪电贷攻击等。 + +Sam Wilson 可能会讨论如何加强执行层安全性,以确保以太坊网络能够处理更多的交易负载,同时保护用户和验证者免受潜在的攻击。 + From d87fe386d2ec61883d3f5fafdf880fc0974c7da4 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 14:19:34 +0000 Subject: [PATCH 44/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 48e5c3d..91a71a5 100644 --- a/README.md +++ b/README.md @@ -111,7 +111,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | henryleo | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | zhouCode | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | mrmign | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | -| ghx1104 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| ghx1104 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | Coooder-Crypto | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | | rayjun | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | CJC824 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | @@ -656,6 +656,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From f67620ef308732e94f0fc1468cb6b485a147a077 Mon Sep 17 00:00:00 2001 From: "Oscar@JING" Date: Wed, 12 Feb 2025 22:27:24 +0800 Subject: [PATCH 45/92] 2.12 --- luffythink.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/luffythink.md b/luffythink.md index 419ab94..c6ce225 100644 --- a/luffythink.md +++ b/luffythink.md @@ -107,4 +107,14 @@ EPF 学习小组是一个实时网络研讨会式项目,由两个阶段组成 理解从 PoW 到 PoS(其中信标链充当以太坊的“共识提供者”)的转变。 +### 2025.02.12 +**学习主题:Consensus Layer Overview** +- 以太坊共识机制的演变和关键要素 + - not by block height but by Total Terminal Difficulty (TTD)。 + - 共识的挑战:核心问题是在分布于全球各地、通过不可靠的网络连接并可能受到恶意干扰的数千个独立节点之间达成协议。 + - BFT:核心理论框架,BFT 是分布式系统的一种属性,可确保即使某些组件发生故障或恶意行为,它们也能正常运行。 + - PoW 和 PoS 本身不是共识协议:它们是女巫攻击防御机制,即提高攻击者创建大量身份并压倒系统的成本的机制。两者都通过将能源或金钱置于风险之中来使经济资源面临风险。 + - LMD-GHOST 和 Casper FFG:PoS 机制支持的核心协议。 + - 新共识机制:PoS 下的共识是通过质押、验证者的证明以及随机选择区块提议者和委员会的算法来实现的,以确保网络保持安全并高效地处理交易。 + From 9b997c8e03b12db3b98747488f40a3d35efa2fc7 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 14:40:27 +0000 Subject: [PATCH 46/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 91a71a5..98b2678 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | PayFv | ⭕️ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | | chloezhu010 | ✅ | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | coratann | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| luffythink | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| luffythink | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | Henry | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | | d0d0d9 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | henryleo | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | @@ -657,6 +657,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 2104ac6f3d2dbba7bcd30e3c42b4b24693570484 Mon Sep 17 00:00:00 2001 From: LGC Date: Wed, 12 Feb 2025 22:41:52 +0800 Subject: [PATCH 47/92] feat(leo): update 2.12 --- amandakelake.md | 72 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/amandakelake.md b/amandakelake.md index 2039c16..1cd56e4 100644 --- a/amandakelake.md +++ b/amandakelake.md @@ -254,4 +254,76 @@ for fault_type in ['packet_loss', 'latency_spike', 'partition']: ``` +### 2025.02.12 +Ethereum Roadmap +``` +--- + +### **以太坊路线图概览** +路线图的目标是通过多个阶段改进以太坊的性能、扩展性和用户体验。每个阶段的核心内容如下: + +1. **Merge(合并)**: + - 从工作量证明(PoW)过渡到权益证明(PoS)。 + - Beacon Chain 的引入,支持更高效的区块验证。 + +2. **Surge(激增)**: + - 增加数据可用性以支持 Rollups(例如 Optimistic 和 ZK Rollups)。 + - 数据可用性采样(Data Availability Sampling)技术的探索,减少节点对完整数据下载的需求。 + +3. **Scourge(清除)**: + - 减少最大可提取价值(MEV)的负面影响。 + - 提议者/构建者分离(PBS)机制,减少中心化和审查风险。 + +4. **Verge(边缘)**: + - 使用 Verkle 树替代 Merkle 树,简化状态证明。 + - 支持无状态验证器(Stateless Validators),降低节点存储需求。 + +5. **Purge(净化)**: + - 简化协议,减少历史状态存储需求。 + - 引入历史数据和状态过期机制(EIP-4444)。 + +6. **Splurge(杂项改进)**: + - 包括账户抽象(Account Abstraction)、多维度 EIP-1559 费用模型、加密内存池等改进。 + - zkEVM 和零知识证明的进一步集成。 + +--- + +### **技术细节** +- **Rollups 的重要性**: + - Rollups 将以太坊 L1 数据转换为 L2 执行,提升扩展性。 + - Optimistic Rollups 和 ZK Rollups 各有优劣,前者依赖欺诈证明,后者依赖零知识证明。 + +- **Verkle 树**: + - 提供更短的状态证明。 + - 支持宽树结构(256 子节点),减少验证器对历史数据的依赖。 + +- **数据采样与 Blobspace(EIP-4844)**: + - 数据采样技术允许节点通过少量随机数据点验证数据完整性。 + - Blobspace 引入新的数据存储方式,为未来扩展铺路。 + +- **MEV 改进**: + - MEV Boost 和 PBS 的引入,减少验证者选择的复杂性。 + - 包括 MEV 燃烧和执行票据等机制。 + +- **量子安全与 STARKs**: + - 使用 STARKs 替代 KZG 承诺,提升抗量子计算能力。 + +--- + +### **未来展望** +- **账户抽象(EIP-3074 和 ERC-4337)**: + - 改善用户体验,支持 Gas 赞助、交易批处理和社交恢复。 + +- **历史和状态过期**: + - 自动删除超过一年历史的链上数据,减轻节点存储负担。 + +- **EVM 改进**: + - 引入 EVM 对象格式(EOF),为未来升级奠定基础。 + +- **深度加密研究**: + - 包括完全同态加密、一次性签名和可验证延迟函数(VDF)。 + +--- +``` + From e00c05ae7b8705fded8c649bf9bf184f5a19723a Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 14:42:24 +0000 Subject: [PATCH 48/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 98b2678..2e53ac9 100644 --- a/README.md +++ b/README.md @@ -168,7 +168,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | dundun930326 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | Echocipher | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | poyucheese | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | -| amandakelake | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| amandakelake | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | ALiangNe | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | tienshaoku | ✅ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | | tannerang | ✅ | ⭕️ | ✅ | ⭕️ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | @@ -658,6 +658,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From a578bdbb77314d42c7eb4e3f288126e1b458ac30 Mon Sep 17 00:00:00 2001 From: awsomecty <2693196915@qq.com> Date: Wed, 12 Feb 2025 22:44:25 +0800 Subject: [PATCH 49/92] Update awsomecty.md --- awsomecty.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/awsomecty.md b/awsomecty.md index e79cbe7..ce26508 100644 --- a/awsomecty.md +++ b/awsomecty.md @@ -125,5 +125,27 @@ ePBS(增强型区块提议者和构建者分离):防止交易被审查, MEV-Burn(MEV燃烧):将MEV的一部分销毁,让所有以太币持有者受益。 ET(执行票证):通过市场机制选择区块构建者,防止中心化。 IL(包含列表):确保某些交易必须被包含,防止区块构建者随意审查。 - +### 2025.02.12 +1以太坊客户端测试的重要性 +确保网络稳定性和安全性,保障客户端间一致性 +2测试内容 +执行和共识规范的遵循:测试验证所有客户端是否一致地解释和执行交易,确保符合执行和共识规范。 +预防网络分叉:严格的测试作为一种主动的漏洞检测工具,防止因客户端不一致而引发的网络分叉(对规范区块链状态的分歧)。 +测试资源和工具 +3通用测试套件 +pytest:Python测试框架。 +Ethereum Tests:适用于所有实现的通用测试。 +Hive:以太坊端到端测试工具。 +4执行层测试 +Execution Spec Tests:针对执行客户端的测试用例。 +FuzzyVM:EVM的差异模糊测试工具。 +retesteth:测试生成工具。 +EVM lab utilities:包括Go evmlab(受EVMLAB启发的EVM实验室)以及执行API的集合。 +5共识层测试 +Consensus Spec Tests:共识规范测试。 + +### 2025.02.13 +### 2025.02.14 +### 2025.02.15 +### 2025.02.16 From f20b94e95d53fdcae4f9d8a86c996f1045283d87 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 14:44:42 +0000 Subject: [PATCH 50/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2e53ac9..cdec07b 100644 --- a/README.md +++ b/README.md @@ -185,7 +185,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | eddy8 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | yenchihliao | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | DasNarrenschiff | ✅ | ⭕️ | ⭕️ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | -| awsomecty | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| awsomecty | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | devbards | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | StellaWang5209 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | pillowtalk-Qy | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | @@ -659,6 +659,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 08a101124a5086b23e844f7dbc3cee103a849a3a Mon Sep 17 00:00:00 2001 From: poyucheese <113661710+poyucheese@users.noreply.github.com> Date: Wed, 12 Feb 2025 23:06:14 +0800 Subject: [PATCH 51/92] Update poyucheese.md 0212 --- poyucheese.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/poyucheese.md b/poyucheese.md index ec5804c..e3f9fc5 100644 --- a/poyucheese.md +++ b/poyucheese.md @@ -71,4 +71,15 @@ timezone: Asia/Shanghai >透過權重最大(最多驗證者投票的)的子樹來決定主鏈,確保惡意節點無法輕易影響共識。 +### 2025.02.12 + +#### [SGweek4](https://epf.wiki/#/eps/week4) + +week 4 是有關 Ethereum 測試的內容。 + +##### Execution Layer Testing + +- 用於確保 Ethereum 執行客戶端的正確性,避免因實作差異導致的鏈分叉,需要 EVM testing 進行測試,為客戶端提供相同 pre-state (賬戶餘額、nonce、合約代碼和存儲)、環境、輸入 (交易) 、規則,預期得到相同的 post-state。 +- Test Filling 可以跨客戶端執行,確保所有實作遵循相同的行為。 + From 8907728478b3e75648e8c1a9667ed98be4029fbc Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 15:06:43 +0000 Subject: [PATCH 52/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index cdec07b..0b174c2 100644 --- a/README.md +++ b/README.md @@ -167,7 +167,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | affe | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | dundun930326 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | Echocipher | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | -| poyucheese | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| poyucheese | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | amandakelake | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | ALiangNe | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | tienshaoku | ✅ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | @@ -660,6 +660,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From b57a105cee8eac9068fef24822412ba9633f87f0 Mon Sep 17 00:00:00 2001 From: "OO\\czc_c" <532177525@qq.com> Date: Thu, 13 Feb 2025 00:16:13 +0900 Subject: [PATCH 53/92] Update Lvista.md --- Lvista.md | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/Lvista.md b/Lvista.md index 646be04..6636950 100644 --- a/Lvista.md +++ b/Lvista.md @@ -135,9 +135,9 @@ The "Hash with Zeros" and the Nonce are exactly the Proof of Work. 1. Because of the "Chain", once a certain block in the middle is changed, all subsequent blocks will be changed, Moreover, there are many copy of ledger, the forged ledger will be overwhelmed by the correct version. 2. Of cause, the latest block maybe untrustworthy, or perhaps the latest ledger you received was indeed forged by someone else, who mined out in the fastest time. But this won't last long, other miners will soon surpass it, and the ledger will return to its correct state. -#### Proof of stake (PoS) +#### Proof of stake -TODO +[TODO](#proof-of-stake-pos) #### Gas @@ -324,8 +324,39 @@ more income for those block proposer. > - block proposer incentivized to not create fake Tx, and > - disincentivize off chain agreements. -a solution: [ Transaction Fee Mechanism Design, by T. Roughgarden, 2021 ] +Links: +|Title|Year|Authors| +|---|---|---| +|[Transaction Fee Mechanism Design](https://arxiv.org/abs/2106.01340)|2021|T. Roughgarden| +|[Empirical Analysis of EIP-1559: Transaction Fees, Waiting Time, and Consensus Security](https://arxiv.org/abs/2201.05574)|2023|Yulin Liu, et al.| ### 2025.02.12 +#### Proof of stake (PoS) +> See also: +> - [PoW](#proof-of-work-pow) +> - [The Beacon Chain Ethereum 2.0 explainer you need to read first](https://ethos.dev/beacon-chain) + +**Slots and Epochs: the heartbeat to Ethereum’s consensus** + +- Each *slot* is 12 seconds and an *epoch* is 32 slots: 6.4 minutes. +- the index of each slot is start at 0 +- Every slots, one block is added when the system is running optimally +- slots can be empty + +![](https://ethos.dev/assets/images/posts/beacon-chain/Beacon-Chain-Slots-and-Epochs.png.webp) + +**Validators and Attestations** + +- A block proposer is a validator that has been **pseudorandomly** selected to build a block. +- Most of the time, validators are **attesters** that vote on blocks, just like +a committee, [with each person randomly sitting in power](# "随机坐庄"). +- Validators is police each other and are rewarded for reporting other validators that make conflicting votes, or propose multiple blocks. +- An **attestation** is a validator’s vote, weighted by the validator’s balance. +- The validators not only broadcasts new blocks, but also Attestation to indicate their recognition of the block. + +> Beacon Chain is different from World State Chain!!! + +### 2025.02.13 + From 8e62c0d15bbb5f00e5cb5501e078dabeb26f785b Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 15:17:48 +0000 Subject: [PATCH 54/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0b174c2..6abe009 100644 --- a/README.md +++ b/README.md @@ -157,7 +157,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | zhwindy | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | rectinajh | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | letsgoexplore | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| Lvista | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| Lvista | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | lanpan999 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | liuxulife | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | | CHENFANGC | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | @@ -661,6 +661,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From e804b4727c20cbcf9e91c6db71eb9b5b712a900b Mon Sep 17 00:00:00 2001 From: kidneyweakx Date: Wed, 12 Feb 2025 23:22:08 +0800 Subject: [PATCH 55/92] Update kidneyweakx.md --- kidneyweakx.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kidneyweakx.md b/kidneyweakx.md index 88c14cd..897aaa2 100644 --- a/kidneyweakx.md +++ b/kidneyweakx.md @@ -67,4 +67,6 @@ gas 算式挺複雜的,看了一陣子 # 2025.02.11 EL Client 今天看的相對比較熟,之前玩過 quorum 和 besu 設計挺像的 +# 2025.02.12 +EVM 這篇教學不錯,有圖解很詳細,不過我還要多看看下面的 ref \ No newline at end of file From 505428f479bcf7e12bbbf31b8ca6bffb2b77145f Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 15:22:29 +0000 Subject: [PATCH 56/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6abe009..35de6c3 100644 --- a/README.md +++ b/README.md @@ -144,7 +144,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | rogers3333 | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | deporter | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | LouisTsai-Csie | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | -| kidneyweakx | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| kidneyweakx | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | keroro520 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | huangyan0914 | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | | 0xNezha | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | @@ -662,6 +662,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From a8f3f43978788968f3b73b27700c8422fde65ace Mon Sep 17 00:00:00 2001 From: yen Date: Wed, 12 Feb 2025 23:38:14 +0800 Subject: [PATCH 57/92] Update yenchihliao.md --- yenchihliao.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/yenchihliao.md b/yenchihliao.md index 8ea24fe..a00da09 100644 --- a/yenchihliao.md +++ b/yenchihliao.md @@ -70,6 +70,7 @@ web3 developer, 朋友推坑第一次嘗試參加 Finished week0 and week1 The week1 contains a lot of useful info, despite the vedio recording of somehow hard to focus on. The [quiz](https://ethereum.org/zh/quizzes/) is extremely helpful + Picked up/strengthened some key concepts - Pretty Good Privacy (PGP) protocol, Signal protocol (both asymatric) - Stacking offline panelty @@ -111,4 +112,16 @@ Picked up/strengthened some key concepts - Justification: 2/3 of validators attested - Finialize: Justifying a justified block +### 2025.02.12 +Finished week4 + +It's talking about all the different ways/frameworks of testing. Without some concrete examples, it's really hard to get the merits of each of them + +Picked up/strengthened some key concepts +- Execution Spec tests: Generate tests for EL clients +- Fuzzy Differential State Testing: Run a fuzzy smart contract and compares resulting state root of differenet clients +- Blockchain Testing: Similar to the previous test but on the scope of block hashes +- Hive Test: generate CL and EL for specific tests +- Shallow-fork: Early hard-fork from limited nodes + From 6c9cbb9126f2ed034ef8ff25f4634607759e9daf Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 15:38:33 +0000 Subject: [PATCH 58/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 35de6c3..26146a8 100644 --- a/README.md +++ b/README.md @@ -183,7 +183,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | lknxt1995 | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | nooma42 | ✅ | ⭕️ | ⭕️ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | | eddy8 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| yenchihliao | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| yenchihliao | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | DasNarrenschiff | ✅ | ⭕️ | ⭕️ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | | awsomecty | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | devbards | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | @@ -663,6 +663,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From bd2d310893a466d25bfc2bfcd6dcc91a91e0197c Mon Sep 17 00:00:00 2001 From: henryleo <197507345+henrycyberbio@users.noreply.github.com> Date: Wed, 12 Feb 2025 23:43:09 +0800 Subject: [PATCH 59/92] 2025.02.12 --- henryleo.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/henryleo.md b/henryleo.md index 6582d23..65f8cdd 100644 --- a/henryleo.md +++ b/henryleo.md @@ -182,4 +182,29 @@ BitTorrent 旨在解决依赖中心化服务器下载大文件导致的网络堵 - Ethereum Blockchain 以太坊区块链 - Ethereum Network 以太坊网络 +三个组件并非相互独立,而是嵌套的,EVM是一个安装在物理设备(节点)上的一个程序,其中包含以太坊区块链,而全世界的节点组成以太坊网络。 + +要理解以太坊这个平台不能以“服务器-客户端”的模型去理解,而是每一个节点都是一个完整的副本,即每个参与以太坊的物理世界的计算机都拥有一个可信的计算平台也就是EVM,在EVM中更新区块链。 + +##### Refs +- [协议架构概览 | epf.wiki](https://epf.wiki/#/wiki/protocol/architecture?id=protocol-architecture-overview) +- [节点架构](https://ethereum.org/zh/developers/docs/nodes-and-clients/node-architecture/) +- [Vitalik Buterin带你三十分钟了解以太坊 | Devcon Bogotá](https://www.youtube.com/watch?v=UihMqcj-cqc) + +### 2025.02.12 + +#### 以太坊账户 + +以太坊有两种账户: +- Externally-owned account 外部所有的帐户 (EOA) +- Smart contract account 智能合约帐户 + +举个例子,我们在Metamask创建的账户、我们自己拥有私钥的账户就是EOA,而拥有的USDT就是智能合约账户,所以USDT有CA(Contract Address 合约地址)。 + +在以太坊中,EOA只能进行ETH和代币交易,假设我在我的EOA中转移USDT,实际上它并不保存在我的账户中,而是EOA和USDT的智能合约进行交互,在合约中更新了token ID + +##### Refs +- [以太坊账户|EF](https://ethereum.org/zh/developers/docs/accounts/) + + From 5a4ce35eb2e22cf4cdb9223195bebeb7d87151c6 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 15:43:35 +0000 Subject: [PATCH 60/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 26146a8..df1f18b 100644 --- a/README.md +++ b/README.md @@ -108,7 +108,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | luffythink | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | Henry | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | | d0d0d9 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | -| henryleo | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| henryleo | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | zhouCode | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | mrmign | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | ghx1104 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | @@ -664,6 +664,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From f6e6a013cee0854454e744495a59c82dec7aca51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=97=B2=20=E8=80=98?= Date: Wed, 12 Feb 2025 23:46:13 +0800 Subject: [PATCH 61/92] =?UTF-8?q?Feat:=20=E6=9B=B4=E6=96=B0=20hotoo=20?= =?UTF-8?q?=E7=9A=84=E5=AD=A6=E4=B9=A0=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hotoo.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/hotoo.md b/hotoo.md index 38c54cd..1b415e7 100644 --- a/hotoo.md +++ b/hotoo.md @@ -50,7 +50,13 @@ timezone: Asia/Shanghai ### 2025.02.11 > 周二 -笔记内容 +- https://epf.wiki/#/eps/week6-dev +- Consensus specs: + - Index: https://github.com/ethereum/consensus-specs + - Pyspec tutorial: https://github.com/ethereum/consensus-specs/blob/dev/tests/README.md +- Execution specs: + - https://blog.ethereum.org/2023/08/29/eel-spec + - https://github.com/ethereum/execution-specs ### 2025.02.12 > 周三 From 41e6863ce428122fff546a2fe1c468c3fb347fdd Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 15:46:35 +0000 Subject: [PATCH 62/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index df1f18b..aa1aec2 100644 --- a/README.md +++ b/README.md @@ -116,7 +116,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | rayjun | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | CJC824 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | William-02-02 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| hotoo | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | +| hotoo | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | | JoscelynFarr | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | cherry-yl-sh | ✅ | ⭕️ | ⭕️ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | | HeliosLz | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | @@ -665,6 +665,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From fa620327a88272723d7ebd9ade8f39330561f1fd Mon Sep 17 00:00:00 2001 From: devbards <151926970+devbards@users.noreply.github.com> Date: Wed, 12 Feb 2025 23:46:41 +0800 Subject: [PATCH 63/92] Update devbards.md --- devbards.md | 1 + 1 file changed, 1 insertion(+) diff --git a/devbards.md b/devbards.md index 67973a8..3a24b08 100644 --- a/devbards.md +++ b/devbards.md @@ -55,6 +55,7 @@ Ethereum, on the other hand, is gradually replacing PoW with a PoS mechanism, wh Understanding these concepts gives me a deeper appreciation of the motivations behind founding this study group—it’s truly fascinating! ### 2025.02.12 +Today was abit late for updating. Will update it late~ ### 2025.02.13 From 721fc5225328c67a07cc07ff7a92a8cd80004dab Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 15:46:59 +0000 Subject: [PATCH 64/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index aa1aec2..5554162 100644 --- a/README.md +++ b/README.md @@ -186,7 +186,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | yenchihliao | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | DasNarrenschiff | ✅ | ⭕️ | ⭕️ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | | awsomecty | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | -| devbards | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| devbards | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | StellaWang5209 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | pillowtalk-Qy | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | yoona333 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | @@ -666,6 +666,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 6deabe6c2262a1db9b7164eaaa96d5c641d85941 Mon Sep 17 00:00:00 2001 From: Tanner Date: Wed, 12 Feb 2025 23:47:03 +0800 Subject: [PATCH 65/92] Update tannerang.md 0212 --- tannerang.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tannerang.md b/tannerang.md index 97cb886..f2d4991 100644 --- a/tannerang.md +++ b/tannerang.md @@ -43,5 +43,15 @@ EIP-1559 把 Week2 影片看完,筆記明日補上 +### 2025.02.12 + +在 CL 的 verifyHeader 中的 `errInvalidUncleHash`: +- `Uncle Block` 是指兩個重複且高度一樣的 block,它只在 PoW 下存在,原因是當兩個礦工幾乎同時挖出新區塊且節點之間尚未溝通,但只有一個可被加入 Canonical chain,另一個則是 Uncle Block +- Uncle Block 雖然不是主鏈的一部分,但仍然會獲得部分獎勵,藉 Uncle 機制可以用來減少 PoW 中心化挖礦的優勢 +- Uncle Chain 不等於 Orphaned Chain,當發生較長的分叉,較短的那條鏈就會成為 Orphaned Chain,在上面的區塊不會得到任何獎勵,且會被網絡拋棄,交易需要重新打包到主鏈中 +- 由於 PoS 的驗證者是預先選定的,不像 PoW 存在多個礦工同時競爭的情況,所以 `UncleHash` 在 PoS 之下沒有意義,在 CL 會直接將 `UncleHash` 判斷為 `EmptyUncleHash`,否則回傳 `errInvalidUncleHash` +- `header.Difficulty` 在 PoS 後也是 0 + + From aa9aca7aa2c7427803f7ca702744cb345a291c5b Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 15:47:30 +0000 Subject: [PATCH 66/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5554162..ac91d31 100644 --- a/README.md +++ b/README.md @@ -171,7 +171,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | amandakelake | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | ALiangNe | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | tienshaoku | ✅ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | -| tannerang | ✅ | ⭕️ | ✅ | ⭕️ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| tannerang | ✅ | ⭕️ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | dixia | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | dajuguan | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | | timfaner | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | @@ -667,6 +667,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From e894e2554f906a070b73daf0ee4c93b617c89851 Mon Sep 17 00:00:00 2001 From: "k66 (Lana Chen)" Date: Wed, 12 Feb 2025 23:49:56 +0800 Subject: [PATCH 67/92] Update k66.md --- k66.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/k66.md b/k66.md index 139ebc3..9af1702 100644 --- a/k66.md +++ b/k66.md @@ -126,6 +126,7 @@ Week3 Week3 + 承續前一日,week3影片,但我不太懂,想說之後回頭再看一遍。 + - [ ] 回頭再看一遍 Week4 + 講安全及測試 @@ -141,4 +142,30 @@ Week4 + Cross-Layer(Interop) Testing: `Hive`, `Devnet`, `Shadow-Forks`, `Testnets` + 安全: 淺在的issues, bugs +### 2025.02.12 + +總費時: 約50分鐘 + +Week4 ++ 承昨天 ++ EVM testing: EEST(Ethereum/Execution Spec Test) + - test Filling: JSON/YAML files + - Pre-State 停在此 + - Environment + - Transaction(s) + - Post-State: New smart-contracts, new/modeified code, modified storage ++ [EVM testing](https://github.com/ethereum/tests): written in C++(我去Github看目前Python居多) github.com/ethereum/execution-spec-tests ++ EVM testing: [test Filling Execution Spec]](https://github.com/ethereum/execution-spec-tests): Python source code +![螢幕快照 2025-02-12 22-52-31](https://github.com/user-attachments/assets/b1c653e4-8c5b-4525-aedf-8321a671af37) +- [ ] 之後回頭完成[test Filling Execution Spec](](https://github.com/ethereum/execution-spec-tests)) ++ `src/`和`test/`和`opcodes`和`./fixtures`: + - test/下有各hard fork + - opcodes/下的test_dup.py + - ./fixtures下 ++ FuzzyVM, Go evmlab ++ Execution API: json-rpc ++ [Consensus Layer Testing](https://github.com/ethereum/consensus-specs/tests): Written in Python ++ [Cross-Layer Testing](https://github.com/ethereum/hive), [ethpandaops](https://github.com/ethpandaops/assertoor), [kutosis-tech](https://github.com/kutosis-tech/ethereum-package/) + + From e8dd0e1717fe283fcaa62b1d8fa04488db2e190a Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 15:50:10 +0000 Subject: [PATCH 68/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ac91d31..64077b5 100644 --- a/README.md +++ b/README.md @@ -126,7 +126,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | debugzhao | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | StarryDeserts | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | KieSun | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ✅ | | | | | | | | | | | | | | | | | | | -| k66 | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| k66 | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | DVDguzhou | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | armada2013 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | realgu | ✅ | ✅ | ⭕️ | ✅ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | @@ -668,6 +668,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From a1e0fbd6ffcf976c61c78b5978caa046a4627e8d Mon Sep 17 00:00:00 2001 From: mrmign <1880532+mrmign@users.noreply.github.com> Date: Wed, 12 Feb 2025 23:53:25 +0800 Subject: [PATCH 69/92] Update mrmign.md --- mrmign.md | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/mrmign.md b/mrmign.md index eb6af8a..2f76d7d 100644 --- a/mrmign.md +++ b/mrmign.md @@ -191,7 +191,36 @@ Learn [Inevitable Ethereum - World Computer](https://inevitableeth.com/home/ethe - In an Ethereum context, a dApp refers to the smart contract plus the non-blockchain technologies it combines with to aid the user experience. ### 2025.02.12 - +- The Concensus Layer(CL) + - Proof of Staking(PoS) or Staking + - 2015~2022 PoW + - The Merge: transitioned to staking from mining in September 2022 + - Validators + - superphiz.eth is a well-known staker + - 32ETH deposited to the *deposit contract*( a list of participating validators) + - The first task , the head of the blockchain, is decided using a **Latest Message Driven Greedy Heaviest-Observe Sub-Tree(LMD GHOST)** vote. + - The second task, to finalise blocks, is decided using a **Casper the Friendly Finality Gadget(Casper-FFG)** vote. + - justification + - finalisation + - Validators work within a timeframe split up into slots and epochs. + - **LMD GHOST** vote happens in a slot + - **Gasper-FFG** vote happens across epochs + - A slot = 12 seconds + - An epoch = 32 slots ≈ 6.4 minutes + - Slots and LMD GHOST + - In every slot , a block proposer is randomly selected as the leader. Only one validator is assigned as the block proposer for a slot. + - Block proposers are chosen in advance using a pseudo-random algorithm called **RANDAO**. + - The block proposer's job: + - look back at the last slot and find the previous block with the most attestations, the "heaviest" block + logseq.order-list-type:: number + - construct a new Beacon block with contextual information, such as entering and exiting validators, penalties for misbehaving validators, that transitions Ethereum to a new Beacon state. + logseq.order-list-type:: number + - in their execution layer, transition the world state by gathering transactions from the mempool, execution them in the EVM, and producing the execution payload, in the form of an execution block + logseq.order-list-type:: number + - sign the block and then present it to the validators to attest to. Don't present it to the entire validator set. + logseq.order-list-type:: number + - The other validators are involved in attestation. + - ### 2025.02.13 ### 2025.02.14 From ab152fa6d55e3bcb69d678e6cdad7263bddaded7 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 15:53:40 +0000 Subject: [PATCH 70/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 64077b5..984ccd4 100644 --- a/README.md +++ b/README.md @@ -110,7 +110,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | d0d0d9 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | henryleo | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | zhouCode | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | -| mrmign | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| mrmign | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | ghx1104 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | Coooder-Crypto | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | | rayjun | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | @@ -669,6 +669,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From aa84679c1a4f9f7eb5d576f9dd86b2b74aae0db2 Mon Sep 17 00:00:00 2001 From: ethan 3 Date: Wed, 12 Feb 2025 15:54:36 +0000 Subject: [PATCH 71/92] a new start --- dethan3.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dethan3.md b/dethan3.md index e9419da..58e85ce 100644 --- a/dethan3.md +++ b/dethan3.md @@ -48,4 +48,7 @@ Week3 主要讲述了以太坊的共识层,需要了解 POS 的原理。 自由加密运动是以太坊和所有加密货币活动的基础 +### 2025.02.12 +观看 EPS Town Hall 25 + \ No newline at end of file From 7f6254a988dc4cd6dc3cff8016fe05aab27eff19 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 15:56:40 +0000 Subject: [PATCH 72/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 984ccd4..3a847bb 100644 --- a/README.md +++ b/README.md @@ -150,7 +150,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | 0xNezha | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | Garyamour | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | huahuahua1223 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| dethan3 | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| dethan3 | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | Azleal | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | jjeejj | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | buctor41 | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | @@ -670,6 +670,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 45c73745c3cb45eba275553eda777331507c0afd Mon Sep 17 00:00:00 2001 From: tienshaoku Date: Wed, 12 Feb 2025 23:57:48 +0800 Subject: [PATCH 73/92] feb 12th --- tienshaoku.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tienshaoku.md b/tienshaoku.md index 085e0c9..2ddf8df 100644 --- a/tienshaoku.md +++ b/tienshaoku.md @@ -101,6 +101,10 @@ user ---(User API)>>> execution engine ---(Engine API)>>> beacon node ---(Beacon ### 2025.02.10 +### 2025.02.11 + +### 2025.02.12 + #### Execution Layer Spec - The Execution Layer focuses exclusively on executing the state transition function (STF). This role addresses two primary questions: From 726473d938e8224bdff88e1abec8cbdde36e539e Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 15:58:17 +0000 Subject: [PATCH 74/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3a847bb..172afa6 100644 --- a/README.md +++ b/README.md @@ -170,7 +170,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | poyucheese | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | amandakelake | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | ALiangNe | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| tienshaoku | ✅ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | +| tienshaoku | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | ✅ | | | | | | | | | | | | | | | | | | | | tannerang | ✅ | ⭕️ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | dixia | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | dajuguan | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | @@ -671,6 +671,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 2fe81e52ffec2509d2e5060b41fcc97941cf3cb1 Mon Sep 17 00:00:00 2001 From: Patrick <65023578+ppatrick007@users.noreply.github.com> Date: Wed, 12 Feb 2025 23:58:56 +0800 Subject: [PATCH 75/92] Update ppatrick007.md --- ppatrick007.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ppatrick007.md b/ppatrick007.md index 9e4d31c..345e74b 100644 --- a/ppatrick007.md +++ b/ppatrick007.md @@ -203,4 +203,14 @@ Hi, 我是国内一名理科研究生,会一些编程语言,平时科研主 - **Sam Wilson 的讲座**:讨论了 **执行层规范(EELS)**,重点是执行引擎与智能合约执行过程的规范定义。 - 通过演示,Sam 展示了如何通过修改执行层规范来添加新的 **EVM 操作码(Opcode)**。 +### 2025.02.12 + +# 第七天打卡 + +今天总结了前几天的内容,重点回顾了共识层(Consensus Layer)和执行层(Execution Layer)的规范和基础知识。 +没有接触到新的技术内容,主要是通过前几天的学习材料进行巩固和整理。通过对规范的理解和总结,我对以太坊协议的各个部分有了更加系统的认识。 + +在接下来的学习中,将继续深化对协议各层次的理解,并准备好进入更深入的技术分析阶段。 + + From a86c8504c3cb6f5bae3fd185dff8f7ebe98d4070 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 15:59:15 +0000 Subject: [PATCH 76/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 172afa6..17b3d33 100644 --- a/README.md +++ b/README.md @@ -161,7 +161,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | lanpan999 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | liuxulife | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | | CHENFANGC | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | -| ppatrick007 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| ppatrick007 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | zt2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | yiwen4 | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | affe | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | @@ -672,6 +672,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 5b726c345b1b8613b28f39a9a5f1025a5a66bf5f Mon Sep 17 00:00:00 2001 From: realgu <36865815+ChengruiGu@users.noreply.github.com> Date: Thu, 13 Feb 2025 00:14:55 +0800 Subject: [PATCH 77/92] Update realgu.md --- realgu.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/realgu.md b/realgu.md index 8336313..2c64da9 100644 --- a/realgu.md +++ b/realgu.md @@ -56,6 +56,32 @@ func stf(parent types.Block, block types.Block, state state.StateDB) (state.Stat ``` 问题: what exactly does a 'state' contains? what are the tries? +### 2024.02.12 +Ethereum state is stored in four different modified merkle patricia tries (MMPTs): +- Transaction Trie +- Receipt Trie +- World State Trie +- Account State Trie + +计算机组成课flashback: + +1 word = 32 bytes, 1 byte = 8 digits = 2 digits in hexadecimal + +The EVM stack has a maximum size of 1024 items. PUSH -> PUSH -> ADD +Also there's a program counter and JUMP. But where is compare and jump insn like bne, bge, blt? +And there's an available gas counter. + + +EVM memory is a byte array of 2256 (or practically infinite) bytes . All locations in memory are well-defined initially as zero. +MSTORE takes two values from the stack: an address offset and a 32-byte value. It then writes the value to memory at the specified offset. + +In EVM, memory is dynamically allocated in multiples of 1 word “pages”. Gas is charged for the number of pages expanded. +MSIZE: number of words/pages allocated + +Storage can only be accessed via the code of its associated account. External accounts don't have code and therefore cannot access their own storage. + +SSTORE takes two values from the stack: a storage slot and a 32-byte value. It then writes the value to storage of the account. So an account have associated storage + From b1d75744ef313b904879f0d64fe4cabc7ab4ac89 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 16:15:10 +0000 Subject: [PATCH 78/92] Update commit status table --- README.md | 103 +++++++++++++++++++++++++++--------------------------- 1 file changed, 52 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index 17b3d33..b93d556 100644 --- a/README.md +++ b/README.md @@ -102,91 +102,91 @@ Telegram:https://t.me/ETHPandaOrg/5427 | Name | 2.06 | 2.07 | 2.08 | 2.09 | 2.10 | 2.11 | 2.12 | 2.13 | 2.14 | 2.15 | 2.16 | 2.17 | 2.18 | 2.19 | 2.20 | 2.21 | 2.22 | 2.23 | 2.24 | 2.25 | 2.26 | 2.27 | 2.28 | 3.01 | 3.02 | | ------------- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | | brucexu-eth | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | -| PayFv | ⭕️ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | +| PayFv | ⭕️ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | chloezhu010 | ✅ | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | coratann | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| luffythink | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | -| Henry | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | -| d0d0d9 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | -| henryleo | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | -| zhouCode | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | -| mrmign | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | -| ghx1104 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | -| Coooder-Crypto | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | -| rayjun | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| luffythink | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| Henry | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | +| d0d0d9 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| henryleo | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| zhouCode | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| mrmign | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| ghx1104 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| Coooder-Crypto | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | +| rayjun | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | CJC824 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | William-02-02 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| hotoo | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | +| hotoo | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | JoscelynFarr | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| cherry-yl-sh | ✅ | ⭕️ | ⭕️ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | -| HeliosLz | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| cherry-yl-sh | ✅ | ⭕️ | ⭕️ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | +| HeliosLz | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | lllapland | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | passer-byzhang | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| StillFantastic | ⭕️ | ✅ | ⭕️ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | +| StillFantastic | ⭕️ | ✅ | ⭕️ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | debugzhao | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | -| StarryDeserts | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | -| KieSun | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ✅ | | | | | | | | | | | | | | | | | | | -| k66 | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| StarryDeserts | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| KieSun | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ✅ | | | | | | | | | | | | | | | | | | | +| k66 | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | DVDguzhou | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | armada2013 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| realgu | ✅ | ✅ | ⭕️ | ✅ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | +| realgu | ✅ | ✅ | ⭕️ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | Eizz0 | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | | kernel1983 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | -| JC13043DB | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | +| JC13043DB | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | GuoyangLiu24 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| cooper | ⭕️ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ✅ | | | | | | | | | | | | | | | | | | | +| cooper | ⭕️ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ✅ | | | | | | | | | | | | | | | | | | | | chyyynh | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| frankmint2024 | ✅ | ⭕️ | ✅ | ⭕️ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | -| Amberrrrrr | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | -| yahsinhuangtw | ✅ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | ✅ | | | | | | | | | | | | | | | | | | | +| frankmint2024 | ✅ | ⭕️ | ✅ | ⭕️ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | +| Amberrrrrr | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | +| yahsinhuangtw | ✅ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | ✅ | | | | | | | | | | | | | | | | | | | | 0xKarl98 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| marvelshan | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| marvelshan | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | rogers3333 | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | deporter | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| LouisTsai-Csie | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | -| kidneyweakx | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| LouisTsai-Csie | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | +| kidneyweakx | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | keroro520 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| huangyan0914 | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | +| huangyan0914 | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | 0xNezha | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | Garyamour | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | huahuahua1223 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| dethan3 | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| dethan3 | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | Azleal | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| jjeejj | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | -| buctor41 | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | -| zhwindy | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | -| rectinajh | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| jjeejj | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| buctor41 | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | +| zhwindy | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | +| rectinajh | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | letsgoexplore | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| Lvista | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| Lvista | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | lanpan999 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| liuxulife | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | -| CHENFANGC | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | -| ppatrick007 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | -| zt2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| liuxulife | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | +| CHENFANGC | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| ppatrick007 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| zt2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | yiwen4 | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | affe | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| dundun930326 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| dundun930326 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | Echocipher | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | -| poyucheese | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | -| amandakelake | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| poyucheese | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| amandakelake | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | ALiangNe | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| tienshaoku | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | ✅ | | | | | | | | | | | | | | | | | | | -| tannerang | ✅ | ⭕️ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| tienshaoku | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | ✅ | | | | | | | | | | | | | | | | | | | +| tannerang | ✅ | ⭕️ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | dixia | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | -| dajuguan | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | +| dajuguan | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | timfaner | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | -| JeasonZhang | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| JeasonZhang | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | LikKee | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| phoebe-dot | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ✅ | | | | | | | | | | | | | | | | | | | -| PubYuCHe | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | ✅ | | | | | | | | | | | | | | | | | | | | +| phoebe-dot | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ✅ | | | | | | | | | | | | | | | | | | | +| PubYuCHe | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | ✅ | ⭕️ | | | | | | | | | | | | | | | | | | | | evanwu | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | lknxt1995 | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | -| nooma42 | ✅ | ⭕️ | ⭕️ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | +| nooma42 | ✅ | ⭕️ | ⭕️ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | eddy8 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| yenchihliao | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | -| DasNarrenschiff | ✅ | ⭕️ | ⭕️ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | -| awsomecty | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | -| devbards | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| yenchihliao | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| DasNarrenschiff | ✅ | ⭕️ | ⭕️ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | +| awsomecty | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| devbards | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | StellaWang5209 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | pillowtalk-Qy | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | yoona333 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | @@ -673,6 +673,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 8645af2d0525a1793b3a8219595085e529e85c62 Mon Sep 17 00:00:00 2001 From: realgu <36865815+ChengruiGu@users.noreply.github.com> Date: Thu, 13 Feb 2025 00:17:35 +0800 Subject: [PATCH 79/92] Update realgu.md --- realgu.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/realgu.md b/realgu.md index 2c64da9..ab802a1 100644 --- a/realgu.md +++ b/realgu.md @@ -35,7 +35,7 @@ timezone: Asia/Shanghai - 一笔交易大概需要21000 gas unit,每个block 的 gas limit 目前大概 30m gas unit,base fee是 gwei / gas unit - 晕了 EL Spec 很难读下去,暂时跳过吧 -### 2024.02.11 +### 2025.02.11 State Trasition Function: ``` func stf(parent types.Block, block types.Block, state state.StateDB) (state.StateDB, error) { //1 @@ -56,7 +56,7 @@ func stf(parent types.Block, block types.Block, state state.StateDB) (state.Stat ``` 问题: what exactly does a 'state' contains? what are the tries? -### 2024.02.12 +### 2025.02.12 Ethereum state is stored in four different modified merkle patricia tries (MMPTs): - Transaction Trie - Receipt Trie From 98dc07cae3016890d45dbf384b085bf2169f01ef Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 16:17:50 +0000 Subject: [PATCH 80/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b93d556..441c7ea 100644 --- a/README.md +++ b/README.md @@ -129,7 +129,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | k66 | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | DVDguzhou | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | armada2013 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | -| realgu | ✅ | ✅ | ⭕️ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | +| realgu | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | Eizz0 | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | | kernel1983 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | JC13043DB | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | @@ -674,6 +674,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 03c97fcc3a13db3f4d293116935633cd21c535d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=AE=E7=BD=97=E5=88=97=E5=A1=94=E5=88=A9=E4=BA=9A?= =?UTF-8?q?=E7=89=B9?= <31700009+zhouCode@users.noreply.github.com> Date: Thu, 13 Feb 2025 00:40:22 +0800 Subject: [PATCH 81/92] Update zhouCode.md --- zhouCode.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/zhouCode.md b/zhouCode.md index 660a2fd..78270a8 100644 --- a/zhouCode.md +++ b/zhouCode.md @@ -619,4 +619,20 @@ func build(env Environment, pool txpool.Pool, state state.StateDB) (types.Block, - **量子抗性**: 长期规划中替换BLS签名,采用抗量子算法(如STARKs)。 - **路线图复杂性**: 未来可能面临协议僵化(Ossification)风险,需平衡创新与稳定性。 + +### 2025.02.13 + +##### Study Group Week 5 | Using Ethereum clients + +##### **客户端选择与安装** + +- **客户端多样性**:建议根据开发语言偏好(如Java开发者可选Besu)或生态贡献需求选择客户端。 +- **签名验证**:通过PGP验证客户端二进制文件的安全性。 +- **编译客户端**:演示从源码编译Geth的过程。 + +##### **节点配置与运行** + +- **数据目录与网络配置**:指定数据存储路径及网络参数(如`--datadir`和`--network`) +- **同步模式**:解释全同步(Full Sync)与快照同步(Snap Sync)的区别 +- **JWT认证**:配置执行层与共识层通信的JWT密钥 From e7229652b8ad837f9f0bdc89ba2156253be809c2 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 16:40:38 +0000 Subject: [PATCH 82/92] Update commit status table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 441c7ea..c4a60f2 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | Henry | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | d0d0d9 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | henryleo | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | -| zhouCode | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| zhouCode | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | mrmign | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | ghx1104 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | Coooder-Crypto | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | @@ -675,6 +675,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From ff39ba719b2a38dcca84e1130aa5adf8ec86a3d6 Mon Sep 17 00:00:00 2001 From: d1xia <667070+dixia@users.noreply.github.com> Date: Wed, 12 Feb 2025 23:55:07 +0700 Subject: [PATCH 83/92] 12 Feb 2025 fork rules --- dixia.md | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/dixia.md b/dixia.md index ce13618..f4a7f8d 100644 --- a/dixia.md +++ b/dixia.md @@ -101,11 +101,45 @@ a validator run a beacon node still not sure why a committe concept is needed after watch all these video -PoW consensus use economic (hash power) to reach consensus which looks a lot simpler. Through it does give entity who has most computing power an advantage so it is more close to "real" economy where PoS could at certain time depeg from real economy power. As long as stakeholder/token holder has a little real world economy power(pay for server and bandwdith). (eth will have price but it is less impact by commodity price such as electricity - ) it is easier to develop as independent set of stakerholders on its own economy compare to Bitcoin i.e. if someone is very good at investing/trading, he or she could acquire ether at lower price. But you alway need to pay for a market price for electricity. PoW resets the game each time but does make bitcoin's opeartion more close to "real world" +PoW consensus use economic (hash power) to reach consensus which looks a lot simpler. Through it does give entity who has most computing power an advantage so it is more close to "real" economy where PoS could at certain time depeg from real economy power. As long as stakeholder/token holder has a little real world economy power(pay for server and bandwdith). (eth will have price but it is less impact by commodity price such as electricity) it is easier to develop as independent set of stakerholders on its own economy compare to Bitcoin i.e. if someone is very good at investing/trading, he or she could acquire ether at lower price. But you alway need to pay for a market price for electricity. PoW resets the game each time but does make bitcoin's opeartion more close to "real world". ### 2025.02.12 fork choice rule == LMD GHOST +"Node and EL. But is this a physical scope separation? Need to learn more." + +EL execute EVM and validate evm related logic and generate a block. It also maintain mempool for sharing the txs which has not been included in the block. EL also handle RPC requests. So CL node and EL software are sperated. + +"The challenge a consensus protocol seeks to solve is that of building a reliable distributed system on top of unreliable infrastructure." + +"the nodes must agree, and they must come to agreement swiftly." + +"So, if I have 1 ETH and I simultaneously tell the network that I am sending that 1 ETH to Alice and also to Bob, we expect that eventually the network will agree that either I sent it to Alice or I sent it to Bob. It would be a failure if both Alice and Bob received my Ether, or if neither received it." + +https://eth2book.info/capella/part2/consensus/preliminaries/ + +#### fork choice rule == Gasper + +when consensus prevent are issue: + +network delay (probably most common cases) +code error/conflict +bad actors + +mostly preventing forks + +liveness vs. safty. PBFT is always safe (so not fork?) + +goal is select most likely linear chain + +first rule of fork rule is the block and ancestor of the block are vaild + +todo: + +keep reading https://eth2book.info/capella/part2/consensus/preliminaries/#fork-choice-rules + +Execution layer validate cryptographic perspective of safty and together with consensus layer it make sure the validation rule (cryptographic rule ) are follow (safty) and working (liveness)? + + \ No newline at end of file From ba7f637e6025ba1b56217786f4780e264c0f7acd Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 16:55:27 +0000 Subject: [PATCH 84/92] Update commit status table --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c4a60f2..261aeed 100644 --- a/README.md +++ b/README.md @@ -676,6 +676,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 5532c244ebf23b0dbea32e40ec3cd0f22b6498e5 Mon Sep 17 00:00:00 2001 From: d1xia <667070+dixia@users.noreply.github.com> Date: Wed, 12 Feb 2025 23:58:31 +0700 Subject: [PATCH 85/92] fix format? fix format? --- dixia.md | 1 - 1 file changed, 1 deletion(-) diff --git a/dixia.md b/dixia.md index f4a7f8d..13d8bea 100644 --- a/dixia.md +++ b/dixia.md @@ -141,5 +141,4 @@ keep reading https://eth2book.info/capella/part2/consensus/preliminaries/#fork-c Execution layer validate cryptographic perspective of safty and together with consensus layer it make sure the validation rule (cryptographic rule ) are follow (safty) and working (liveness)? - \ No newline at end of file From 04f524d1e6c56b17a6c0f65551decfbe2484bb83 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 16:58:54 +0000 Subject: [PATCH 86/92] Update commit status table --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 261aeed..3457dce 100644 --- a/README.md +++ b/README.md @@ -677,6 +677,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From b2bde0b45ce125cbea4459d1b07c47982cd3545b Mon Sep 17 00:00:00 2001 From: mrmign <1880532+mrmign@users.noreply.github.com> Date: Thu, 13 Feb 2025 01:38:59 +0800 Subject: [PATCH 87/92] Update mrmign.md --- mrmign.md | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/mrmign.md b/mrmign.md index 2f76d7d..0247f06 100644 --- a/mrmign.md +++ b/mrmign.md @@ -191,7 +191,7 @@ Learn [Inevitable Ethereum - World Computer](https://inevitableeth.com/home/ethe - In an Ethereum context, a dApp refers to the smart contract plus the non-blockchain technologies it combines with to aid the user experience. ### 2025.02.12 -- The Concensus Layer(CL) +- The Concensus Layer(CL) -1 - Proof of Staking(PoS) or Staking - 2015~2022 PoW - The Merge: transitioned to staking from mining in September 2022 @@ -222,7 +222,44 @@ Learn [Inevitable Ethereum - World Computer](https://inevitableeth.com/home/ethe - The other validators are involved in attestation. - ### 2025.02.13 - +- The Concencus Layer(CL) -2 + - Epochs and Casper-FFG + - two Checkpoints + - the first is the *target*, refers to the checkpoint at the start of the current epoch + - the second is the *source*, refers to the checkpoint in the epoch prior. + - 2/3 supermajority votes + - Aggregation + - To improve the efficiency of attestations, validators use the **Boneh-Lynn-Shacham (BLS)** digital signature scheme. it is similar to **ECDSA**. + - Rewards and Penalties + - Rewards: + - Block proposal: priority fees and MEV + - Attestations: Attesting to the block, to the checkpoints + - Sync committee: participation in a sync committee + - Slashing reward: Reporting malicious behaviour + - Penalties: + - Missed Proposal: No penalty + - Missed Attestations: Failure to attest + - Missed Committee: Failure to participate in sync committee + - Beacon Block + - Merkle Patricia Tree + - Staking Pools + - combine smaller amounts of ETH to create shared validators. + - Centralised staking pool, (Binance) + - Decentralised pool, smart contract protocols (Lido, Rocket Pool) + - deposit ETH and receive **Liquid Staking Derivative(LSD)** in return + - Maximum Extractable Value(MEV) + - refers to the extracting of value by manipulating how transactions are ordered within a block. + - a complex ecosystem of MEV specialists: + - Searchers, are users who watch the mempool for transactions + - block builders, use the mempool to build an execution payload, but they also include the oportimised MEV transactions form searchers. + - relayers, passes the block builder blocks to proposers, who select the most profitable one of them. + - Proposer-Builder-Separation(PBS) will be enshrined into the protocol, but for now it is a semi-formal distinction. + - Blockchain Forks + - Temporary chain split + - Soft fork + - Hard fork + - Contentious Hard Fork + - Malicious hard fork ### 2025.02.14 ### 2025.02.15 From 6e54bbcd13d9c77db9547dc52b7847017be9a6c3 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 17:39:12 +0000 Subject: [PATCH 88/92] Update commit status table --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3457dce..f92b943 100644 --- a/README.md +++ b/README.md @@ -110,7 +110,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | d0d0d9 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | henryleo | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | zhouCode | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | -| mrmign | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| mrmign | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | ghx1104 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | Coooder-Crypto | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | rayjun | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | @@ -172,7 +172,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | ALiangNe | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | tienshaoku | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | ✅ | | | | | | | | | | | | | | | | | | | | tannerang | ✅ | ⭕️ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | -| dixia | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| dixia | ✅ | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | dajuguan | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | timfaner | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | JeasonZhang | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | @@ -678,6 +678,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From cf66ef0acff2aa5e09a470a0e85affd4ffa9e358 Mon Sep 17 00:00:00 2001 From: KJ Date: Wed, 12 Feb 2025 12:51:27 -0500 Subject: [PATCH 89/92] Update kernel1983.md --- kernel1983.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/kernel1983.md b/kernel1983.md index 52b8413..4dcc887 100644 --- a/kernel1983.md +++ b/kernel1983.md @@ -126,4 +126,8 @@ EVM 在执行中必须访问全局状态,如果是默克尔根或者 Verkle 改进方法:在我们 Zentra 中,会利用全局状态的稀缺性,设计代币。这样的设计将鼓励链上繁荣,币价上涨不会抑制链上活跃度。 +### 2025.02.13 + +学习BLS的过程中,重新理解一下pairing https://epf.wiki/#/wiki/Cryptography/bls?id=how-bls-works 看看经典的 pairing 可以设计什么有意思的方案。 + From 48debc40ba9ad85d026b8f5682bc90907e7fd2a0 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 17:51:42 +0000 Subject: [PATCH 90/92] Update commit status table --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f92b943..2c42655 100644 --- a/README.md +++ b/README.md @@ -679,6 +679,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 + From 6fb0b331f19aab50b5b67823a597703f3173318c Mon Sep 17 00:00:00 2001 From: Bruce Xu <95468177+brucexu-eth@users.noreply.github.com> Date: Thu, 13 Feb 2025 12:07:09 +1300 Subject: [PATCH 91/92] Update brucexu-eth.md --- brucexu-eth.md | 58 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/brucexu-eth.md b/brucexu-eth.md index d8f955a..e5e1b77 100644 --- a/brucexu-eth.md +++ b/brucexu-eth.md @@ -223,7 +223,63 @@ The ideas and proposed changes from the community are coordinated using EIP proc TODO https://notes.ethereum.org/@mikeneuder/rcr2vmsvftv -TODO https://epf.wiki/#/eps/week2 +# 2025.02.13 + +## https://epf.wiki/#/eps/week2 + +### https://github.com/ethereum/consensus-specs/blob/dev/specs/deneb/beacon-chain.md#modified-process_execution_payload + +``` +class ExecutionPayload(Container): + # Execution block header fields + parent_hash: Hash32 # 上一个区块的 hash,连起来 + fee_recipient: ExecutionAddress # 'beneficiary' in the yellow paper 执行层中,是区块提交者的地址 + state_root: Bytes32 + receipts_root: Bytes32 + logs_bloom: ByteVector[BYTES_PER_LOGS_BLOOM] # 用于日志过滤的 bloom 过滤器,用于快速查找日志 + prev_randao: Bytes32 # 'difficulty' in the yellow paper + block_number: uint64 # 'number' in the yellow paper + gas_limit: uint64 + gas_used: uint64 + timestamp: uint64 + extra_data: ByteList[MAX_EXTRA_DATA_BYTES] + base_fee_per_gas: uint256 + # Extra payload fields + block_hash: Hash32 # Hash of execution block + transactions: List[Transaction, MAX_TRANSACTIONS_PER_PAYLOAD] + withdrawals: List[Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD] # 目前区块的提款列表 + blob_gas_used: uint64 # [New in Deneb:EIP4844] + excess_blob_gas: uint64 # [New in Deneb:EIP4844] +``` + +需要进行能力扩展和数据增加,就是通过类似 EIP4844 这样的标准,创建新的标准,然后客户端来实现读取和保存记录。 + +真实的信息和数据: + +![image](https://github.com/user-attachments/assets/185dcd23-b49a-4980-8c9a-f6f66d365543) + +![image](https://github.com/user-attachments/assets/51da5284-ff7a-44af-8b53-b286f9e35555) + +![image](https://github.com/user-attachments/assets/7861ddc2-dc22-4da3-84aa-406d639f2eda) + +logs_bloom 的工作原理: + +- logs_bloom 是一个固定大小的位数组,通常为256字节,即2048位。 +- 当一个新的日志被添加到区块中时,计算该日志的哈希值,并使用多个哈希函数(如3个)生成多个哈希值。 +- 将这些哈希值映射到logs_bloom的位数组中,将对应的位设置为1。 +- 查询某个日志是否存在于某个区块的时候,只需要计算日志的 hash,然后快速检查 logs_bloom 的对应的位置是否全部为 1,如果是,那么日志可能在当前区块。可能会存在误报 +- 通过这个,可以快速过滤不包含特定日志的区块,提高检索效率,比如查询 event 发生在哪些区块,从而仅仅加载和处理相关区块 + +TODO Hackerscan 可以加入查看原始区块信息的功能,没有找到 logs_bloom 的原始数据 + +TODO Contract Internal Transactions 是什么?跟 Block 的 transactions 区别是什么? + +TODO 明天把整个区块的所有信息和内容过一下 https://etherscan.io/block/21833528 https://eth.blockscout.com/block/21833528?tab=index + +TODO randao +TODO withdrawals 提款工作原理? + + From 353fd48e4c7fa53ffb33745bc6cbe8da8495a032 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Feb 2025 23:07:22 +0000 Subject: [PATCH 92/92] Update commit status table --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 2c42655..8a96481 100644 --- a/README.md +++ b/README.md @@ -101,9 +101,9 @@ Telegram:https://t.me/ETHPandaOrg/5427 | Name | 2.06 | 2.07 | 2.08 | 2.09 | 2.10 | 2.11 | 2.12 | 2.13 | 2.14 | 2.15 | 2.16 | 2.17 | 2.18 | 2.19 | 2.20 | 2.21 | 2.22 | 2.23 | 2.24 | 2.25 | 2.26 | 2.27 | 2.28 | 3.01 | 3.02 | | ------------- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | -| brucexu-eth | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| brucexu-eth | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | PayFv | ⭕️ | ✅ | ✅ | ⭕️ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | -| chloezhu010 | ✅ | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| chloezhu010 | ✅ | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | coratann | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | luffythink | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | Henry | ✅ | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | @@ -120,7 +120,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | JoscelynFarr | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | cherry-yl-sh | ✅ | ⭕️ | ⭕️ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | HeliosLz | ⭕️ | ⭕️ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | -| lllapland | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | +| lllapland | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | passer-byzhang | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | StillFantastic | ⭕️ | ✅ | ⭕️ | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | debugzhao | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | @@ -130,7 +130,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 | DVDguzhou | ✅ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | armada2013 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | | realgu | ✅ | ✅ | ⭕️ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | -| Eizz0 | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | +| Eizz0 | ✅ | ✅ | ✅ | ⭕️ | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | kernel1983 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | | | | | | | | | | | | | | | | | | JC13043DB | ✅ | ⭕️ | ⭕️ | ✅ | ✅ | ⭕️ | ⭕️ | | | | | | | | | | | | | | | | | | | | GuoyangLiu24 | ⭕️ | ⭕️ | ❌ | | | | | | | | | | | | | | | | | | | | | | | @@ -680,6 +680,7 @@ Telegram:https://t.me/ETHPandaOrg/5427 +