BTC的交易结构不符合常识
比特币的账本不记录任何人的“账户余额”。它只记录一笔笔“未被花费的交易输出”,即 UTXO (Unspent Transaction Output)。这个账本记录有一些不符合我们日常常识的地方:
- 没有“账户”这个概念:比特币协议层面没有“账户”。你的“余额”并不是一个存在某处的数字,而是你的钱包软件在背后默默地帮你扫描整个区块链,把你所有能花的“电子钞票”(UTXOs)加起来的总和。
- 花钱就像用现金,必须整张花掉:假设你的钱包里有一张价值5 BTC的UTXO(一张电子钞票),而你只想给朋友转1 BTC。
- 你不能从这张5 BTC的“钞票”上撕下1 BTC给朋友。
- 你必须把整张5 BTC的钞票都花掉。这笔交易会产生两个新的输出(两张新钞票):
- 一张价值1 BTC的新钞票,支付给你的朋友。
- 一张价值4 BTC的新钞票(扣除手续费后略少于4 BTC),作为**“找零”**支付给你自己的一个新地址。
- 这就是为什么你有时会发现,明明只给别人转了一笔账,但在区块浏览器上却看到了两笔收款,其中一笔是找零给自己的。
- “找零”可能暴露隐私:因为“花钱”和“找零”通常在同一笔交易中,分析者可以通过追踪这些找零地址,推断出哪些不同的地址可能属于同一个人。
基于账户的账本 (Account-based Model)
相比BTC,ETH更像一个传统的银行账户系统。以太坊的全球“状态”就是一个巨大的数据库,里面记录了所有账户和它们对应的状态。账户分为两种:
外部拥有账户 (EOA - Externally Owned Account)
这是普通用户最常接触和使用的账户类型。在MetaMask或其他钱包里创建的,用来存储和发送ETH的,就是EOA账户。EOA账户的特征如下:
- 由私钥控制 (Controlled by a Private Key)
- 这是EOA最根本的特征。每个EOA都有一对密钥:一个公开的地址和一个绝密的私钥。
- 私钥是控制权的唯一凭证。只有持有私钥的人,才能对这个账户的资产进行签名和授权交易。丢失了私钥,就永远失去了对这个账户的控制。
- 能够主动发起交易 (Can Initiate Transactions)
- 在以太坊网络中,所有交易的起点必须是一个EOA账户。
- 无论是简单的ETH转账,还是与智能合约进行交互(例如在Uniswap上交易,或者铸造一个NFT),这个“第一推动力”都必须来自一个EOA账户的签名和Gas费支付。它们是网络中唯一的“主动方”。
- 没有关联代码 (No Associated Code)
- EOA账户本身非常简单,它不包含任何可执行的逻辑代码。它就像一个简单的保险箱,只能存钱(接收ETH)和取钱(发送ETH或调用合约)。
账户构成:
一个EOA账户的状态主要由两部分组成:
balance
: 该地址持有的以太币(ETH)余额。nonce
: 一个交易计数器,记录了该账户已发送的交易数量,用于防止交易重放(双花攻击)。
创建成本:
- 免费。创建一个EOA本质上只是在本地(离线)通过算法生成一对公钥和私钥。这个过程不涉及与区块链的任何交互,因此不消耗任何Gas。
合约账户 (Contract Account)
合约账户本质上就是一个部署在以太坊区块链上的智能合约。它是一个由代码控制的“自治实体”。
- 由代码控制 (Controlled by Code)
- 合约账户没有私钥。没有人可以直接“拥有”或“登录”一个合约账户。
- 它的行为完全由其内部部署的智能合约代码来定义。代码规定了它在收到特定消息或交易时应该做什么。它像一个按程序运行的机器人。
- 不能主动发起交易 (Cannot Initiate Transactions)
- 这是一个至关重要的区别。合约账户是被动的,它永远不能自己凭空发起一笔新的交易。
- 它的代码只有在被一个交易“激活”时才会运行。这个激活它的交易必须源自一个EOA(或者由另一个被EOA激活的合约传来)。
- 有关联代码和存储 (Has Associated Code and Storage)
- 这是合约账户的“超能力”。每个合约账户都内嵌了一段不可更改的逻辑代码(Code)。
- 它还拥有自己的一片专属的、持久的内部数据库,称为存储(Storage),可以用来记录各种状态(例如,一个DEX合约可以记录流动性池的代币数量,一个NFT合约可以记录每个Token ID的所有者是谁)。
账户构成:
一个合约账户的状态由四部分组成:
balance
: 和EOA一样,它可以持有ETH。nonce
: 合约账户的nonce有特殊用途,它只在该合约创建其他新合约时才会增加。codeHash
: 指向其智能合约代码的哈希值。storageRoot
: 指向其内部存储(Storage)数据的哈希值。
创建成本:
- 需要支付Gas费。创建一个合约账户,实际上是向以太坊网络发送一笔特殊的交易来“部署”你的智能合约代码。这个过程需要消耗计算和存储资源,因此必须支付Gas费。
典型的互动流程总是这样开始的:
- 一个EOA账户(用户Alice)想要执行某个操作。
- Alice用她的私钥签名一笔交易,并支付Gas费。
- 这笔交易的目标地址可能是一个合约账户(例如Uniswap的路由器合约)。
- 合约账户在收到交易后,其内部代码被激活并开始执行。
- 在执行过程中,这个合约账户可能会调用另一个合约账户,或者向某个EOA账户发送ETH。
两大模型的优势与劣势
特性 | 比特币 (UTXO 模型) | 以太坊 (账户模型) |
---|---|---|
核心优势 | 高安全性 & 可并行处理 | 高效率 & 对智能合约友好 |
优势详述 | 1. 防止双花:每个UTXO只能被花费一次,一旦花费即被销毁,从根本上杜绝了双花问题。 <br>2. 隐私性更佳:用户可以为每笔找零使用新地址,增加了追踪资金流向的难度。 <br>3. 可并行化:不同UTXO之间的交易没有依赖关系,理论上可以并行处理,有更好的扩容潜力。 | 1. 直观易懂:模型简单,符合人们对银行账户的认知。 <br>2. 节省空间:只需存储每个账户的最终状态,而不用存储每一笔“找零”记录。 <br>3. 对智能合约极其友好:智能合约可以轻松地读取和写入其他账户的状态(如余额、数据),对于构建复杂的DeFi应用至关重要。 |
劣势详述 | 1. 对智能合约不友好:很难构建需要追踪和交互复杂状态的智能合约。 <br>2. 不直观:“找零”和“余额是计算出来的”等概念对新手不友好。 <br>3. “粉尘”问题:可能会产生大量极小额的UTXO,花费它们的手续费甚至超过其自身价值。 | 1. 重放攻击风险:需要引入nonce 机制来防止同一笔交易被恶意重复广播和执行。<br>2. 处理逻辑更复杂:因为交易是按顺序执行的,并且可能相互影响,使得交易的处理和验证逻辑更加复杂,难以并行化。 |
简单来说,比特币的UTXO模型是一个“无状态”的设计,,只关心每一笔钱的来龙去脉,安全且纯粹。这使其非常适合作为一种可靠的价值存储(数字黄金)。
而以太坊的账户模型是一个“有状态”的设计,关心的是每个账户的“当前状态”,并能轻松地改变它们。这使其成为运行复杂智能合约和构建“世界计算机”的理想选择。