# 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 位长度的十六进制数,没有私钥。
- 两种账户都能交易代币、使用智能合约。
- 创建外部账户是免费的,而创建合约账户需要付费。
- 外部账户(Externally-owned)
生成外部账户的步骤:
- 根据椭圆曲线 secp256k1 生成一对公钥、私钥,长度都为 32 bytes 。
- 将私钥表示成 64 位长度的十六进制数。
- 计算公钥的 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 。给得越多,越容易被矿工打包。
- Base Fee(基础费用)
用户请求交易时,需要声明以下信息:
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 。
- 之前,用户交易付出的 Gas 会全部交给矿工。之后,用户交易付出的 Gas 分为 Base Fee、Priority Fee 两部分。
计划升级到 ETH 2.0 ,大幅提高网络吞吐量,分为 3 个阶段:
- 2020 年 12 月部署信标链,采用 PoS
- 2022 年,将信标链与原链合并
- 分片链,将网络分散到 64 条链上
- 难度炸弹:从某个区块开始,指数级增加 PoW 挖矿的难度,逼迫矿工转向 PoS 挖矿。