# ETH

:以太币(Ether),一种数字货币,由以太坊(Ethereum)区块链发行。

  • 官方文档 (opens new window)
  • 与 BTC 相比,以太坊提供了一种图灵完备的脚本语言,允许用户编写去中心化程序,部署在区块链中。

# 架构

  • 一些主机根据以太坊协议相互通信,组成了以太坊网络。这些主机称为以太坊节点。

  • 以太坊在程序中设计了一个以太坊虚拟机 (EVM) ,用于执行指令,比如交易、部署合约、调用合约。

    • 以太坊区块链负责保存 EVM 的当前状态,比如所有账户的余额。
    • 每个节点会存储区块链的一个副本。而 EVM 在逻辑上只存在一个实例。
  • 多次让 EVM 执行请求时,可能会重复使用一些指令。可以将这些指令上传到 EVM ,供以后调用,称为智能合约。

    • 智能合约实际上是保存在区块链中,对所有人公开可见、可调用。
    • 一些开发人员将程序的关键代码片段制作成智能合约,从而实现去中心化程序(Decentralized Application ,DAPP)。
    • 智能通常采用 Solidity 语言开发。
  • 关于 ETH 币:

    • 矿工打包区块时,会产生一些 ETH 作为奖励,
    • ETH 总量没有上限。
    • ETH 数量的最小单位为 Wei ,1 ETH = 10^18 Wei 。

# 区块

  • ETH 通过 MPT(Merkle Patricia Tree) 记录整个区块链当前的状态数据,又称为状态机。
    • 每个叶子节点记录一个账户的余额,每次交易时会更新账户的余额。
      • BTC 需要统计所有交易的输入、输出,才能确定所有账户的 UTXO 即余额。而 ETH 直接记录所有账户的余额。
    • 整个 MPT 的体积过大,因此:
      • 打包一个新区块时,只需增量更新 MPT ,而不必全量更新。
      • ETH 客户端不必将整个 MPT 载入内存,而是根据节点路径从磁盘读取子树。
  • 以太坊虚拟机 (EVM) :一个运行时环境,负责

# 账户

  • ETH 的账户地址分为两种:

    • 外部账户(Externally-owned)
      • :供普通用户使用,由私钥控制。
      • 示例:
        0xcf4ec3c95d568ac6fc8413d163e645d3375639bbec5e90f74aa21d2e8eb38c20  # 私钥
        0xfd5aC7632B2044D8D3F5C7ce08b9d69e8b93493e                          # 公钥
        
    • 合约账户(Contract)
      • :部署一个智能合约时会创建一个合约账户。地址为 40 位长度的十六进制数,没有私钥。
      • 两种账户都能交易代币、使用智能合约。
      • 创建外部账户是免费的,而创建合约账户需要付费。
  • 生成外部账户的步骤:

    1. 根据椭圆曲线 secp256k1 生成一对公钥、私钥,长度都为 32 bytes 。
    2. 将私钥表示成 64 位长度的十六进制数。
    3. 计算公钥的 keccak256 哈希值,取最后 20 bytes ,表示成 40 位长度的十六进制数,作为账户地址。
  • MPT 中,每个账户会记录以下数据:

    nonce         # 账户已执行的交易次数,从 0 开始递增
    balance       # 账户持有的 ETH 余额,单位为 Wei
    
    codeHash      # 合约账户的代码哈希值,用于从 EVM 数据库中获取智能合约。外部账户的该字段为空
    storageRoot   # 合约账户的存储哈希值,用于从 EVM 数据库中获取存储数据。外部账户的该字段为空
    

