区块链的数字货币
数字货币:
从技术角度来说, 这加密货币的账本,如比特币可以被看作为一个状态转移的系统, 在这个系统里, 有一个包含了现在所有已存在的比特币的持有者的状态,并且有一个“状态转移函数”可以使用一个状态和一个交易来产生一个新的状态。在一个标准的银行体系里, 这状态就是一个资产负债表, 当一个交易要求把X$的钱,从A转移到B时, 那么它的状态转移函数就会从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个字节组成的地址,其本质是一个加密的公钥). 一个交易包含了一个或多个输入,每一个输入都包含了对一个已存在的UTXO的引用,和用持有者的地址所关联着的私钥来产生的一个加密签名, 并且会产生一个或多个输出, 每一个输出包含一个用于添加到状态的新的UTXO。
这状态转移函数 APPLY(S,TX) -> S' 可以被大概的定义如下:
1. 在 TX中的每个输入:
o 如果被引用的UTXO不在 S里,返回一个错误.
o 如果提供的签名和UTXO的所有者匹配不上, 返回一个错误.
2. 如果所有的输入的 UTXO 的面值的和少于所有输出的UTXO的面值的和,返回一个错误.
3. 返回一个所有输入的UTXO都被移除的,所有输出的UTXO都被加进的新的 S' .
第一个步骤的前半部分防止交易的发送方消费不存在的硬币, 第一步骤的后半部分阻止了交易的发送方使用别人的硬币, 第二个步骤是强制的价值保护。为了使用这种支付方式,协议如下。 假设 Alice 想发送11.7 BTC 给 Bob. 首先, Alice 要找到一组她自己拥有的有效的UTXO ,且总数要至少不低于 11.7 BTC. 实际上, Alice 不会恰巧刚好拥有11.7 BTC; 她得到的最小值是6+4+2=12,她然后使用这3个输入和2个输出创建了一个交易。 这第一个输出是 11.7 BTC ,是输出Bob,第二个输出是剩下的 0.3 BTC “找零”。如果 Alice 没有要求把这个找零发送到她自己的账户上, 那么这矿工可以要求拥有这个零钱.