跳转至主要内容
Change page

以太坊帐户

页面最后更新: 2025年7月29日

以太坊帐户是拥有以太币 (ETH) 余额,能够在以太坊网络上发送消息的实体。 帐户可以由用户控制,也可以作为智能合约部署。

前提条件

为了帮助你更好地理解本页内容,我们建议你先阅读我们的以太坊简介

账户类型

以太坊有两种帐户类型:

  • 外部所有的帐户 (EOA) – 由任何拥有私钥的人控制
  • 合约帐户 – 部署到网络上的智能合约,由代码控制。 了解智能合约

这两种帐户类型都能:

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

主要区别

外部所有的

  • 创建帐户是免费的
  • 可以发起交易
  • 外部所有的帐户之间只能进行以太币和代币交易
  • 由一对加密密钥组成:控制帐户活动的公钥和私钥

合约

  • 创建合约存在成本,因为需要使用网络存储空间
  • 仅能在收到交易后发送消息
  • 从外部帐户向合约帐户发起的交易能触发可执行多种操作的代码,例如转移代币甚至创建新合约
  • 合约帐户没有私钥。 相反,它们由智能合约代码逻辑控制

账户剖析

以太坊帐户有四个字段:

  • nonce – 一个计数器,用于表示从外部持有账户发送的交易数量,或由合约账户创建的合约数量。 每个帐户只能执行具有一个给定随机数的一笔交易,以防范重放攻击,重放攻击指多次广播和重复执行已签署的交易。
  • balance – 此地址拥有的 wei 数量。 Wei 是以太币的计数单位,每个 ETH 有 1e+18 个 Wei。
  • codeHash – 此哈希是指以太坊虚拟机 (EVM) 上某个账户的_代码_。 合约帐户具有编程的代码片段,可以执行不同的操作。 如果帐户收到消息调用,则执行此 EVM 代码。 与其他帐户字段不同,不能更改。 所有代码片段都被保存在状态数据库的相应哈希下,供后续检索。 此哈希值称为 codeHash。 对于外部所有的帐户,codeHash 字段是空字符串的哈希。
  • storageRoot – 有时称为存储哈希。 一个 默克尔-帕特里夏树 根节点的 256 位哈希,它对账户的存储内容(一个 256 位整数值的映射)进行编码,并作为从 256 位整数键的 Keccak-256 哈希到 RLP 编码的 256 位整数值的映射编码到树中。 此 Trie 对此帐户存储内容的哈希进行编码,默认情况下为空。

显示账户构成的图表 图表改编自 图解以太坊 EVMopens in a new tab

外部持有账户和密钥对

帐户由一对加密密钥组成:公钥和私钥。 它们有助于证明交易实际上是由发送者签名的,并防止伪造。 你的私钥是你用来签名交易的密钥,所以它保障你对与自己帐户相关的资金进行管理。 你从未真正持有加密货币,你持有私钥 – 资金总是在以太坊的账本上。

这将防止恶意参与者广播虚假交易,因为你总是可以验证交易的发送者。

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

账户创建

当你想要创建一个帐户时,大多数程序库会生成一个随机私钥。

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

例如:

fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036415f

公钥是使用椭圆曲线数字签名算法opens in a new tab通过私钥生成的。 提取公钥 Keccak-256 哈希的最后 20 个字节,并在开头添加 0x,即可获得账户的公共地址。

这意味着外部持有账户 (EOA) 有一个 42 个字符的地址(一个 20 字节的段,即 40 个十六进制字符,再加上 0x 前缀)。

例如:

0x5e97870f263700f46aa00d967821199b9bc5a120

以下示例显示了如何使用名为 Clefopens in a new tab 的签名工具来生成新账户。 Clef 是一款账户管理和签名工具,与以太坊客户端 Gethopens in a new tab 捆绑提供。 clef newaccount 命令会创建一个新的密钥对,并将其保存在一个加密的密钥库中。

1> clef newaccount --keystore <路径>
2
3请输入要创建的新账户的密码:
4> <密码>
5
6------------
7INFO [10-28|16:19:09.156] 您的新密钥已生成 address=0x5e97870f263700f46aa00d967821199b9bc5a120
8WARN [10-28|16:19:09.306] 请备份您的密钥文件 path=/home/user/go-ethereum/data/keystore/UTC--2022-10-28T15-19-08.000825927Z--5e97870f263700f46aa00d967821199b9bc5a120
9WARN [10-28|16:19:09.306] 请记住您的密码!
10已生成账户 0x5e97870f263700f46aa00d967821199b9bc5a120
显示全部

Geth 文档opens in a new tab

可以通过你的私钥获取公钥,但你不能通过公钥获取私钥。 保护好私钥的安全至关重要,并且顾名思义,一定要保持私密

你需要一个私钥来签署消息和交易并输出签名。 然后其他人可以使用签名获取你的公钥,证明信息的作者。 在你的应用程序中,你可以使用 JavaScript 程序库向网络发送交易。

合约账户

合约帐户也有一个 42 个字符组成的十六进制地址:

例如:

0x06012c8cf97bead5deae237070f9587f8e7a266d

合约地址通常在将合约部署到以太坊区块链时给出。 地址产生自创建人的地址和从创建人地址发送的交易数量(“nonce”)。

验证者密钥

以太坊还有一另种类型的密钥,它们是在以太坊从工作量证明过渡到权益证明共识时引入的。 它们是“BLS”密钥,用来识别验证者。 这些密钥可以有效地聚合,减少网络达成共识所需要的带宽。 没有这种密钥集合,验证者的最小质押金额将会高出许多。

关于验证者密钥的更多信息

关于钱包的说明

帐户和钱包不同。 钱包是一个界面或应用程序,可让你与以太坊帐户(外部帐户或合约帐户)进行交互。

可视化演示

跟随 Austin 了解哈希函数和密钥对。

扩展阅读{#further-reading}

你还知道哪些对你有帮助的社区资源? 请编辑本页面并添加进来!

本文对你有帮助吗?