# Hey Ethereum

By [Cybrain](https://paragraph.com/@cybrain) · 2021-12-09

---

📕 **关于原作**

[https://github.com/ethereumbook/ethereumbook](https://github.com/ethereumbook/ethereumbook)

作者 Andreas M Antonopoulos 和 Gavin Wood

介绍了基于虚拟机的区块链，构建智能合约、DApps 所需要了解的全部基本信息；

可以作为技术参考手册，也可以让读者更全面地了解以太坊。

📝 **关于本文**

隐去所有智能合约开发的 Solidity 代码细节；在阅读过程中记录的或关键或比较难理解的部分，补充参考资料进一步消化学习，对以太坊（或 Web3.0）的基础和现状有更通俗的理解。

> 引用内容为原书内容摘录

第1章 什么是以太坊
==========

> 具有一个全球范围可访问的单体状态；还有一个执行状态更改的虚拟机

所有参与者共同维护的一个**状态机**，并可以通过一个虚拟机（EVM）更改状态；运行在虚拟机中的程序，称为智能合约（Smart Contract）。

通俗地理解，如果说比特币（基于区块链的数字货币）是一条所有人共同维护、达成共识的数据链，每一个链条节点上挂满了交易账单，那么以太坊就相当于在每一个节点上挂了一个计算器。

⛓️ 🖥️⛓️ 🖥️⛓️ 🖥️⛓️ 🖥️⛓️ 🖥️⛓️ 🖥️⛓️ 🖥️⛓️ ……

> 有些人把以太坊看作一个可编程的数字货币平台......Web 3把以太坊视为去中心化技术的一部分，去中心化技术的另外两个重要组成部分是Whisper和Swarm

以太坊虚拟机并不只是一个可以用来计算货币交易的**计算器**，它其实是可以实现通用目的的计算平台，即”图灵完备“的：

[https://www.nenglian.com/insight/2178.html](https://www.nenglian.com/insight/2178.html)

> 每一个指令都有一个预先定义好的开销，以`gas`为单位。当以太坊交易触发了智能合约的执行时，交易中必须包含这个智能合约执行过程中所需要的计算资源开销的上限。如果执行过程中的资源开销量超过了交易中指定的`gas`上限，那么EVM就会主动终止这个合约的执行

图灵完备意味着 EVM 运行的程序 —— 智能合约有可能无限循环地运行下去，直到耗尽所有资源；以太坊设置 ⛽ 作为智能合约运行所需的燃料，当燃料开销超过指定的限额，程序将被终止，从而防止死机。

![参考阅读 - 附录C：EVM操作码对应的 gas 开销](https://storage.googleapis.com/papyrus_images/78d7f904142582f1d77458e062ead9221a2359ce0742de2f1aa479f4721b06f8.png)

参考阅读 - 附录C：EVM操作码对应的 gas 开销

第2章 以太坊的基本概念
============

> 我们将使用术语“钱包”来表示帮助你管理以太坊账户的软件应用程序

> 千万不要以数字信息的形式存储私钥，建议把这张小纸条锁在抽屉或保险箱里

💰 钱包即每个用户在以太坊中的账号/地址/身份，因为去中心化的特性，不存在“找回密码”的选项，因此每个人必须对自己的💰负责。

> 设计以太币是用来支付智能合约的，智能合约是运行在以太坊虚拟机（EVM）之上的计算机程序

如第1章所述，数字货币功能只是以太坊通用计算平台的功能之一；以太币的真实目的是用来支付智能合约的，就像投币游戏机 🕹️ 一样，只有投币才能触发程序运行。

> 合约具有地址，就像外部账户一样。合约也可以发送和接收以太币

智能合约和你一样，拥有自己的地址（也可以理解为💰）

> 可编程区块链的威力在于可以用去中心化的软件来控制资产！

资产等价于共识，当所有人都认同你有100块钱的时候，那么你就拥有100块的资产。所有人的共识以交易记录的形式存储在区块链上，由所有人共同维护，智能合约的优势在于它能够向人一样控制资产的流动（当然前提是智能合约的运行规则也是所有人的共识！）

> 现在稍等15～30秒，这个交易就会被Ropsten网络上的矿工确认。Remix IDE也无法加速这个过程，我们只能耐心等待

[https://ethfans.org/posts/life-cycle-of-an-ethereum-transaction](https://ethfans.org/posts/life-cycle-of-an-ethereum-transaction)

每一笔交易都需要经过矿工通过大量计算进行证明，并收取一定的费用（gas）；这极大限制了交易效率，如果要支撑全球化的去中心化 APP，这显然是不够的，想象你发布一条消息需要等待20s且还需要收取费用，这显然是不可接受的。以目前的 ENS （以太坊域名服务）为例，注册域名所需的费用为 0.001 ETH（$5 USD），而所需的 gas 费用则是注册费用的将近 30 倍！

![ENS gas fee](https://storage.googleapis.com/papyrus_images/477569b6e8d321a65b0dbefc404e1a670177b0ef0bb23ef0f70b5fabe4789e86.png)

ENS gas fee

为了解决这一问题，也为了让更多人能够使用以太坊作为基础服务的去中心化应用（DApps），有链上（on-chain）、链下（off-chain）两种解决方案，分别是 Ethereum 2.0 和 Layer 2。

![https://ethereum.org/en/eth2/](https://storage.googleapis.com/papyrus_images/92627494188e2ae8c445b25dccd7978a2330f20c03f65d8ed22f4e9443fc4893.png)

https://ethereum.org/en/eth2/

[https://www.deltecbank.com/2021/10/13/whats-ethereum-2-0-and-what-does-it-mean-for-eth/?locale=en](https://www.deltecbank.com/2021/10/13/whats-ethereum-2-0-and-what-does-it-mean-for-eth/?locale=en)

[https://ethereum.org/en/developers/docs/scaling/#off-chain-scaling](https://ethereum.org/en/developers/docs/scaling/#off-chain-scaling)

第3章 以太坊客户端
==========

> 你需要至少80GB的磁盘空间，以在公链上运行一个全功能节点和保存整个以太坊公链的区块链数据。如果你希望在测试网络上运行**全功能的节点**，则需要大约15GB的磁盘空间。下载80GB的区块链数据需要快速的互联网连接，否则会花费非常长的时间

> 你也可以运行一个仅从远程调用以太坊的客户端，就是说，不在本地保存区块链数据，也不参与区块和交易验证。这样的客户端提供钱包功能，也可以创建并广播交易

全功能节点需要维护以太坊全部数据，成为去中心化区块链中的一份子；但这需要更大的磁盘空间和带宽（以及电量能耗），如果你只是想做微开发者在以太坊开发 DApps，完全可以选择通过远程调用的方式与以太坊交互（JSON-PRC）。

[https://www.seba.swiss/research/Classification-and-importance-of-nodes-in-a-blockchain-network](https://www.seba.swiss/research/Classification-and-importance-of-nodes-in-a-blockchain-network)

> 可实际上它会在浏览器中注入一个web3实例，作为可以连接到多个以太坊区块链（例如主网、Ropsten测试网、Kovan测试网、本地RPC节点等）的RPC客户端。注入web3实例并作为外部RPC服务的网关，使得MetaMask成为开发者的神器

🦊 MetaMask 是一个浏览器插件形式的钱包 💰 应用，它的优势是可以让开发者通过 web3.js 开发 DApps 时能够快速与不同测试网络的以太坊进行交互，免去自己维护一个客户端的麻烦。

第4章 以太坊背后的密码学
=============

> 密码学可以用来进行知识证明，这是指在不公开秘密数据的情况下，证明知道秘密的信息（数字签名）；也可以用作证明信息的真实性（数字指纹，也称哈希）

> 未来，高级的密码学工具（比如**零知识证明**和**同态加密**）也将可用

> 通过私钥可以推算出公钥，但是通过公钥无法反向计算得出私钥，因为这个数学算法是单向的

> 以太坊地址是十六进制的数字，来自于公钥经过Keccak-256哈希运算之后得出结果的后20位

区块链的基础是共识，共识的基础是知识（真实性）证明，密码学是用来对知识进行证明的。

[https://ethfans.org/posts/zero-knowledge-proofs-illustrated-primer](https://ethfans.org/posts/zero-knowledge-proofs-illustrated-primer)

[https://www.infoq.cn/article/ihal9cagg9fy7algmpuy](https://www.infoq.cn/article/ihal9cagg9fy7algmpuy)

第5章 钱包
======

> 钱包就是包含了一对私钥和公钥的钥匙圈。用这些私钥签名交易，用户就可以证明自己对以太币的所有权，以太币本身是保存在区块链之上的

只有正确的公钥和私钥才能证明加密过的信息是准确的，只有你的私钥能够证明你的交易信息（交易共识即是所有权）是准确的；因此钱包 💰 即是你的身份

第6章 交易
======

> 交易是由**外部账户**发出的经过签名的消息，通过以太坊的网络传播，由矿工记录在区块链上……交易是唯一能够触发区块链状态改变，或触发EVM上的合约执行的东西

交易由用户从自己的钱包 💰 （外部账户）发出，可以是转账给另一个账户，也可以转账给智能合约（如同投币一样，触发智能合约执行）。

> 在像以太坊这样的去中心化系统中，节点会以任意顺序接收交易；没有任何方法能保证某个节点在另外一个节点之前接收到某笔交易

交易信息需要在全部节点同步才能确认，这也是导致交易速度慢的原因之一。为了解决这一问题，交易信息中保存了一个 `nonce` 值，用以代表交易的序列编号，从而防止因延迟导致的重复交易。

相当于把 🪙 投进了黑洞，抬升市场价值

> 你可以向一个没有对应私钥的“地址”发送以太币，这就相当于是销毁以太币。接收方地址的验证工作需要在用户应用这一层完成……由于以太币的数量是有限的，销毁以太币能有效地将价值传到所有以太币持有者手上（按照他们持有以太币的比例）

> 合约注册交易的目的地址是一个特殊的地址——零地址。简单地说，合约注册交易的`to`字段包含的是`0x0`。这个地址既不是一个外部账户地址（没有与之对应的私钥或者公钥），也不是一个合约地址

第7章 智能合约与 Solidity
==================

> 对于触发智能合约执行的交易上下文，或执行时的以太坊区块链状态，智能合约执行结果的输出对于每一个运行或调用它的人来说都是一样的

在智能合约（或者说智能合约的运行环境 EVM）中，不存在随机函数。

> 任何情况下智能合约的“并发执行”都是没有意义的：以太坊世界计算机可以被认为是一台单线程的计算机

第8章 智能合约与 Vyper
===============

> Vyper是一个功能强大且有趣的新的面向合约编程语言。它的设计理念偏向于“**正确性**”，从而牺牲了一些灵活性

Vyper is a **contract-oriented**, **pythonic** programming language that targets the [Ethereum Virtual Machine (EVM)](https://ethereum.org/learn/#ethereum-basics).

第9章 智能合约安全
==========

> DAO（Decentralized Autonomous Organization，去中心化自治组织）攻击是以太坊早期发生的一个严重攻击。当时这个合约持有的资产价值超过1.5亿美元。重入在这次攻击中扮演了主要角色，最终导致了硬分叉，并创造出了以太坊经典（Ethereum Classic，ETC）。对DAO漏洞的详尽分析请参考 [http://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/](http://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/)

第10章 代币 - Tokens
================

> 基于区块链的代币已经重新定义了这个词，区块链上的代币是指基于区块链的一种抽象资产，**可以被持有并且用来代表资产、现金或访问权限**

> 以太坊账户的**以太币**余额在**协议级别**处理，而以太坊账户的**代币**余额在**智能合约级别**处理。要在以太坊上创建新代币，你必须创建一个新的智能合约

以太坊中的代币是智能合约的一种应用，ERC-20 （以太坊需求提议，编号20）约定了一种代币的发行与转让机制，就像公司的股权分配机制一样，它约定了总的股权数量，并记录股权持有者之间的交易过程；不同的是因为它是基于以太坊的智能合约，所以一旦发布，所有规则、交易信息都是公开透明且不能更改的。

从技术的角度来看，ERC-20 定义了一组函数和事件，就像是面向对象中的接口（Interface），所有发行代币的智能合约都必须实现接口中的方法，这样所有的代币之间就可以方便地进行沟通。

[https://ethereum.org/en/developers/docs/standards/tokens/erc-20/](https://ethereum.org/en/developers/docs/standards/tokens/erc-20/)

[https://ethereum.org/en/developers/docs/standards/tokens/erc-20/](https://ethereum.org/en/developers/docs/standards/tokens/erc-20/)

[https://ethfans.org/posts/understanding-erc-20-token-contracts](https://ethfans.org/posts/understanding-erc-20-token-contracts)

> ERC20代币另一个不太明显的问题是：它体现出了代币和以太币之间微小的差异……代币合约跟踪余额并发出事件。在代币的转账过程中，并没有任何针对接收方地址的交易。接收方的地址被加入代币合约的**余额映射表**中。

ERC-20 就像一个嵌套在以太坊中的“微型以太坊”，持有某代币的用户可能会拥有这家“代币公司”的股权，但是有可能这是一家皮包公司，甚至是垃圾公司，它可能不产生任何价值。价值由共识决定，以太坊和 ERC-20 只是让产生共识的基础更加便利，就像政府为鼓励创业允许1元钱注册公司一样，这与能否真正创造价值并不相关。

第11章 预言机 - Oracles
==================

> 在区块链的上下文中，预言机是一个可以回答以太坊外部问题的系统

> 为了保持共识，EVM的执行过程必须完全确定，并且仅基于以太坊状态和签名交易的共享上下文。这产生了两个特别重要的后果：一个是EVM和智能合约**没有内在的随机性来源**；另一个是**外部数据只能作为交易的数据载荷**引入

区块链的特质之一就是一旦达成共识的数据则不得更改。这导致所有链上的数据都是确定的，两个后果：一是没有随机函数，而是外部数据只能作为数据不能作为可执行程序载入。

而真实世界中的数据大部分都是随机或持续变化的，这导致很多数据的来源人为或客观地无法被信任。以太坊需要获取真实世界中的数据，又不能损失其可信度。

[https://ethfans.org/posts/decentralised-oracles-a-comprehensive-overview](https://ethfans.org/posts/decentralised-oracles-a-comprehensive-overview)

[https://ethfans.org/posts/oracles-help-smart-contracts-resolve-subjective-events](https://ethfans.org/posts/oracles-help-smart-contracts-resolve-subjective-events)

> 设置预言机的三种主要方式可以分为**请求与响应**、**发布与订阅**和**立即读取**

*   立即读取：针对完全可以信任的的数据来源（如政府、官方机构发布的信息，例如学位证书）
    
*   发布与订阅：类似于 RSS
    
*   请求与响应：类似于传统 Web2.0 客户端与服务器之间的关系，区别是预言机要求保证数据的权威和可信
    

> 两种常见的数据认证方法是真实性证明（authenticity proof）以及可信执行环境（Trusted Execution Environment, TEE）

前者通过密码学算法（如数字签名）证明数据没有被篡改过，后者在硬件层面保证程序执行环境无法被干扰或攻击。

> ChainLink 已经提出了一种去中心化预言机网络，由三个关键智能合约（**声誉合约、订单匹配合约、数据汇总合约**）以及数据提供者的链外注册表组成

智能合约记录了数据提供者的信用水平，值得信赖的数据提供者将获得奖励，反之则受到惩罚。

> **预言机为智能合约提供了至关重要的服务：它们将外部事实带入合约执行**

第12章 去中心化应用 - DApps
===================

### 后端

> 任何在智能合约中执行的计算都特别昂贵，所以应该保持智能合约尽量小

> 智能合约架构设计的一个主要考虑因素是，一旦合约代码被部署，就无法对其进行修改

去中心化应用后端（业务逻辑）的约束主要体现在“昂贵”，无论是运行消耗的 `gas`，还是一旦部署无法修改所带来的安全风险。

### 前端

DApps 对基于 Web 的前端技术来说没有差异

> 但目前没有创建移动端DApp的最佳实践，主要原因是缺少具有密钥管理功能的移动客户端来承担轻客户端角色

### 数据存储

> 大多数 DApp 利用链下数据存储服务，这意味着它们将大量数据存储在（链下）数据存储平台上，而非以太坊链上。数据存储平台可以是中心化的（例如典型的云端数据库），也可以是诸如 IPFS 和以太坊自有平台 Swarm 等点对点形式的

取决于你是否足够信任中心化云端数据库是否值得信任，信任的等级取决于最坏能够承受多大的损失。

### 消息通信

> 对DApp来说，最值得关注的P2P消息协议是Whisper

### 名称解析

> ENS主要由三个以太坊改进方案定义：**EIP-137**，规定了ENS的基本功能；**EIP-162**，描述了根`．eth` 的拍卖系统；**EIP-181**，规定了地址的反向注册规则。

基于以太坊的域名解析服务，约定了钱包地址和域名地址之间的映射关系。

> **去中心化应用是以太坊的终极愿景**

第13章 EVM
========

> EVM的任务是基于以太坊协议、根据智能合约代码的执行来计算合法的状态转换，用以更新以太坊的状态。

> `gas`是以太坊中极其重要的组成部分，它扮演了双重角色：作为以太坊中浮动的价格和矿工奖励之间的缓冲，以及对抗拒绝服务攻击的防范措施。

gas 的设计目的一方面是为了抵御类似 DDoS 的恶意攻击，但是当币圈炒起来，大量“正常”交易极大拉高了 gas 费用，甚至已经影响了正常的用户使用（如上文所示，gas 费用远远高于实际转账数十倍的情况）。

Vitalik Buterin 最近提议的 EIP-4488 将 Layer2 视作以太坊中短期乃至长期实现规模扩张的唯一方案。

> **Rollups are in the short and medium term, and possibly the long term, the only trustless scaling solution for Ethereum.**

[https://news.coincu.com/38718-vitalik-buterin-makes-proposal-eip-4488-to-lower-gas-fees-for-ethereum-layer-2-in-the-short-term/](https://news.coincu.com/38718-vitalik-buterin-makes-proposal-eip-4488-to-lower-gas-fees-for-ethereum-layer-2-in-the-short-term/)

[https://github.com/ethereum/EIPs/pull/4488/commits/74570b55dc5a091e4ab46fdf0f139f6a1ee013a6](https://github.com/ethereum/EIPs/pull/4488/commits/74570b55dc5a091e4ab46fdf0f139f6a1ee013a6)

第14章 共识 - Consensus
===================

> “共识规则”：为了让整个系统可以去中心化且确定性地运行，每个节点都必须同意的一套规则

> 挖矿（以及其他所有共识模型）的真实目的都是保护区块链的安全，同时保证对系统的控制权是去中心化的（在参与者之间尽可能广泛地分布）。把新铸造的货币作为奖励是激励人们为系统安全做贡献的措施：这只是用于达成目标的一种手段，而不是目的本身。**奖励只是工具，去中心化的安全性才是目的**

> 以太坊的PoW算法被精心地置入了一个叫作“难度炸弹”的机制，目的就是逐渐让以太坊的PoW挖矿变得越来越难，迫使网络转向PoS

通过共识算法，配合激励手段，可以维持去中心化系统的正常运行，这件事基本已经在理论和实践层面都被证明是可行的。但是这只解决了“**安全**”或“**所有权**”的基本问题，接下来以太坊要考虑的是如何提供更大规模、更快的交易速度、更合理的 gas 费用，这也是 Ethereum 2.0 的主要目标。下面是 Vitalik Buterin 给出的技术路标：

*   参考阅读 - Endgame
    
    [Endgame](https://vitalik.ca/general/2021/12/06/endgame.html)
    

> **整个区块链行业都是一个大型实验，这些问题会在敌意环伺的环境中测试，并且还会赌上巨大的经济价值。说到底，历史会告诉我们答案**

---

*Originally published on [Cybrain](https://paragraph.com/@cybrain/hey-ethereum)*
