北大肖臻《区块链技术与应用》学习笔记
作者:互联网
ETH-概述
-
BTC和ETH为最主要的两种加密货币,BTC称为区块链1.0,以太坊称为区块链2.0。以太坊对比特币的一些不足地方作出修改如:出块时间、共识协议、mining puzzle(对内存要求高,反ASIC芯片使用),以太坊还将用权益证明(POS)替代工作量证明(POW),此外,以太坊增加了对智能合约(smart contract)的支持
-
为什么要开发“智能合约”
BTC本身是一个去中心化的货币,在比特币取得成功之后,人们认为除了货币还有其他的事物可以去中心化,以太坊的一个特性就是增加了对去中心化的合约的支持。如果说比特币系统本身是一个货币应用,以太坊则由于智能合约,升级成为了一个平台,用户可以依据该平台自行开发业务应用BitCoin:de decentralized currency(去中心化货币)
Ethereum:decentralized contract(去中心化合约)
-
关于BTC和ETH
BTC的发明人为中本聪,ETH为Vitalik Buterin受到BTC启发发明出来的“下一代加密货币与去中心化应用平台”。BTC中货币最小单位为“聪”,BTC:Satoshi最小单位,最少的钱为一聪;ETH中货币最小单位为“Wei”,ETH(Ether):Wei最小单位 -
去中心化的合约
去中心化货币。货币本身由政府发行,政府公信力为其背书,BTC通过技术手段取代了政府的职能。现实生活中,我们经常提到“契约”或“合约”。合约的有效性也是需要政府进行维护的,如果产生 纠纷需要针对合法性合同进行判决。ETH的设计目的就是,通过技术手段来实现取代政府对于合约的职能
好处
若合同签署方并非一个国家,没有统一的司法部门(如:众筹)。如果可以编写无法修改的合约,所有人只能按照相关参与方执行,无法违约
ETH-账户
-
BTC系统是基于交易的账本(Account-based ledger ),系统中并未显示记录账户有多少钱,只能通过UTXO进行推算。但实际中,使用起来较为别扭。A转给B钱的时候,需要说明币的来源。实际中只需要存钱说明来源,花钱则不用。此外,账户中的钱在花的时候,必须一次性全部花出去。
-
如图,B收到A的10个BTC,他想要给C3个BTC,如果按照1中方式,其余7个比特币会以交易费的形式给挖出区块的矿工。因此,为了避免这种情况,便吸引采用2中方式,将3个BTC转给C,将剩余7个BTC转到自己的另一账户D上面。
-
以太坊系统则采用了基于账户的模型,与现实中银行账户相似。系统中显示记录每个账户以太币的数量,转账是否合法只需要查看转账者账户中以太币是否足够即可,同时也不需要每次全部转账。同时,这也也天然地防范了双花攻击。当然,以太坊发这种模式也存在缺点,这种模式存在重放攻击(Replay attack)的缺陷。A向B转账,过一段时间,B将A的交易重新发布,从而导致A账户被扣钱两次
-
为了防范重放攻击,给账户交易添加计数器记录该账户交易过多少次,转账时候将转账次数计入交易的内容中。系统中全节点维护账户余额和该计数器的交易数,从而防止本地篡改余额或进行重放攻击
-
以太坊系统中存在两类账户:外部账户和合约账户
- 外部账户:类似于BTC系统中公私钥对。存在账户余额balance和计数器nonce
- 合约账户:并非通过公私钥对控制。(不能主动发起交易,只能接收到外部账户调用后才能发起交易或调用其他合约账户)其除了balance和nonce之外还有code(代码)、storage(相关状态-存储)
创建合约时候会返回一个地址,就可以对其调用。调用过程中,代码不变但状态会发生改变。
-
为什么要做以太坊,更换为基于账户的模型而不是沿袭BTC系统?
比特币中支持每次更换账户,但以太坊是为了支持智能合约,而合约签订双方是需要明确且较少变化的。尤其是对于合约账户来说,需要保持稳定状态。基于以太坊的应用衍生(Financial dericative)
ETH-状态树
-
首先,我们要实现从账户地址到账户状态的映射。在以太坊中,账户地址为160字节,表示为40个16进制数额。状态包含了余额(balance)、交易次数(nonce),合约账户中还包含了code(代码)、存储(stroge)
-
直观地来看,其本质上为Key-value键值对,所以直观想法便用哈希表实现。若不考虑哈希碰撞,查询直接为常数级别的查询效率。但采用哈希表,难以提供Merkle proof(莫克树证明),在BTC和以太坊中,交易保存在区块内部,一个区块可以包含多个交易。通过区块构成区块链,而非交易
-
如何组织账户的数据结构
- 为什么不能将哈希表的内容组织为Merkle Tree
当新区块发布,哈希表内容会改变,如果将其组织为新的Merkle Tree,每当产生新区块(ETH中新区块产生时间为10s左右),都要重新组织Merkle Tree,很明显这是不现实的。
需要注意的是,比特币系统中没有账户概念,交易由区块管理,而区块包含上限为4000个交易左右,所以Merkle Tree不是无限增大的。而ETH中,Merkle Tree来组织账户信息,很明显其会越来越庞大。
实际中,发生变化的仅仅为很少一部分数据,我们每次重新构建Merkle Tree代价很大 - 如果不要哈希表,直接使用Merkle Tree,每次修改只需要修改其中一部分即可,也不可行
实际中,Merkle Tree并未提供一个高效的查找和更新的方案。此外,将所有账户构建为一个大的Merkle Tree,为了保证所有节点的一致性和查找速度,必须进行排序。 - 经过排序,也不能使用Sorted Merkle Tree
新增账户,由于其地址随机,插入Merkle Tree时候很大可能在Tree中间,发现其必须进行重构。所以Sorted Merkle Tree插入、删除(实际上可以不删除)的代价太大。
-
既然哈希表和 Merkle Tree都不可以,那么我们看一下实际中以太坊采取的数据结构:MPT
注意:BTC系统中,虽然每个节点构建的Merkle Tree不一致(不排序),但最终是获得记账权的节点的Merkle Tree才是有效的。
-
trie(字典树、前缀树)
-
特点:
- trie中每个节点的分支数目取决于Key值中每个元素的取值范围(图例中最多26个英文字母分叉+一个结束标志位)。
- trie查找效率取决于key的长度。实际应用中(以太坊地址长度为160byte)。
- 理论上哈希会出现碰撞,而trie上面不会发生碰撞。
- 给定输入,无论如何顺序插入,构造的trie都是一样的。
- 更新操作局部性较好
- 缺点:
trie的存储浪费。很多节点只存储一个key,但其“儿子”只有一个,过于浪费。我们引入Patricia tree/trie
下图为一个通过5个单词组成的trie数据结构(只画出key,未画出value)
Patricia trie(Patricia tree)
Patricia trie就是进行了路径压缩的trie。如上图例子,进行路径压缩后如下图所示:
需要注意的是,如果新插入单词,原本压缩的路径可能需要扩展开来。因此树中插入的键值分布较为稀疏的情况下,可见路径压缩效果较好。在以太坊系统中,160位的地址存在2^160 种,该数实际上已经非常大了,和账户数目相比,可以认为地址这一键值非常稀疏。
因此,我们可以在以太坊账户管理种使用Patricia tree这一数据结构!但实际上,在以太坊种使用的并非简单的PT(Patricia tree),而是MPT(Merkle Patricia tree)
- Merkle Tree 和 Balance Tree
区块链和链表的区别在于区块链使用哈希指针,链表使用普通指针。
同样,Merkle Tree 相比 Balance Tree,也是普通指针换成了哈希指针。
所以,以太坊系统中可如此,将所有账户组织为一个经过路径压缩和排序的Merkle Tree,其根哈希值存储于block header中。BTC系统中只有一个交易组成的Merkle Tree,而以太坊中有三个(三棵树)。也就是说,在以太坊的block header中,存在有三个根哈希值。
根哈希值的用处:
- 防止篡改
- 提供Merkle proof,可以证明账户余额,轻节点可以进行验证
- 证明某个发生了交易的账户是否存在
-
MPT(Modified Patricia tree)
以太坊中针对MPT(Merkle Patricia tree)进行了修改,我们称其为MPT(Modified Patricia tree)
下图为以太坊中使用的MPT结构示意图。右上角表示四个账户(为直观,显示较少)和其状态(只显示账户余额)。(需要注意这里的指针都是哈希指针)
每次发布新区块,状态树中部分节点状态会改变。但改变并非在原地修改,而是新建一些分支,保留原本状态。如下图中,仅仅有新发生改变的节点才需要修改,其他未修改节点直接指向前一个区块中的对应节点。
所以,系统中全节点并非维护一棵MPT,而是每次发布新区块都要新建MPT。只不过大部分节点共享。
保存原本状态而不直接修改的原因
为了便于回滚。如下1中产生分叉,而后上面节点胜出,变为2中状态。那么,下面节点中状态的修改便需要进行回滚。因此,需要维护这些历史记录。
通过代码看以太坊中的数据结构
-
block header 中的数据结构
-
区块结构
-
区块在网上真正发布时的信息
最后说明
状态树中保存Key-value对,key就是地址,而value状态通过RLP(Recursive Length Prefix,一种进行序列化的方法)编码序列号之后再进行存储。
标签:区块,以太,账户,Tree,笔记,BTC,Merkle,肖臻 来源: https://www.cnblogs.com/addc/p/15083568.html