1. 比特币和以太坊
比特币和以太坊(准确说是以太币)是两种最主要的加密货币。
比特币的最小计量单位是聪(Satoshi)【中本聪 Satoshi Nakamoto】
以太币的最小单位是Wei,这个单位非常小(沿袭了科学界的传统,用做过杰出贡献的数学、密码学专家的名字命名)
Wei
Kwei(Babbage)= 10 的 3 次方 Wei
Mwei(Lovelace)= 10 的 6 次方 Wei
Gwei(Shannon)= 10 的 9 次方 Wei
MicroEther(Szabo)= 10 的 12 次方 Wei
MilliEther(Finney)= 10 的 15 次方 Wei
Ether = 10 的 18 次方 Wei
比特币被称为区块链1.0,以太坊被称为区块链2.0,以太坊在设计上参考比特币,又进行了改进。它们之间有如下区别:
-
比特币是基于交易的(transcation-base ledger),以太坊是基于账户的 (account-base ledger)
以太坊使用的是一种账户系统(状态机)
-
以太坊出块时间降低到十几秒,而比特币是10分钟
-
比特币总量是2100W,以太币则是无限的
-
为应对出块时间缩短,设计了一套基于Ghost协议的共识机制
-
mining puzzle调整
比特币的mining puzzle是计算密集型,比拼的是计算hash的算力,使得挖矿设备专业化
以太坊设计成对内存要求很高,一定程度上限制了ASIC挖矿设备的使用
未来以太坊还会用 权益证明 替代 工作量证明
-
比特币交易费计算简单,通常以每字节聪为来算。以太坊则因计算复杂性、带宽使用和存储需求(gas fee)而不同。以太坊Gas单位的价格可以在交易中指定。通常以GWEI为单位进行测量。
-
以太坊里面有叔块的概念,对未能成为主链的挖矿成功的区块也有挖矿奖励,相对来说系统比比特币系统更公平。
-
引入智能合约
其实并不智能,甚至叫 “自动合约” 更贴切。
■去中心化的货币:
货币本身由政府发行,货币的价值建立在政府公信力的基础上,政府通过司法手段维护货币体系的正常运行
BTC的出现,通过技术手段取代了政府的职能。
■去中心化的合约:
现实生活中,合约的有效性也是需要政府进行维护的,如果合同产生纠纷可以通过打官司
去中心化合约的目的 就是通过技术手段取代政府对于合约的职能。
但是,不是所有的合同内容都是可以通过编程语言实现的,也不是所以的合同条款都是可以量化的。只有内容比较简单,逻辑比较清晰的才可以写成智能合约的形式。
2. 以太坊账户
比特币是基于交易的,系统中并未记录账户有多少钱,只能通过UTXO进行推算。优先是隐私保护比较好,缺点是用起来不方便 别扭。
在BTC中,A给B转账的时候,需要说明币的来源,而且币要一次性全部花出去(否则对于的钱就被当做交易费了)
Ethereum采用的是账户模式,每个地址类似一个银行账户,转入转出记录都在同一个账户上,使用独特的参数Nonce来标记交易的先后顺序,系统中显示记录每个账户以太币的数量。转账是否合法只需要看账户中的以太币是否足够即可,不需要看来源。同时也不需要一次性全部转账。
以太坊基于账户的模式,天然地防范了双花共计(double spending attack);但是呢,这种模式也存在 重放攻击 的缺陷。
重放攻击(replay attack):A向B转账,过一段时间,B将A的交易重新发布,从而导致A账户的钱被扣两次。
重放攻击应该怎么避免呢?
答:给账户交易增加计数器,记录该账户交易过多少次。转账的时候,将账户交易次数计入交易的内容中。系统中全节点维护账户余额和该计数器的交易树(nonce),因为有A的签名,收款方无法篡改nonce值,从而防止本地篡改余额或进行重放攻击。
以太坊系统中存在两类账户:外部账户、合约账户
2.1 外部账户
Externally Owned Accounts,简称EOA
类似于BTC系统中的公钥对,存在账户余额balance和计数器nonce
2.2 合约账户
Contact Accounts,简称CA
并非通过公私钥对控制。
不能主动发起交易,只能接收到外部账户调用后才能发起交易或调用其他合约账户
其除了balance和nonce之外还有code(代码)、storage(相关状态-存储)
合约账户如何调用?
创建合约的时候会返回一个地址,知道这个地址就可以调用合约。调用过程中,代码不变,但是状态会发生改变
3. 以太坊账户模型
在以太坊账户中,维护一下几个状态:
- nonce:外部账户为交易次数,合约账户为创建合约的序号
- balance:此地址的以太币余额
- storageRoot:账户存储内容组成的merkle树根的哈希值
- codeHash:账户EVM代码的hash值。合约账户为合约代码的哈希值,外部账户为空字符串的hash
3.1 和UTXO模型优点对比
UTXO模型的优点:
- 私密性比较强,理论上可以为每一笔输出设置一个地址
- 无需维护余额等状态值
- UTXO是独立数据记录,可以通过并行极大的提升区块链交易验证速度
- 无需关心事务问题,只需要关心输出脚本即可
- UTXO无法分割,每次交易都需要多个输出,分别为支出与找零
以太坊账户模型的优点:
- 可以快速获取账户的余额,而比特币需要将指定地址所拥有的所有UTXO中的未花费交易总值整合
- 节省空间,因为每笔交易只有一个输入一个输出
- 可以比较容易实现图灵完备的智能合约
4. 以太坊的数据结构
以太坊的区块是由区块头、交易列表 和 叔父区块三部分组成。其中区块头包含区块、块hash、父区块等信息。
如下图:
state root代表状态树,storage root存储树,transaction root代表交易树,receipt root代表收据树
在说明以太坊树之前,先来认识一下MPT。
4.1 MPT
MPT(Merkle Patricia tree) 实际上三种数据结构的组合,分别是Trie树、Patricia Trie, Merkle树。
4.1.1 Trie树
Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树。
Trie树可以利用字符串的公共前缀来节约存储空间。如下图所示,该trie树用15个节点保存了5个字符串。
Trie树的基本性质:
- 根节点不包含字符,除根节点外每个节点只包含一个字符
- 从根节点到某个节点,路径上经过的字符连起来,为该节点对应的字符串
- 每个节点的所有子节点包含的字符串不相同
Trie树的优缺点:
◇ 优点:
- 插入和查询的效率很高,都为O(m),其中 m 是待插入/查询的字符串的长度。
- Trie树中不同的关键字不会产生冲突。
- Trie树只有在允许一个关键字关联多个值的情况下才有类似hash碰撞发生。
- Trie树不用求 hash 值,对短字符串有更快的速度。通常,求hash值也是需要遍历字符串的。
- Trie树可以对关键字按字典序排序
◇ 缺点:
- 当 hash 函数很好时,Trie树的查找效率会低于哈希搜索
- 空间消耗比较大
trie树每个节点值存储一个key,非常浪费,为解决此问题,引入Patricia Tree
4.1.2 Patricia Tree
Patricia tree/trie就是进行了路径压缩的trie。如上图例子,进行路径压缩后如下图所示:
需要注意的是,如果新插入单词,原本压缩的路径可能需要扩展开来。
那么,需要考虑什么情况下路径压缩效果较好?树中插入的键值分布较为稀疏的情况下,可见路径压缩效果较好。
在以太坊系统中,160位的地址存在2^160 种,该数实际上已经非常大了,和账户数目相比,可以认为地址这一键值非常稀疏。
Patricia tree树的优缺点:
◇ 优点:和Trie树相比,节省了空间
◇ 缺点:随着后续节点的插入和删除,原有节点可能需要不断裂变或者合并出新的节点
4.1.3 MPT
以太坊系统中,将所有账户组织为一个经过路径压缩和排序的Merkle Tree,其根哈希值存储于block header中。BTC系统中只有一个交易组成的Merkle Tree,而以太坊中有三个(三棵树)。
也就是说,在以太坊的block header中,存在有三个根哈希值。
根hash的好处:1、防止篡改;2、提供Merkle proof,可以证明账户余额,轻节点可以进行验证;3、证明某个发生了交易的账户是否存在
以太坊中针对MPT(Merkle Patricia tree)进行了修改,我们也称其为MPT(Modified Patricia tree)。
MPT一个简单的例子:
以太坊区块链的四棵树用一张图展示总结:
4.2 状态树
状态树包括了从地址到账户状态之间的映射。状态树的根节点哈希值由区块保存(在 stateRoot字段),它标示了区块创建时的当前状态。整个网络中只有一个状态树。 状态标识了以太坊这台分布式计算机的硬盘。它是从地址到账户状态的映射。
状态树中有四种节点,分别是空节点、叶子节点、扩展节点和分支节点。
状态树中保存Key-value对,key就是地址,而value状态通过RLP (Recursive Length Prefix 一种进行序列化的方法) 编码序列号之后再进行存储。
每次发布新区块,状态树中部分节点状态会改变。但改变并非原地修改,而是新建一些分支,保留原状态。
4.3 账户存储树
在上图code hash 旁边,还有一个Storage root,账户存储树。
账户存储树保存了与某一智能合约相关的数据信息。
由账户状态保存账户存储树的根节点哈希值(在 storageRoot字段)每个账户都有一个账户存储树。
账户状态保存着每个以太坊账户的状态信息。账户状态同样保存着账户状态树的storageRoot,后者包含了该账户的存储数据。
4.4 交易树
交易树包含了一个区块中的所有交易信息。由区块头(在 transactionsRoot 区域)保存交易树的根节点哈希值。
每个区块都有一棵交易树。 交易标示了系统中的状态转移。它可以是资金的转移、消息调用或是合约的部署。
4.5 收据树
收据树包含了一个区块中所有交易的收据信息。同样由区块头(在 receiptsRoot区域)保存交易收据树的根节点哈希值;每个区块都有对应的交易收据树。
交易树和收据树只将当前区块中的交易组织起来,
而状态树将所有账户的状态都包含进去,无论这些账户是否与当前区块中交易有关系
多个区块状态树共享节点,而交易树和收据树依照区块独立。
那么,交易树和收据树有何用途呢?
- 向轻节点提供Merkle Proof。
- 更加复杂的查找操作(例如:查找过去十天的交易;过去十天的众筹事件等)