Web3.0-以太坊

2023/02/09 web3.0

Web3.0 - 以太坊

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模型的优点:

https://yejg.top/2022/11/03/web3-btc/#42-protocol-fork

  • 私密性比较强,理论上可以为每一笔输出设置一个地址
  • 无需维护余额等状态值
  • UTXO是独立数据记录,可以通过并行极大的提升区块链交易验证速度
  • 无需关心事务问题,只需要关心输出脚本即可
  • UTXO无法分割,每次交易都需要多个输出,分别为支出与找零

以太坊账户模型的优点:

  • 可以快速获取账户的余额,而比特币需要将指定地址所拥有的所有UTXO中的未花费交易总值整合
  • 节省空间,因为每笔交易只有一个输入一个输出
  • 可以比较容易实现图灵完备的智能合约

4. 以太坊的数据结构

以太坊的区块是由区块头、交易列表 和 叔父区块三部分组成。其中区块头包含区块、块hash、父区块等信息。

如下图:

eth-block

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树的优缺点:

◇ 优点:

  1. 插入和查询的效率很高,都为O(m),其中 m 是待插入/查询的字符串的长度。
  2. Trie树中不同的关键字不会产生冲突。
  3. Trie树只有在允许一个关键字关联多个值的情况下才有类似hash碰撞发生。
  4. Trie树不用求 hash 值,对短字符串有更快的速度。通常,求hash值也是需要遍历字符串的。
  5. Trie树可以对关键字按字典序排序

◇ 缺点:

  1. 当 hash 函数很好时,Trie树的查找效率会低于哈希搜索
  2. 空间消耗比较大

trie树每个节点值存储一个key,非常浪费,为解决此问题,引入Patricia Tree

4.1.2 Patricia Tree

Patricia tree/trie就是进行了路径压缩的trie。如上图例子,进行路径压缩后如下图所示:

PatriciaTrie

需要注意的是,如果新插入单词,原本压缩的路径可能需要扩展开来。

那么,需要考虑什么情况下路径压缩效果较好?树中插入的键值分布较为稀疏的情况下,可见路径压缩效果较好。

在以太坊系统中,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一个简单的例子:

mpt-demo

以太坊区块链的四棵树用一张图展示总结:

eth-chain

4.2 状态树

状态树包括了从地址到账户状态之间的映射。状态树的根节点哈希值由区块保存(在 stateRoot字段),它标示了区块创建时的当前状态。整个网络中只有一个状态树。 状态标识了以太坊这台分布式计算机的硬盘。它是从地址到账户状态的映射。

状态树中有四种节点,分别是空节点、叶子节点、扩展节点和分支节点。

状态树中保存Key-value对,key就是地址,而value状态通过RLP (Recursive Length Prefix 一种进行序列化的方法) 编码序列号之后再进行存储。

每次发布新区块,状态树中部分节点状态会改变。但改变并非原地修改,而是新建一些分支,保留原状态。

mpt-status-change

4.3 账户存储树

在上图code hash 旁边,还有一个Storage root,账户存储树。

账户存储树保存了与某一智能合约相关的数据信息。

由账户状态保存账户存储树的根节点哈希值(在 storageRoot字段)每个账户都有一个账户存储树。

账户状态保存着每个以太坊账户的状态信息。账户状态同样保存着账户状态树的storageRoot,后者包含了该账户的存储数据。

4.4 交易树

交易树包含了一个区块中的所有交易信息。由区块头(在 transactionsRoot 区域)保存交易树的根节点哈希值。

每个区块都有一棵交易树。 交易标示了系统中的状态转移。它可以是资金的转移、消息调用或是合约的部署。

4.5 收据树

收据树包含了一个区块中所有交易的收据信息。同样由区块头(在 receiptsRoot区域)保存交易收据树的根节点哈希值;每个区块都有对应的交易收据树。

交易树和收据树只将当前区块中的交易组织起来,

而状态树将所有账户的状态都包含进去,无论这些账户是否与当前区块中交易有关系

多个区块状态树共享节点,而交易树和收据树依照区块独立。

那么,交易树和收据树有何用途呢?

  1. 向轻节点提供Merkle Proof。
  2. 更加复杂的查找操作(例如:查找过去十天的交易;过去十天的众筹事件等)

Search

    欢迎关注我的微信公众号

    钢仔

    Table of Contents