什么是以太坊账户

6/6/2022 web3以太坊小旱獭的以太坊笔记以太坊基本概念

# 以太坊账户

当我们在使用钱包时候,可以通过钱包来创建一个账户,也可以通过导入私钥的形式,从链上导入一个以太坊账号。除此之外,如果你编写过智能合约,可能还会听说过一个叫做Address的库,这个库中有一个函数是这样的:

function isContract(address account) internal view returns (bool) {
	return account.code.length > 0;
}
1
2
3

这个函数的作用是判断一个地址是合约地址还是非合约地址。

那么就由此产生了一个问题,合约账户和钱包账户到底有什么区别?

# 帐户类型

以太坊有两种帐户类型:

这两种帐户类型都能:

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

# 主要区别

外部持有

  • 创建帐户是免费的
  • 可以发起交易
  • 外部所有的帐户之间只能进行 ETH 和代币交易

合约

  • 创建合约存在成本,因为需要使用网络存储空间
  • 只能在收到交易时发送交易
  • 从外部帐户向合约帐户发起的交易能触发可执行多种操作的代码,例如转移代币甚至创建新合约

# 帐户组成

以太坊帐户有四个字段:

  • nonce – 显示从帐户发送的交易数量的计数器。 这将确保交易只处理一次。 在合约帐户中,这个数字代表该帐户创建的合约数量
    • 这个nonce值一般通过钱包自动生成,但在某些情况下,你也可以自己指定nonce值
  • balance – 这个地址拥有的 Wei 数量。 Wei 是以太币的计数单位,每个 ETH 有 1e+18 Wei。
    • 对于刚接触以太坊的用户来说,存在一个常见的误区就是误认为只有用户账户才会持有余额,实际上,可以通过address(this).balance的方法获得合同的余额
  • codeHash - 该哈希表示以太坊虚拟机 (EVM) 上的帐户代码。 合约帐户具有编程的代码片段,可以执行不同的操作。 如果帐户收到消息调用,则执行此 EVM 代码。 与其他帐户字段不同,不能更改。 所有代码片段都被保存在状态数据库的相应哈希下,供后续检索。 此哈希值称为 codeHash。
    • 对于外部持有的帐户,codeHash 字段是空,这也是判断地址是否是合约地址的方法
  • storageRoot – 有时被称为存储哈希。 Merkle Patricia Trie 根节点的 256 位哈希已编码了帐户的存储内容(256 位整数值映射),并编码为 Trie,作为来自 256 的 Keccak 256 位哈希的映射位整数键,用于 RLP 编码的 256 位整数值。 此 Trie 对此帐户存储内容的哈希进行编码,默认情况下为空。

account image

# MPT树

MPT(Merkle Patricia Trie),是一种用hash索引数据的前缀树。通过key去查询value,就是用key在MPT树上进行索引,在经过多个中间节点后,最终到达存储数据的叶子节点。如图是全局状态树,4个叶子节点(key/value值)通过如下组织形式,构成状态树。

# 外部账户的公私钥原理

# 什么是外部账户

一个帐户由一对加密密钥组成:公钥和私钥。它们有助于证明交易实际上是由发件人签署的,并防止伪造。您的私钥是您用来签署交易的,因此它授予您对与您的帐户相关联的资金的保管权。你从来没有真正持有加密货币,你持有私钥——资金总是在以太坊的分类账上。

这可以防止恶意行为者广播虚假交易,因为您始终可以验证交易的发送者。

如果 Alice 想从她自己的账户向 Bob 的账户发送以太币,Alice 需要创建一个交易请求并将其发送到网络进行验证。以太坊对公钥加密的使用确保了 Alice 可以证明她最初发起了交易请求。如果没有加密机制,恶意对手 Eve 可以简单地公开广播一个看起来像“从 Alice 的账户向 Eve 的账户发送 5 ETH”的请求,并且没有人能够验证它不是来自 Alice。

# 账户创建

当您想创建一个帐户时,大多数库都会为您生成一个随机私钥。

私钥由 64 个十六进制字符组成,可以使用密码进行加密。

例子:

fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036415f

公钥是使用椭圆曲线数字签名算法 (opens new window)从私钥生成的。通过获取公钥的 Keccak-256 哈希的最后 20 个字节并添加0x到开头,您可以获得您帐户的公共地址。

Last Updated: 6/10/2022, 7:11:06 AM