概述

以太坊账户是具有以太 (ETH) 余额的实体,可以在以太坊上发送交易。帐户可以由用户控制或部署为智能合约。

两种类型的账户都可以:

  • 接收、持有和发送 ETH 和代币
  • 与已部署的智能合约进行互动

主要区别

外部账号:

  • 创建一个账户不需要任何费用。
  • 可以发起交易。
  • 外部拥有的账户之间的交易只能是 ETH/代币转移。
  • 由一对加密的密钥组成:控制账户活动的公钥和私钥。

合约账号:

  • 创建一个合同是有成本的,因为是在使用网络存储。
  • 只能在收到交易时发送交易。
  • 从外部账户到合同账户的交易可以触发代码,这些代码可以执行许多不同的动作,如转移代币,甚至创建一个新的合同。
  • 合约账户没有私钥。相反,它们是由智能合约代码的逻辑控制的。

Externally-owned account

外部账户(简称 EOA),由拥有一对秘钥(公钥和私钥)控制。

秘钥它们有助于证明一项交易确实是由发件人签署的,并防止伪造。私钥用来对交易进行签名,通过签名导出公钥,验证公钥和发件人地址一致。

Contract account

合约账户(简称 CA),由部署到网络的智能合约代码控制。

合约地址通常在合约部署到以太坊区块链时由创建者的地址和从该地址发送的交易数量(“nonce”)计算得出。

验证

区块链中有 2 类节点,全节点和轻节点,轻节点只会存储block header,所以轻节点如何才能校验账号是否合法呢?

区块链中的链表(哈希链)和常见链表不同的是将指针从地址改为了 hash 值,默克尔树和二叉树的区别有 2 个

  1. 将地址改为了哈希值
  2. 只有叶子节点存储数据

回到之前的问题,轻节点是如验证账户合法性呢?

  1. 轻节点由于只存储 block header,所以拿到 1 个账号的时候会向全节点发出请求
  2. 全节点存储了所有账户状态,将账户路径中的需要计算用到的 hash 值返回给轻节点
  3. 轻节点本地进行计算根 hash 值,如果计算结果和自己存储一致则账户合法,不一致则不合法。

那以太坊中的账户信息的数据结构就是这样吗? 直接用这样的数据结构来存储账户信息会有 2 个问题

  1. 查找困难 2. 生成 hash 值不确定

第 1 个问题应该比较容易发现,在这个树中寻找 1 个账号需要的复杂度是 O(n), 因为没有任何顺序。

第二个问题其实也是因为无序导致的,无序的组合每个节点针对同一批账户生成的 hash 值不一致,这就导致无法达成共识。

https://mirror.xyz/0x3167e3c376FcC051D4460c1B923212B66dC6f450/desDIhssYHK5OkQe72DeDAgy1qKkCcvgK44xT6TE-Pk

总结

参考