弑君者
2022/10/08阅读:21主题:默认主题
以太坊
以太坊账户
账户模式
比特币的账户模式使用的基于交易的模式来记录有多少钱的情况。
比特币转账的限制
-
每次转账必须把自己账户的里边的所有钱都转出去,比如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,则视为非法。

账户类型
-
外部账户, 通过公私钥控制 (包含 余额和nonce)
-
合约账户, 一种由代码控制,部署在网络上的智能合约】
以太坊的账户状态树
以太坊需要完成 账户地址 -> 账户状态
如果使用hash表来实现会有什么问题?
证明账户余额,使用默克尔树证明
如果发生交易
默克尔树没有提供高效的查找和更新的方法
如果所有的账户放到一个默克尔树中需要不需要排序?
如果不排序,每个全节点形成的默克尔树是不一样的
比特币中全节点每个交易顺序是不一样的,比特币中每个区块中交易是由打包者决定的。
如果以太坊发布的全账户的状态,量太大
如果排序的账户默克尔树,新增用户代价比较大
trie
键值分布比较稀疏的情况下
以太坊地址比较稀疏,为了防止hash碰撞
以太坊交易树与收据树
bloom filter 数据结构
使用bloom filter 快速查找交易信息
以太坊可以看成一个交易驱动的状态机
以太坊的共识机制
以太坊的共识机制,因为以太坊15秒出块,比特币的出块时间是10分钟,如果按照比特币的共识机制,就会出现挖矿不公平
以太坊挖矿算法
ASIC 特征算力强
以太坊
作者介绍