ETH vs. BTC
ETH | BTC | |
---|---|---|
出块速度 | ~15s | ~10min |
共识机制 | GHOST | 最长合法链 |
证明方式 | 工作量证明(Proof of Work) → (正在逐步转向) 权益证明(Proof of Stake) | 工作量证明 |
挖矿设备 | 高内存(专门这么设计, 尽量不使用专用矿机) | 高计算量(适合ASIC) |
账户 | account-based ledger | transaction-based ledger |
突出特点 | 智能合约 |
账户
ETH使用的是account-based ledger, 对应在区块链中会保存一颗状态树(后面详述). 状态树主要是记录了账户的余额等, 同时为了防止重放攻击(replay attack), 在区块链中还会记录转账者的转账次数.
ETH的账户有两种: externally owned account(外表账户/普通账户), 这种账户类似于BTC的账户, 基于公私钥机制进行管理; 另外一种是smart contract account(智能合约账户), 这是专门为了智能合约设计的账户. 智能合约账户也有对应的余额和交易次数, 同时还有自己代码code和变量取值storage, 但是智能合约账户不能主动发起交易, 只能作为交易的收账者.
状态树, 交易树 & 收据树
ETH有三棵树, 分别是状态树, 交易树和收据树.
状态树是使用了类似于Trie的方式构建merkle tree, 同时为了进一步压缩空间, 使用了压缩Trie, 在ETH中这种结构被称为Merkle Patricla Tree(MPT). 另外, 由于每个新建的区块涉及改变的账户个数很少, 因此进一步用了类似于可持久化的方式复用空间, 而且状态树中也包含了智能合约的状态, 里面的变量取值存储也能用了类似可持久化的结构.
除了状态树, 交易树和收据树也都是MPT, 交易和收据一一对应, 收据树是记录交易的运行结果.
此外, 为了能够快速高效查找某个元素是否在某大型集合内, 每个区块头都有一个bloom filter.
GHOST协议
GHOST协议主要解决的问题是, 在把出块时间减少的情况下, 如何很好地改进BTC的共识机制. 在短出块时间的情况下, BTC现有的共识机制的问题是orphan block是无收益的, 这会造成mining centralization会造成不成比例的优势.
GHOST协议的主要思想是承认叔父区块(7/8的奖励), 并对承认叔父区块的新区块给予(1/32)的奖励. 此外,
鼓励尽快合链 → 每个区块最多只允许两个叔父区块
不鼓励远古的叔父 → 合法叔父区块的距离有限制, 只有6种叔父区块.
ETH的区块奖励没有类似于BTC的四年减半的规定
为了防止交易冲突, 叔父区块的上的交易不会执行
交易费
在ETH中, 类似于BTC的交易费被称为gas fee.
gas是支付给矿工的, 创造交易需要gas fee, 运行智能合约也需要gas free.
另外交易费的存在也有防止智能合约陷入死循环的作用, 不同的语句需要的gas fee不同.
挖矿算法
为了避免矿力的集中化, 设计的挖矿算法需要ASIC resistance, 一个方向是设计memory hard mining puzzle.
一个典型的早期加密货币莱特币(Litecoin), 用的是scrypt这种算法, 其主要思想是生成一个包含哈希值的哈希数组, 在数组的元素之间进行跳转, 计算下一次跳转的位置需要当前位置的元素参与运算. 这样的方法的一个缺点是对轻节点的内存压力也很大, 因此莱特币只设计了128KB的哈希数组, 在后来也能在ASIC上运行.
ETH在莱特币的基础上进行了改进, 设计了ethash
算法. 这个算法有一大一小两个哈希数组(16M cache + 1G dataset DAG), 并且哈希数组的大小都会定期更新, 来适应计算机技术的发展.
大的DAG是在小的cache上进一步用哈希算法生成的哈希数组.
16G的cache可用于轻节点的快速验证, dataset的值可以在轻节点上临时计算生成.
目前ETH主流的挖矿设备是GPU.
难度调整
ETH是自适应的难度调整, 目标稳定出块时间在15s左右.
「难度炸弹」
在ETH的难度调整公式中, 存在一项与区块次数成指数增长关系的“难度炸弹”, 设置这一项的目的主要是为了向转入权益证明做准备. 但是由于权益证明开发进度较慢, 在EIP(Ethereum Improvement Proposal)中曾经进行了一次“难度炸弹的回调“, 并同时把出块奖励从5个将为3个.
权益证明
ETH转向权益证明的出发点主要有: (1)节约能源(据统计平均一笔BTC交易需要1k+度电) (2) 避免altcoin infanticide. 权益证明的主要思想是, 用持有的币的数量来决定挖矿难度, 持有的币越多, 挖矿难度越小.
「Proof of Deposit」用于权益证明的投入的币, 在一段时间内不可再用.
在ETH中, 主要通过Casper, 一种friendly finality Gadget(FFG)的机制来解决“两边下注”问题. Casper引入了验证者的概念: 持币者可以投入一定数量的保证金来担任社区的验证者, 并使用two-phase commit
的机制.
除了权益证明, 还有一种称为代理权益证明(Delegated Proof of Stake)的机制, EOS在使用.
智能合约
智能合约账户保存了当前的账户余额, 交易次数, 代码和变量存储(用MPT的方式)等. Solididty
是智能合约最常用的语言, 与JavaScript比较接近.
「智能合约的创建」向特殊地址0x0发生一个转账交易即可.
「智能合约的运行」
- 普通账户只需要向智能合约发起转账交易并在data域指定函数和参数即可
- 智能合约账户也能调用另外一个智能合约函数, 有三种调用方式(是否有连锁式回滚, 是否用调用函数的上下文环境)
- 但是一个智能合约本身不能主动发起交易.
- 另外, 每个智能账户还有一个默认调用函数
fallback
在新区块发布后, 其他全节点都需要重新执行一次智能合约来验证, 而且这也是必要的: 只有更新了本地的三棵树, 才能继续挖下一个区块.
另外, 有错误的交易也能发布到区块链上, 而且汽油费是照扣的.
汽油费
另外, 智能合约在调用中, 关于汽油费的分配有如下的三种函数(addr
是收账者地址):
addr.transfer(xxx)
: 被调用函数只有2300单位的汽油费addr.send(xxx)
: 被调用函数只有2300单位的汽油费addr.<call>(xxx)()
: 汽油费全给
反思
以太坊带来的一些反思_cactusblossom-CSDN博客