弑君者

V1

2022/10/08阅读:21主题:默认主题

以太坊

以太坊账户

账户模式

比特币的账户模式使用的基于交易的模式来记录有多少钱的情况。

比特币转账的限制

  1. 每次转账必须把自己账户的里边的所有钱都转出去,比如A有10个比特币,想转给B 3个比特币,这个时候就必须做两边交易

第一笔交易A转给B 3个比特币

第二笔交易A转给A 7个比特币

ETH 转账

有点类似于我们现实中情况,比如A有10个ETH, A想转给B 3个 ETH, A 直接转给B 3个ETH就可以了。

有点类似于我们银行转账。

这样可以防范双花攻击,因为你花一次,只要把账户里边的钱扣除一次。

但是这样有限制,比如重放攻击(reply attack)

比如假设A有10个ETH, A 转给 B 3个ETH, 当这笔交易被写入到区块链以后,A的账户扣去划掉的3个ETH, 就只有7个ETH了。

这个时候,如果B是恶意节点,B又把这笔交易信息再广播一次,那么如果这笔交易也被写到区块链的时候,A的账户又少了3个ETH,就只有4个ETH了。

如何重放攻击?

需要加一个计数器,也就是nonce, 当A转账的时候,需要设置nonce的值,然后打包广播,其它节点当收到打包之后的广播以后,会检查收到的nonce和自身节点维护的关于A的nonce的值,如果小于发送过来的,说明是合法的,如果大于说明当前的交易已经被写入区块链了,属于非法交易。

比如当前节点维护的关于A账户的nonce的值是20, 当收到A发送的打包交易后,发现这次A发送的nonce的值是21,说明这次交易是合法的,这个时候就需要更新维护的关于A账户的nonce的值为21,下次如果再收到关于A的交易信息,如果发现交易信息中nonce的值小于21,则视为非法。

账户类型

  1. 外部账户, 通过公私钥控制 (包含 余额和nonce)

  2. 合约账户, 一种由代码控制,部署在网络上的智能合约】

以太坊的账户状态树

以太坊需要完成 账户地址 -> 账户状态

如果使用hash表来实现会有什么问题?

证明账户余额,使用默克尔树证明

如果发生交易

默克尔树没有提供高效的查找和更新的方法

如果所有的账户放到一个默克尔树中需要不需要排序?

如果不排序,每个全节点形成的默克尔树是不一样的

比特币中全节点每个交易顺序是不一样的,比特币中每个区块中交易是由打包者决定的。

如果以太坊发布的全账户的状态,量太大

如果排序的账户默克尔树,新增用户代价比较大

trie

键值分布比较稀疏的情况下

以太坊地址比较稀疏,为了防止hash碰撞

以太坊交易树与收据树

bloom filter 数据结构

使用bloom filter 快速查找交易信息

以太坊可以看成一个交易驱动的状态机

以太坊的共识机制

以太坊的共识机制,因为以太坊15秒出块,比特币的出块时间是10分钟,如果按照比特币的共识机制,就会出现挖矿不公平

以太坊挖矿算法

ASIC 特征算力强

以太坊

分类:

后端

标签:

区块链

作者介绍

弑君者
V1