# About BTC & ETH & EVM 

By [Untitled](https://paragraph.com/@0x782fa23a5c780ec6d72de7a9615dd95eba973339) · 2023-09-25

---

比特币白皮书
======

1.  **摒弃中心化机构**：白皮书批评了传统金融体系中的银行和政府机构，认为它们过于集中权力和控制货币。比特币的目标是通过去中心化来减少对第三方机构的依赖。白皮书描述了比特币的目标，即创建一种去中心化的电子现金系统，使人们能够在互联网上直接进行点对点的价值交换，无需依赖中间机构，如银行。
    
2.  **区块链技术**：白皮书提出了区块链技术的概念，描述了一种分布式账本系统，其中交易按照时间戳记录在区块中，然后链接成一个不断增长的链。这种技术用于确保交易的透明性和安全性。
    
3.  **工作量证明（Proof of Work，PoW）**：比特币白皮书详细解释了PoW机制，它是比特币网络用来验证和添加新交易到区块链的方式。矿工通过解决数学难题来获得权利添加新区块，并获得相应的比特币奖励。
    
4.  **货币发行**：白皮书规定了比特币的总供应量为2100万枚，并描述了比特币的发行方式，即每个区块奖励的比特币数量会逐渐减少，以控制通货膨胀。
    
5.  **双花问题的解决**：白皮书讨论了比特币如何防止同一比特币被多次花费的问题，通过区块链的不可篡改性和网络中的共识机制来解决这个问题。
    
6.  **去中心化的维护**：白皮书强调了比特币网络的去中心化特性，没有单一机构或个人控制网络。矿工和全节点参与者一起维护网络的安全性和稳定性。
    
7.  **电子现金**：中本聪在白皮书中将比特币描述为一种点对点电子现金系统，允许用户直接在互联网上进行价值交换，而无需依赖中间人。
    
8.  **电子签名**：文档提到了数字签名的重要性，以验证交易的真实性和完整性。
    

以太坊白皮书
======

1.  **智能合约**：以太坊白皮书首次提出了智能合约的概念，这是自动执行的计算机程序，能够根据预定的规则和条件执行操作。以太坊的目标是提供一个去中心化的平台，使开发者能够创建和部署智能合约。
    
2.  **以太坊虚拟机（EVM）**：白皮书介绍了以太坊虚拟机（EVM），它是以太坊网络上智能合约的运行环境。EVM执行智能合约的计算，并使用以太币（ETH）来支付计算成本。
    
3.  **去中心化应用（DApp）**：白皮书提出了DApp的概念，这是建立在以太坊平台上的应用程序，可以在区块链上运行，而不依赖于单一的中心化服务器。
    
4.  **以太币（ETH）**：白皮书描述了以太币（ETH）的角色，作为以太坊网络中的数字货币，不仅用于支付交易费用，还可以用作智能合约的内置货币。
    
5.  **区块链技术**：白皮书解释了以太坊的区块链技术，包括区块结构、交易验证机制、共识算法（最初是PoW，后来计划过渡到PoS，即权益证明）等。
    
6.  **治理和发展**：白皮书提出了以太坊的治理模式，包括如何做出协议更改和改进，以保持网络的升级和发展。
    
7.  **应用领域**：白皮书讨论了以太坊的应用领域，包括金融服务、供应链管理、投票系统、游戏等各种潜在应用。
    

以太坊黄皮书
======

1.  **以太坊虚拟机（EVM）**：文档详细描述了以太坊虚拟机（EVM）的结构和功能。EVM是以太坊上智能合约的执行环境，它定义了指令集和状态转换规则。
    
2.  **状态转换和区块链结构**：文档解释了以太坊中状态的概念，以及如何在区块链上记录和更新状态。它还描述了区块的结构，包括交易和状态根。
    
3.  **合约和交易**：文档介绍了以太坊智能合约的概念，包括合约的创建、执行和销毁。它还解释了交易的类型，如消息交易和合约创建交易。
    
4.  **燃气（Gas）**：以太坊使用燃气来控制合约的执行成本和防止滥用。文档详细说明了燃气的概念，包括燃气成本和限制。
    
5.  **消息和消息调用**：以太坊合约可以相互通信，文档解释了消息的发送和接收方式，以及合约间消息调用的执行。
    
6.  **椭圆曲线密码学**：以太坊使用椭圆曲线密码学来处理地址和私钥。文档可能包括有关以太坊使用的密码学算法的详细信息。
    
7.  **以太坊协议**：文档可能提供有关以太坊网络协议的信息，包括节点之间的通信、块同步和共识机制（通常是PoW，Proof of Work）的细节。
    
8.  **JSON-RPC接口**：以太坊节点提供了JSON-RPC接口，包括有关如何使用该接口与以太坊网络进行交互的信息。
    
9.  **共识机制**：以太坊最初使用工作量证明（PoW）达成共识，后转向权益证明（PoS）机制，被称为"Ethereum 2.0"。
    
10.  **以太坊2.0（Serenity）**：以太坊黄皮书也讨论了以太坊将如何通过引入权益证明（PoS）和分片技术提高可扩展性的转型计划。
    

Evm Opcodes
===========

EVM的基本架构主要包括堆栈（后进先出），内存，存储，EVM字节码，和燃料费

![](https://storage.googleapis.com/papyrus_images/3a7323d99dacd7fb6bcb4584c6b3fc84f99ed3fc3abc66dde32266aa101e1676.png)

*   **比较（Comparison）指令**: 这些指令用于比较堆栈顶部两个元素。如，`GT`和`LT`
    

#### 执行模型

1.  当一个交易被接收并准备执行时，以太坊会初始化一个新的执行环境并加载合约的字节码。
    
2.  字节码被翻译成Opcode，被逐一执行。每个Opcodes代表一种操作。
    
3.  每执行一个Opcodes，都要消耗一定数量的Gas。如果Gas耗尽或者执行出错，执行就会立即停止，所有的状态改变（除了已经消耗的Gas）都会被回滚。
    
4.  执行完成后，交易的结果会被记录在区块链上，包括Gas的消耗、交易日志等信息。
    

*   **堆栈（Stack）指令**: 这些指令直接操作EVM堆栈。包括`PUSH`堆栈和从堆栈中`POP`。
    
*   **算术（Arithmetic）指令**: 这些指令用于EVM中数学运算，如`ADD`、`SUB`、`MUL`和`DIV`
    
*   **位运算（Bitwise）指令**: 这些指令用于在位级别上操作数据。如，按位与（`AND`）和按位或（`OR`）
    
*   **内存（Memory）指令**: 这些指令用于操作EVM的内存。如，读取到堆栈`MLOAD`和存储到内存`MSTORE`
    
*   **存储（Storage）指令**: 这些指令用于操作EVM的账户存储。如，将存储中的数据读取到堆栈（`SLOAD`）和将堆栈中的数据保存到存储（`SSTORE`）。这类指令的gas消耗比内存指令要大。
    
*   **控制流（Control Flow）指令**: 这些指令用于EVM的控制流操作，比如跳转`JUMP`和跳转目标`JUMPDEST`。
    
*   **上下文（Context）指令**: 这些指令用于获取交易和区块的上下文信息。如，获取msg.sender（`CALLER`）和当前可用的gas（`GAS`）。
    

Evm Opcodes Cost
================

1.  **SLOAD & SSTORE**：100
    
2.  **MLOAD & MSTORE**：3
    
3.  **SHA3**：30
    
4.  **CALL & DELEGATECALL**：100
    
5.  **CREATE or CREATE2**：32000
    
6.  **JUMP（跳转）和JUMPI（条件跳转）**：8 & 10
    
7.  **ADD、SUB、MUL（加法、减法、乘法）**：3 & 5
    
8.  **BALANCE**：100
    
9.  **POP**：2
    

以太坊底层原理
=======

RLP
---

用于将各种数据类型（如整数、字符串、列表等）转换为字节数组以在以太坊上进行存储和传输。RLP的目标是在保持数据完整性的同时最小化存储空间的使用，被广泛用于以太坊中的数据结构，如区块、交易和状态树的表示，助于以太坊节点在网络上传输数据，以及在状态树中存储和更新智能合约的状态。

1.  **递归性**：RLP可以嵌套包含子数据，从而允许处理复杂的数据结构，例如列表或树。
    
2.  **前缀表示长度**：RLP使用前缀表示数据的长度，这使得解码时可以知道如何正确地拆分数据。
    
3.  **空数据的编码**：空数据的RLP编码是一个单字节，用于表示空字符串或空列表。
    
4.  **非负整数的编码**：正整数的RLP编码通常是它们的二进制表示形式，但删除前导零。
    
5.  **字符串编码**：字符串的RLP编码包括前缀和实际数据。前缀的起始字节标识了数据的长度范围。
    
6.  **列表编码**：列表的RLP编码包括前缀和包含元素的RLP编码。前缀指示了列表的总长度。
    

MPT
---

基于Merkle树的数据结构，用于高效存储状态和验证数据（包括账户和合约），有效地检索和更新以太坊的全局状态。它将状态映射到哈希值，并且具有高度持久性，每个状态更改都会创建一个新的版本，而旧版本不会被修改，使得它非常适合于以太坊的可扩展性，因为它允许在不影响全局状态树的情况下处理每个区块的交易历史。

1.  **键值对存储**：MPT用于存储键值对，其中键是256位的字节序列，值可以是任何数据类型。这允许以太坊存储各种各样的数据，包括智能合约状态、交易历史等。
    
2.  **状态树和交易树**：以太坊的全局状态（智能合约的存储状态）和每个区块的交易历史都由MPT表示。全局状态树存储所有智能合约的状态，而每个区块都有一个单独的交易树，用于存储交易的数据。
    
3.  **MPT的节点**：MPT包含三种类型的节点：扩展节点、叶子节点和分支节点。扩展节点用于共享相同前缀的键，叶子节点存储键值对，而分支节点用于连接子树。
    

ECC
---

ECC基于特定椭圆曲线上的数学运算，用于实现以太坊中的地址生成、数字签名和密钥管理。

1.  **公钥和私钥**：在ECC中，每个账户都有一对公钥和私钥。私钥用于生成数字签名，而公钥用于验证签名。
    
2.  **数字签名**：用私钥生成数字签名。只有持有正确私钥的人才能生成有效的数字签名。
    
3.  **地址生成**：以太坊使用公钥来生成账户地址。地址是公钥的哈希值，用于识别和交流账户。
    

同态加密
----

以太坊智能合约使用同态加密来处理加密的用户数据。当用户将数据传递给合约时，数据首先由用户进行加密，然后传递给合约。智能合约可以在不解密数据的情况下执行操作，并返回加密的结果。还可用于多方计算场景，其中多个参与者可以合作进行计算，而无需共享原始数据。这在隐私敏感的应用中非常有用。

Decentralization
----------------

1.  **分布式网络**：以太坊是一个分布式网络，它由许多节点组成，这些节点分布在全球各地。这种分布式结构使得以太坊不依赖于单一中心化实体或服务器。由于去中心化，以太坊没有单一点故障。即使某些节点出现故障或被攻击，网络仍然可以继续运行。去中心化使得以太坊网络具有抵抗审查和封锁的能力。由于没有单一实体控制网络，很难关闭或审查以太坊上的活动。
    
2.  **共识机制**：采用一种共识机制来确保所有节点就网络状态达成一致。
    
3.  **开放参与**：以太坊的去中心化意味着任何人都可以参与网络，创建智能合约、发起交易、成为矿工等。
    
4.  **数据存储和智能合约**：去中心化思想也扩展到数据存储和智能合约。数据存储可以在分布式网络中进行，而智能合约允许去中心化的应用程序运行，无需信任中间人。
    
5.  **自治和治理**：以太坊社区通过治理流程参与网络的决策，以确保网络的进化和改进是开放和去中心化的。这包括参与协议升级和决策制定。
    

共识机制
----

1.  **PoW（Proof of Work）**：
    
    *   简要描述：PoW是比特币等区块链网络中使用的共识算法。它要求矿工解决一个复杂的数学难题，以创建新的区块，并需要大量计算能力。首先解决问题的矿工获得奖励。
        
    *   特点：安全性高，但能源消耗大。
        
2.  **PoS（Proof of Stake）**：
    
    *   简要描述：区块创建和验证的权利由持有加密代币的人分配，权益越大，参与权益证明的机会越多。将一定数量的ETH抵押到信标链（用于管理PoS验证者和共识规则），与PoW链之间跨链通信，以实现共识状态的同步。
        
    *   特点：节能，但可能导致富者愈富。
        
3.  **DPoS（Delegated Proof of Stake）**：
    
    *   简要描述：DPoS引入了代表制度。代表节点由持币人投票选举产生，负责创建和验证区块，并受到持币人的监督。减少了计算和能源需求。
        
    *   特点：高度可扩展，但可能存在中心化风险。
        
4.  **PBFT**：
    
    *   简要描述：PBFT侧重于处理拜占庭错误（分布式系统中的恶意错误节点），用于分布式系统。由主节点广播给副本节点后验证，然后等待其他副本节点验证，最后提交。要求超过一半节点诚实，确保交易可靠和不可逆。
        
    *   特点：快速、可靠，但对节点数量和延迟要求较高。
        
5.  **Paxos**：
    
    *   简要描述：Paxos是一种分布式共识算法，用于达成一致性。它通过提出议案和多数派接受议案的方式来达成一致性，通常用于复制日志等任务。
        
    *   特点：安全，但相对复杂。
        
6.  **Raft**：
    
    *   简要描述：Raft旨在提供易于理解和实现的分布式一致性。它使用领导者选举和节点日志复制来实现共识。
        
    *   特点：简单易懂，适用于一些分布式系统。
        

常见区块链平台
=======

Polkadot
--------

*   **多链架构**：包含一个称为"Relay Chain"的主链和多个平行链。Relay Chain是整个网络的安全性中心，负责管理和桥接，共享安全性。而平行链可以独立运行，并通过Relay Chain与其他链互通，允许平行链之间通过桥接建立连接，实现跨链交互和资产传输。这种结构使得Polkadot可以同时运行多个不同的区块链。
    
*   **平行链和Parathreads**：平行链可以自定义自己的规则和功能，并与Relay Chain交互。Parathreads是一种更轻量级的链，可以按需租用Relay Chain上的资源，而不需要一直运行。这增加了网络的灵活性。
    
*   **NPoS 共识机制**：Polkadot的Relay Chain采用的是一种权益证明（Proof of Stake，PoS）共识算法，被称为"Nominated Proof-of-Stake"（NPoS）。这意味着参与网络共识的节点（验证者）需要锁定一定数量的DOT代币作为抵押，并获得验证权。
    
*   **智能合约和状态机**：使用WASM作为智能合约的执行环境，开发者可以使用 Substrate 构建自定义的状态机。
    

**运行方式**：

1.  **验证者选举**：验证者通过 NPoS 共识机制选举产生。这些验证者负责验证平行链的交易和区块，并维护网络的安全性。
    
2.  **平行链的部署**：平行链的开发者可以使用 Substrate 框架构建自定义的平行链，并将其部署到 Polkadot 网络上。部署后，平行链可以与其他链互操作，并共享Polkadot 安全性。
    
3.  **擦除式验证**：Polkadot引入了一种称为"Babe"和"Grandpa"的擦除式验证机制。Babe处理区块生产，而Grandpa用于达成最终性。这两个机制增加了网络的安全性和可扩展性。
    
4.  **交互协议**：使用一种名为"XCMP"（Cross-Chain Message Passing）的协议来实现平行链之间的互操作。这使得平行链可以安全地交换消息和数据。
    
5.  **治理和升级**：采用了一种称为"Referendum"的治理机制，允许DOT代币持有者提出和投票支持提案。这使得网络的升级和决策可以由社区共同决定。
    
6.  **安全性和不可逆性**：使用多数派共识机制来确保安全性，并使用不可逆性机制来确保一旦交易被确认，就不能被更改。
    

Cosmos
------

*   **多链架构**：Cosmos采用了一种多链架构，其中包含一个称为"Hub"的主链（也称为"区块链互联网"）和多个平行链（称为"Zones"）。Hub充当网络的中继器，而Zones是相对独立的区块链，它们可以自定义自己的规则和功能。
    
*   **IBC 协议**：Cosmos 使用 Inter-Blockchain Communication协议来实现不同区块链之间的互通和互操作。IBC允许资产和数据在不同区块链之间传输和交互，实现了跨链通信。
    
*   **安全性和治理**：Cosmos 使用类似于 PoS 的共识机制，其中验证者负责打包交易和维护网络的安全性，而委托人可以委托他们的代币来支持验证者。持有ATOM代币的人可以投票支持提案，包括协议升级、参数更改等。
    
*   **Tendermint共识引擎**：Cosmos使用Tendermint共识引擎来处理交易验证和区块链同步。它通过一组验证节点来达成BFT共识。这些节点通常是通过投票选举产生的，具有一定数量的权益。共识过程分为三个主要阶段：由一个验证节点提出一个新的区块提案，包含待处理的交易，被放置在一个未确认的交易池中，按照预定的顺序进行处理。其他验证节点收到提案后，对提案进行预投票，表示他们认可这个区块。当超过2/3的验证节点都预投票后，提案被视为合法。一旦一个区块的提案得到足够的预投票，节点就会提交这个区块并添加到区块链中。
    

Gas优化
=====

1.  变量声明为constant immutable 使用位运算符
    
2.  函数参数声明为calldata memory
    
3.  循环使用unchecked避免溢出检查
    
4.  uint256占满32字节插槽最节省gas，变量打包（在一个插槽中放置多个变量）
    
5.  revert配合error最省gas，同时可以携带变量。require的gas随字符串长度增加
    
6.  运算中使用局部变量
    
7.  创造子合约时 clone > new > create2
    
8.  增加使用`i = i +n`，递增使用 `++i`
    
9.  重入保护中，使用Uint12 > Uint01 > Bool，0到非0转换会消耗大量gas
    
10.  "<" 和 ">"比"≤" 和 "≥"更加高效，EVM没有针对"≤" 和 "≥"的OPCODE
    
11.  通过优化函数名，增加calldata中方法id的0字节的个数来节省gas（0字节消耗 4 gas，非0字节消耗 16 gas）
    
12.  合约内所有函数是一个数组，调用时会先遍历，通过排序函数减少遍历复杂度
    
13.  短路判断，update后delete变量或恢复初始值，创建变量时不赋值（使用初始值）
    
14.  构造函数非payable，使用bytes32存字符串，使用定长数组，使用事件存储数据，mapping操作比array便宜

---

*Originally published on [Untitled](https://paragraph.com/@0x782fa23a5c780ec6d72de7a9615dd95eba973339/about-btc-eth-evm)*
