> For the complete documentation index, see [llms.txt](https://neochain.gitbook.io/project/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://neochain.gitbook.io/project/bitcoin/zhuang-tai-zhuan-huan.md).

# 状态转换

## 状态转换

![](https://2375552330-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LACIimCQkax7RsvvwR2%2F-LEHj2w3FeWNYFtPMV2p%2F-LEHlwlo7TGtr3LVDfiO%2FBitcoin_State.png?alt=media\&token=310df228-8372-4d90-bc14-634bb8e771ce)

从技术角度讲，比特币账本可以被认为是一个状态转换系统，该系统包括所有现存的比特币所有权状态和“ 状态转换函数” 。状态转换函数以当前状态和交易为输入，输出新的状态。

比特币系统的“ 状态” 是所有已经被挖出的、没有花费的比特币（技术上称为“ 未花费的交易输出， unspent transaction outputs 或 UTXO” ）的集合。每个 UTXO 都有一个面值和所有者（由 20 个字节的本质上是密码学公钥的地址所定义\[1]）。一笔交易包括一个或多个输入和一个或多个输出。每个输入包含一个对现有 UTXO 的引用和由与所有者地址相对应的私钥创建的密码学签名。每个输出包含一个新的加入到状态中的 UTXO。

例如，在标准的银行系统中，状态就是一个资产负债表，一个从 A 账户向 B 账户转账 X 美元的请求是一笔交易，状态转换函数将从 A 账户中减去 X 美元，向 B 账户增加 X 美元。如果 A 账户的余额小于 X 美元，状态转换函数就会返回错误提示。所以我们可以如下定义状态转换函数：

APPLY(S,TX) > S' or ERROR

在上面提到的银行系统中，状态转换函数如下：

APPLY({ Alice: $50, Bob: $50 },"send $20 from Alice to Bob") = { Alice:$30,Bob: $70 }

但是：

APPLY({ Alice: $50, Bob: $50 },"send $70 from Alice to Bob") = ERROR

比特币系统的“ 状态” 是所有已经被挖出的、没有花费的比特币（技术上称为“ 未花费的交易输出， unspent transaction outputs 或 UTXO” ）的集合。每个 UTXO 都有一个面值和所有者（由 20 个字节的本质上是密码学公钥的地址所定义\[1]）。一笔交易包括一个或多个输入和一个或多个输出。每个输入包含一个对现有 UTXO 的引用和由与所有者地址相对应的私钥创建的密码学签名。每个输出包含一个新的加入到状态中的 UTXO。

在比特币系统中，状态转换函数 APPLY(S,TX)->S’ 大体上可以如下定义：

1\. 交易的每个输入：\
&#x20;   如果引用的 UTXO 不存在于现在的状态中（ S），返回错误提示\
&#x20;   如果签名与 UTXO 所有者的签名不一致，返回错误提示

2\. 如果所有的 UTXO 输入面值总额小于所有的 UTXO 输出面值总额，返回错误提示

3\. 返回新状态 S’ ,新状态 S 中移除了所有的输入 UTXO，增加了所有的输出UTXO。

第一步的第一部分防止交易的发送者花费不存在的比特币，第二部分防止交易的发送者花费其他人的比特币。第二步确保价值守恒。比特币的支付协议如下。假 设 Alice 想给 Bob 发送 11.7BTC。事实上， Alice 不可能正好有 11.7BTC。假设，她能得到的最小数额比特币的方式是： 6+4+2=12。所以，她可以创建一笔有 3个输入， 2 个输出的交易。第一个输出的面值是 11.7BTC，所有者是 Bob（ Bob的比特币地址），第二个输出的面值是 0.3BTC，所有者是 Alice 自己，也就是找零。
