区块链交易模型学习文档:UTXO 模型、账户余额模型与以太坊账户体系

文章目录
- [区块链交易模型学习文档:UTXO 模型、账户余额模型与以太坊账户体系](#区块链交易模型学习文档:UTXO 模型、账户余额模型与以太坊账户体系)
-
- [1. 为什么要学习交易模型?](#1. 为什么要学习交易模型?)
- [2. 比特币 UTXO 模型](#2. 比特币 UTXO 模型)
-
- [2.1 UTXO 是什么?](#2.1 UTXO 是什么?)
- [2.2 用生活例子理解 UTXO](#2.2 用生活例子理解 UTXO)
- [3. UTXO 模型中的交易结构](#3. UTXO 模型中的交易结构)
-
- [3.1 交易输入与交易输出](#3.1 交易输入与交易输出)
- [3.2 交易过程示例](#3.2 交易过程示例)
- [4. UTXO 模型的合法性验证](#4. UTXO 模型的合法性验证)
-
- [4.1 为什么需要签名?](#4.1 为什么需要签名?)
- [4.2 UTXO 交易合法的基本条件](#4.2 UTXO 交易合法的基本条件)
- [4.3 双花问题](#4.3 双花问题)
- [5. UTXO 模型的状态变化](#5. UTXO 模型的状态变化)
- [6. UTXO 模型的特点](#6. UTXO 模型的特点)
-
- [6.1 优点](#6.1 优点)
-
- [1. 安全性强](#1. 安全性强)
- [2. 交易边界清晰](#2. 交易边界清晰)
- [3. 适合并行验证](#3. 适合并行验证)
- [4. 隐私性相对较好](#4. 隐私性相对较好)
- [6.2 缺点](#6.2 缺点)
-
- [1. 状态表达不直观](#1. 状态表达不直观)
- [2. 智能合约支持不方便](#2. 智能合约支持不方便)
- [3. 找零机制增加复杂度](#3. 找零机制增加复杂度)
- [7. 账户余额模型](#7. 账户余额模型)
-
- [7.1 什么是账户余额模型?](#7.1 什么是账户余额模型?)
- [7.2 账户模型中的交易过程](#7.2 账户模型中的交易过程)
- [8. 账户余额模型为什么适合智能合约?](#8. 账户余额模型为什么适合智能合约?)
- [9. 以太坊账户类型](#9. 以太坊账户类型)
- [10. 外部账户 EOA](#10. 外部账户 EOA)
-
- [10.1 EOA 是什么?](#10.1 EOA 是什么?)
- [10.2 EOA 的作用](#10.2 EOA 的作用)
-
- [1. 普通转账](#1. 普通转账)
- [2. 调用智能合约](#2. 调用智能合约)
- [11. 合约账户 CA](#11. 合约账户 CA)
-
- [11.1 合约账户是什么?](#11.1 合约账户是什么?)
- [11.2 合约账户没有私钥](#11.2 合约账户没有私钥)
- [11.3 合约账户通过交易触发执行](#11.3 合约账户通过交易触发执行)
- [11.4 合约账户的存储与执行代码](#11.4 合约账户的存储与执行代码)
- [12. 用户账户与合约拥有账户](#12. 用户账户与合约拥有账户)
-
- [12.1 用户账户](#12.1 用户账户)
- [12.2 合约拥有账户](#12.2 合约拥有账户)
- [13. UTXO 模型与账户余额模型对比](#13. UTXO 模型与账户余额模型对比)
- [14. 两种模型的核心区别](#14. 两种模型的核心区别)
-
- [14.1 UTXO 模型关注"钱从哪里来,到哪里去"](#14.1 UTXO 模型关注“钱从哪里来,到哪里去”)
- [14.2 账户模型关注"账户状态如何变化"](#14.2 账户模型关注“账户状态如何变化”)
- [15. 常见疑问解答](#15. 常见疑问解答)
-
- [问题 1:比特币为什么不用账户余额模型?](#问题 1:比特币为什么不用账户余额模型?)
- [问题 2:为什么 UTXO 要整体花费?](#问题 2:为什么 UTXO 要整体花费?)
- [问题 3:以太坊为什么使用账户模型?](#问题 3:以太坊为什么使用账户模型?)
- [问题 4:合约账户为什么没有私钥?](#问题 4:合约账户为什么没有私钥?)
- [问题 5:合约账户能不能自己运行?](#问题 5:合约账户能不能自己运行?)
- [问题 6:账户模型中如何防止重复交易?](#问题 6:账户模型中如何防止重复交易?)
- [16. 学习重点总结](#16. 学习重点总结)
-
- [16.1 必须掌握的概念](#16.1 必须掌握的概念)
- [16.2 必须理解的关系](#16.2 必须理解的关系)
- [16.3 一句话记忆](#16.3 一句话记忆)
- [17. 考试与问答常见题型](#17. 考试与问答常见题型)
-
- [题 1:UTXO 的全称是什么?](#题 1:UTXO 的全称是什么?)
- [题 2:UTXO 模型中交易输入的本质是什么?](#题 2:UTXO 模型中交易输入的本质是什么?)
- [题 3:比特币如何判断一笔交易是否合法?](#题 3:比特币如何判断一笔交易是否合法?)
- [题 4:账户余额模型有什么特点?](#题 4:账户余额模型有什么特点?)
- [题 5:以太坊为什么采用账户余额模型?](#题 5:以太坊为什么采用账户余额模型?)
- [题 6:EOA 和合约账户的区别是什么?](#题 6:EOA 和合约账户的区别是什么?)
- [18. 结构化思维导图](#18. 结构化思维导图)
- [19. 最终总结](#19. 最终总结)
1. 为什么要学习交易模型?
在区块链系统中,"交易"是最核心的操作之一。
我们平时说的:
- 张三给李四转账 1 BTC;
- 用户给某地址转 1 ETH;
- 用户调用智能合约完成 NFT 铸造;
- 用户在 DeFi 中质押、兑换、借贷;
本质上都需要通过区块链中的 交易模型 来描述。
所谓交易模型,就是区块链系统用来记录、验证和更新资产状态的一套规则。
不同区块链采用的交易模型不同,常见的有两类:
| 类型 | 代表系统 | 核心思想 |
|---|---|---|
| UTXO 模型 | 比特币 Bitcoin | 不直接记录账户余额,而是记录"未花费的交易输出" |
| 账户余额模型 | 以太坊 Ethereum | 类似银行账户,直接记录账户状态和余额 |
2. 比特币 UTXO 模型
2.1 UTXO 是什么?
UTXO 的全称是:
text
Unspent Transaction Output
中文通常翻译为:
text
未花费交易输出
在比特币系统中,并不存在一个像银行账户那样的"账户余额表"。
也就是说,比特币不会直接记录:
text
Alice 的账户余额 = 10 BTC
Bob 的账户余额 = 5 BTC
比特币记录的是一个个还没有被花掉的交易输出。
这些还没有被花掉的交易输出,就是 UTXO。
2.2 用生活例子理解 UTXO
可以把 UTXO 理解成现实生活中的现金纸币。
假设你钱包里有三张纸币:
text
10 元
20 元
50 元
你的总余额是:
text
10 + 20 + 50 = 80 元
但是钱包里并没有一张纸条写着"余额 80 元",而是由多张具体的纸币共同构成你的余额。
UTXO 也是类似的。
某个比特币地址看起来有 3 BTC,但这个 3 BTC 可能并不是一个整体,而是由多个 UTXO 组成:
text
UTXO1 = 0.5 BTC
UTXO2 = 1.0 BTC
UTXO3 = 1.5 BTC
总余额 = 3.0 BTC
所以,比特币中的"余额"其实是通过统计某个地址能够控制的所有 UTXO 之和得到的。
3. UTXO 模型中的交易结构
3.1 交易输入与交易输出
在 UTXO 模型中,一笔交易通常包括两部分:
text
交易输入 Inputs
交易输出 Outputs
其中:
- 输入:引用之前某笔交易中还没有被花费的输出;
- 输出:生成新的 UTXO,指定新的接收者和金额。
可以简单理解为:
text
旧的 UTXO 被消耗
新的 UTXO 被创建
3.2 交易过程示例
假设 Alice 有一个 UTXO:
text
UTXO_A = 10 BTC
现在 Alice 想给 Bob 转账 3 BTC。
由于 UTXO 通常要整体花费,Alice 不能只从这个 UTXO 中"切掉"3 BTC,而是要把整个 10 BTC 作为输入,然后生成新的输出。
交易可能如下:
text
输入:
- Alice 的 UTXO_A:10 BTC
输出:
- 给 Bob:3 BTC
- 找零给 Alice:6.999 BTC
- 矿工手续费:0.001 BTC
注意:
text
输入总额 = 输出总额 + 手续费
即:
text
10 = 3 + 6.999 + 0.001
其中,手续费不是一个显式写给矿工的输出,而是:
text
手续费 = 输入总额 - 输出总额
4. UTXO 模型的合法性验证
4.1 为什么需要签名?
如果 Alice 要花费一个 UTXO,她必须证明自己有权花费它。
这个证明过程依赖:
text
私钥签名
公钥验证
地址绑定
一般流程可以理解为:
text
私钥 → 生成签名
公钥 → 验证签名
地址 → 与公钥/公钥哈希关联
只有能够提供正确签名的人,才可以花费对应的 UTXO。
4.2 UTXO 交易合法的基本条件
一笔 UTXO 交易要合法,通常需要满足以下条件:
| 条件 | 说明 |
|---|---|
| 输入引用的 UTXO 必须存在 | 不能引用不存在的交易输出 |
| 输入引用的 UTXO 未被花费 | 防止双花攻击 |
| 签名必须正确 | 证明交易发起者有权花费该 UTXO |
| 输入金额 ≥ 输出金额 | 不能凭空创造比特币 |
| 交易格式正确 | 满足网络协议要求 |
4.3 双花问题
双花问题是指同一笔资产被重复花费。
例如,Alice 只有一个 10 BTC 的 UTXO,却试图同时发起两笔交易:
text
交易 1:给 Bob 10 BTC
交易 2:给 Charlie 10 BTC
如果系统不进行验证,Alice 就相当于把同一笔钱花了两次。
UTXO 模型天然适合防止双花,因为每个 UTXO 只能被花费一次。
一旦某个 UTXO 被某笔交易作为输入使用,它就会从 UTXO 集合中移除。
5. UTXO 模型的状态变化
在比特币系统中,系统维护的是一个全局 UTXO 集合。
可以理解为:
text
当前所有还没有被花费的交易输出集合
当一笔新交易被确认时:
text
1. 消耗交易输入中引用的旧 UTXO
2. 删除这些旧 UTXO
3. 创建交易输出中的新 UTXO
4. 将新 UTXO 加入 UTXO 集合
用流程表示:
旧 UTXO 集合
新交易引用旧 UTXO
验证签名与金额
删除已花费 UTXO
生成新的交易输出
更新后的 UTXO 集合
6. UTXO 模型的特点
6.1 优点
1. 安全性强
每个 UTXO 只能被花费一次,有利于防止双花。
2. 交易边界清晰
每笔交易都明确引用旧输出并生成新输出,资产流转路径清楚,适合追踪资金流。
3. 适合并行验证
如果两笔交易花费的是不同的 UTXO,它们之间没有冲突,可以并行验证。
4. 隐私性相对较好
用户可以为不同交易使用不同地址,使外部观察者不容易直接把所有交易关联到同一个身份。
6.2 缺点
1. 状态表达不直观
用户看到的是多个 UTXO 的集合,不像账户模型那样直接显示余额。
2. 智能合约支持不方便
复杂合约需要频繁生成和消费 UTXO,编程模型相对复杂。
3. 找零机制增加复杂度
转账时常常需要生成"找零输出",否则多余部分会变成手续费。
7. 账户余额模型
7.1 什么是账户余额模型?
账户余额模型是一种更接近传统银行账户的交易模型。
在账户模型中,每个用户都有一个账户,系统直接记录账户的状态,例如:
text
账户地址
账户余额
交易序号 nonce
合约代码
存储数据
以太坊采用的就是账户模型。
可以简单理解为:
text
账户 A 余额减少
账户 B 余额增加
例如:
text
Alice: 10 ETH
Bob: 2 ETH
Alice 给 Bob 转账 3 ETH 后:
text
Alice: 7 ETH
Bob: 5 ETH
7.2 账户模型中的交易过程
假设 Alice 给 Bob 转账 3 ETH。
交易执行前:
text
Alice 余额 = 10 ETH
Bob 余额 = 2 ETH
交易执行后:
text
Alice 余额 = 7 ETH - 手续费
Bob 余额 = 5 ETH
以太坊还会记录 Alice 的 nonce,防止交易重放。
text
nonce = 账户已经发出的交易数量
每发出一笔交易,nonce 通常增加 1。
8. 账户余额模型为什么适合智能合约?
PPT 中提到:
以太坊使用账户余额模型,是为了更好地支持智能合约,因为智能合约需要一个相对稳定的身份,而不是像 UTXO 模型那样频繁生成交易地址。
这句话非常关键。
智能合约本质上是一段部署在区块链上的程序。
如果要调用合约,就需要一个稳定的合约地址。
账户模型中,每个合约都有自己的账户地址:
text
合约地址
合约代码
合约存储
合约余额
这使得智能合约可以像一个长期存在的"链上对象"一样被调用和管理。
9. 以太坊账户类型
以太坊中的账户主要分为两类:
text
外部账户 EOA
合约账户 CA
其中:
text
EOA = Externally Owned Account
CA = Contract Account
10. 外部账户 EOA
10.1 EOA 是什么?
外部账户是由用户通过私钥控制的账户。
常见的钱包地址,例如 MetaMask 创建的地址,就是外部账户。
其生成过程可以简化为:
text
私钥 → 公钥 → 地址
EOA 的特点:
| 特点 | 说明 |
|---|---|
| 由私钥控制 | 谁掌握私钥,谁控制账户 |
| 可以主动发起交易 | 用户通过钱包签名并发送交易 |
| 没有合约代码 | EOA 本身不存储可执行智能合约代码 |
| 可以转账 | 可以向其他账户发送 ETH |
| 可以调用合约 | 可以触发智能合约执行 |
10.2 EOA 的作用
EOA 可以执行两类操作:
1. 普通转账
text
用户 A → 用户 B
例如:
text
Alice 给 Bob 转 1 ETH
2. 调用智能合约
text
用户 A → 合约账户
例如:
text
Alice 调用 NFT 合约的 mint 函数
Alice 调用 DEX 合约进行代币兑换
11. 合约账户 CA
11.1 合约账户是什么?
合约账户是由智能合约控制的账户。
它不是由某个私钥直接控制,而是由合约代码决定其行为。
合约账户具有:
text
账户地址
合约代码
合约存储
账户余额
合约账户不能像 EOA 一样主动发起交易。
它必须由外部交易触发后才会执行。
11.2 合约账户没有私钥
PPT 中强调:
text
合约账户没有私钥,因此无法进行签名和验证身份。
这意味着:
- 合约账户不是由某个人直接用私钥控制;
- 合约账户不能主动签名发起交易;
- 合约账户的行为由代码逻辑决定;
- 合约账户通常由 EOA 或其他合约调用触发执行。
11.3 合约账户通过交易触发执行
合约账户中的代码不会自己运行。
只有当区块链上的交易触发它时,它才会执行。
例如:
text
EOA 发起交易 → 调用合约账户 → 合约代码执行 → 状态更新
流程如下:
外部账户 EOA
发送交易
合约账户 CA
执行合约代码
修改链上状态
返回执行结果
11.4 合约账户的存储与执行代码
合约账户内部存储智能合约代码。
代码可以执行:
- 转账;
- 条件判断;
- 余额查询;
- 权限判断;
- 数据存储;
- 事件记录;
- 调用其他合约。
例如,一个简单的合约可能实现:
text
如果用户支付了足够 ETH,就允许铸造 NFT
如果用户不是管理员,就拒绝修改参数
如果投票时间结束,就统计投票结果
12. 用户账户与合约拥有账户
PPT 中还提到,以太坊账户可以从使用方式上理解为:
text
用户账户
合约拥有账户
12.1 用户账户
用户账户由个人用户创建和控制。
它可以通过以下方式生成:
text
钱包软件
客户端程序
第三方钱包服务
用户账户可以:
- 接收 ETH;
- 发送 ETH;
- 调用智能合约;
- 与 DApp 交互;
- 管理自己的资产。
12.2 合约拥有账户
合约拥有账户是为了方便智能合约部署和管理而设计的账户形式。
它与普通用户账户类似,也有地址和余额,但它还具有:
text
合约代码
合约存储
特殊执行权限
其主要用途是:
- 部署智能合约;
- 管理合约数据;
- 执行链上逻辑;
- 与其他账户交互。
13. UTXO 模型与账户余额模型对比
| 对比项 | UTXO 模型 | 账户余额模型 |
|---|---|---|
| 代表系统 | 比特币 | 以太坊 |
| 余额记录方式 | 通过多个 UTXO 求和得到 | 直接记录账户余额 |
| 交易本质 | 消耗旧 UTXO,生成新 UTXO | 修改账户状态 |
| 是否类似现金 | 是 | 否,更像银行账户 |
| 是否适合智能合约 | 不太方便 | 更适合 |
| 并行处理能力 | 较强 | 相对复杂 |
| 隐私性 | 可通过多地址增强隐私 | 账户长期固定,关联性更强 |
| 编程难度 | 复杂 | 更直观 |
| 防双花机制 | UTXO 只能花费一次 | nonce 防止交易重放 |
| 状态管理 | UTXO 集合 | 全局账户状态 |
14. 两种模型的核心区别
14.1 UTXO 模型关注"钱从哪里来,到哪里去"
UTXO 模型中,每笔交易都要说明:
text
我花的是哪一笔旧输出?
我生成了哪些新输出?
它更像现金交易。
14.2 账户模型关注"账户状态如何变化"
账户模型中,每笔交易更关注:
text
谁的余额减少?
谁的余额增加?
合约状态如何改变?
它更像银行账户或数据库状态更新。
15. 常见疑问解答
问题 1:比特币为什么不用账户余额模型?
比特币的设计目标主要是点对点电子现金系统。
UTXO 模型更适合表达"现金式"的资产流动,每个 UTXO 就像一张可追踪的数字纸币。
这种设计有利于:
- 防止双花;
- 简化交易验证;
- 清晰追踪资金来源;
- 支持并行验证。
问题 2:为什么 UTXO 要整体花费?
UTXO 类似现实中的纸币。
如果你有一张 100 元纸币,想买 30 元的东西,你通常要把 100 元整张付出去,然后得到 70 元找零。
UTXO 也是类似:
text
旧 UTXO 整体作为输入
新 UTXO 作为输出
如果有多余金额,就生成找零输出。
问题 3:以太坊为什么使用账户模型?
以太坊不只是转账系统,它还要支持智能合约。
智能合约需要:
- 固定地址;
- 可持续存储;
- 可被重复调用;
- 能维护内部状态。
账户模型更适合这些需求。
如果使用 UTXO 模型实现复杂合约,状态管理会更麻烦。
问题 4:合约账户为什么没有私钥?
合约账户不是由人直接控制的账户,而是由代码控制的账户。
合约账户的行为应该由预先部署的智能合约逻辑决定,而不是由某个私钥持有者随意决定。
所以合约账户没有私钥,也不能主动签名发起交易。
问题 5:合约账户能不能自己运行?
不能。
合约账户不会自动执行代码。
它必须被交易触发。
通常是:
text
外部账户 EOA 发起交易 → 调用合约账户 → 合约代码执行
或者:
text
一个合约被调用后,再调用另一个合约
问题 6:账户模型中如何防止重复交易?
以太坊账户模型中使用 nonce 防止交易重放。
每个账户都有自己的 nonce。
当账户发出一笔交易后,nonce 增加。
如果有人试图重复提交旧交易,由于 nonce 已经不匹配,交易会被拒绝。
16. 学习重点总结
16.1 必须掌握的概念
text
UTXO
交易输入
交易输出
找零
双花
账户余额模型
EOA
CA
私钥
公钥
地址
签名
nonce
智能合约
16.2 必须理解的关系
text
UTXO 模型:旧输出 → 新输入 → 新输出
账户模型:账户状态 → 交易执行 → 新账户状态
EOA:私钥控制,可主动发起交易
CA:代码控制,被交易触发执行
16.3 一句话记忆
text
比特币像现金,用 UTXO 记录每一笔未花费的钱;
以太坊像账户系统,用账户余额和状态支持智能合约。
17. 考试与问答常见题型
题 1:UTXO 的全称是什么?
答案:
text
Unspent Transaction Output,未花费交易输出。
题 2:UTXO 模型中交易输入的本质是什么?
答案:
text
交易输入是对历史未花费交易输出的引用。
题 3:比特币如何判断一笔交易是否合法?
答案要点:
text
1. 输入引用的 UTXO 存在;
2. 该 UTXO 未被花费;
3. 签名验证通过;
4. 输入金额不小于输出金额;
5. 交易格式符合协议要求。
题 4:账户余额模型有什么特点?
答案:
text
账户余额模型类似银行账户,系统直接记录账户信息、交易记录和当前余额。
交易发生时,系统直接修改相关账户状态。
题 5:以太坊为什么采用账户余额模型?
答案:
text
因为以太坊需要支持智能合约,而智能合约需要稳定的账户身份、合约地址、代码存储和状态存储。
账户模型比 UTXO 模型更适合智能合约的部署、调用和管理。
题 6:EOA 和合约账户的区别是什么?
答案:
text
EOA 由私钥控制,可以主动发起交易,没有合约代码;
合约账户由合约代码控制,没有私钥,不能主动发起交易,只能被交易触发执行。
18. 结构化思维导图
交易模型
UTXO模型
未花费交易输出
交易输入
引用旧UTXO
交易输出
生成新UTXO
特点
防双花
可追踪
并行验证
找零机制
代表
比特币
账户余额模型
账户状态
余额
nonce
交易记录
代表
以太坊
优势
适合智能合约
状态直观
以太坊账户
外部账户EOA
私钥控制
可发起交易
可调用合约
合约账户CA
代码控制
无私钥
被交易触发
存储合约代码
19. 最终总结
区块链中的交易模型决定了系统如何记录资产、如何验证交易、如何更新状态。
比特币采用 UTXO 模型,不直接维护账户余额,而是维护所有未花费交易输出。它强调交易来源清晰、资产不可重复花费和现金式流转。
以太坊采用账户余额模型,直接维护账户状态,更接近传统银行账户。由于智能合约需要稳定的地址、代码存储和状态管理,所以账户模型更适合以太坊这样的可编程区块链。
理解交易模型,是进一步学习区块链账户地址、交易验证、智能合约、DeFi、NFT 和链上安全分析的基础。