# 交易

  • 用户想让 EVM 执行指令时,需要广播交易(transaction)请求,等待矿工将该指令打包到新区块。

  • 常见的交易类型:

    • 常规交易:在账户之间转账 ETH 。
    • 部署合约
    • 调用合约:发送一些 ETH 和输入参数到合约账户,执行合约代码。
  • 每个请求需要消耗 EVM 的一些计算资源,称为 Gas 。

    • 以太坊网络的负载时大时小,因此同样的交易需要消耗的 Gas 数量经常变化。
  • 用户请求交易时,需要付出一些 ETH 费用。分为两部分:

    • Base Fee(基础费用)
      • :为了避免请求对 EVM 的负载过大,用户必须根据消耗的 Gas 量燃烧一些 ETH ,即永久销毁。
    • Priority Fee(优先费用)
      • :付给矿工的小费,可以为 0 。给得越多,越容易被矿工打包。
  • 用户请求交易时,需要声明以下信息:

    From          # 从哪个账户发送 ETH
    To            # 发送 ETH 到哪个账户
    value         # 发送的 ETH 数量,单位为 Wei
    data          # 自定义的数据,默认为空。常用于保存调用合约时的输入参数
    signature     # 用户根据私钥创建的签名,用于授权该交易
    
    gasLimit      # 该交易最多消耗多少单位的 Gas 。常规交易默认为 21000 ,调用合约可能需要更多 Gas 。
    maxFeePerGas  # Gas 最大单价。对于每单位 Gas ,用户最多愿意付出多少 Gwei
    maxPriorityFeePerGas  # 每单位 Gas 中,最多愿意付出多少 Gwei 作为矿工的小费
    gasPrice      # 每单位 Gas 等于多少 Gwei ,1 ETH = 10^9 Gwei
    
    • 用户请求交易之前需要估计最多付费:
      maxFeePerGas = (baseFeePerGas + maxPriorityFeePerGas)
      maxFee = maxFeePerGas * gasLimit
      
      实际付费为:
      FeePerGas = (baseFeePerGas + PriorityFeePerGas)
      Fee = FeePerGas * gasUsed
      
    • 如果实际付费 Fee 少于最多付费 maxFee ,则差额会退款。
    • 如果交易需要消耗的 Gas 超过 gasLimit ,则消耗完 gasLimit 之后交易会执行失败,不会退款。
  • 每个交易打包到区块之后,会产生一个回执(Recipt),表示该交易的结果。包含以下信息:

    status    # 交易是否成功。取值 1、0 分别表示成功、失败。比如账户余额不足时会交易失败
    gasUsed   # 实际消耗多少 Gas
    txHash    # 交易的哈希值
    
    txHash    # 交易的哈希值
    

# 相关概念

  • ERC-20(Ethereum Request for Comments 20)代币标准
    • 以太坊允许创建独特且不可分割的代币,称为不可替代代币(NFT)
  • 去中心化金融(DeFi)

# 相关历史

  • 2013 年,俄罗斯程序员 Vitalik Buterin 等人开始开发 ETH 项目。

    • BTC 的最初目的是提供一种去中心化的货币,实现价值存储功能。而 ETH 的最初目的是实现去中心化程序。
  • 2015 年,ETH 主网上线。

  • 20016 年 6 月,ETH 开始了 The DAO 项目,众筹了大量 ETH ,但是被黑客通过漏洞转走了 360 万个 ETH 。

    • 事发后,ETH 开发者的解决方案是,通过硬分叉将区块链回滚到事发之前的状态,从而回滚交易。
    • 一些社区用户反对该硬分叉,称它违反了区块链的不可篡改特性,因此继续使用原链,称为以太坊经典(ETC)。
  • 2018 年 1 月,ETH 成为市值第二大的数字货币,仅次于 BTC 。

  • 2019 年 2 月,ETH 实施一次升级,代号为君士坦丁堡。

  • 2021 年 8 月,ETH 实施一次升级,代号为伦敦。实施了 EIP1559 提案。

    • 之前,用户交易付出的 Gas 会全部交给矿工。之后,用户交易付出的 Gas 分为 Base Fee、Priority Fee 两部分。
      • 当一个新区块的 ETH 奖励少于燃烧的 Base Fee 时,ETH 的流通总量就会变少。
      • baseFeePerGas 是以太坊根据最近的网络负载计算出来的,因此用户只需要考虑 PriorityFeePerGas ,更容易预测交易需要付出的 Gas 。
    • 之前,区块的容量是固定的。之后,取消限制区块的容量,改为限制 Gas 总量,从而方便打包大体积的请求。
      • 每个区块的所有交易消耗的 Gas 总量称为 Gas Used 。
      • 一般情况下,每个区块期望的 Gas Used 为 15,000,000 ,称为 Gas Target 。最多消耗的量是其 2 倍。
      • 如果上一个区块的 Gas Used 高于 Gas Target ,则增加新区块的 baseFeePerGas ,反之减少 baseFeePerGas 。
  • 计划升级到 ETH 2.0 ,大幅提高网络吞吐量,分为 3 个阶段:

    1. 2020 年 12 月部署信标链,采用 PoS
    2. 2022 年,将信标链与原链合并
    3. 分片链,将网络分散到 64 条链上
    • 难度炸弹:从某个区块开始,指数级增加 PoW 挖矿的难度,逼迫矿工转向 PoS 挖矿。