状态转换
最后更新于
从技术角度讲,比特币账本可以被认为是一个状态转换系统,该系统包括所有现存的比特币所有权状态和“ 状态转换函数” 。状态转换函数以当前状态和交易为输入,输出新的状态。
比特币系统的“ 状态” 是所有已经被挖出的、没有花费的比特币(技术上称为“ 未花费的交易输出, 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. 交易的每个输入: 如果引用的 UTXO 不存在于现在的状态中( S),返回错误提示 如果签名与 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 自己,也就是找零。