UTXO - Unspent TransXtion Output
未花费交易输出: 用公钥锁定(加密)一个数字
比特币系统里没有比特币概念,只有UTXO
比特币系统里没有账号概念,只有公钥锁定的UTXO
比特币系统里没有账户余额概念,只有UTXO
UTXO存在全节点的数据库里
转账将消耗点属于你自己的UTXO,同时生成新的UTXO,并用接受者的公钥锁定
交易包括两个部分:n输入和m输出 (n>=0,m>0)
输入: 要被花费的UTXO +解锁脚本
输出: UTXO + 锁定脚本
交易的结构
交易的输出:锁定的比特币数量 和 锁定脚本
交易的输入:解锁脚本
交易的确认: 只有进入到区块的交易才算确认
交易验证脚本语言 - 基于栈的脚本语言
栈(stack) - 操作数据的一种结构
只能做一段操作数据,后进 先出(last in First Out)
压栈(PUSH) 出栈(POP)
逆波兰表示法
所有的操作运算符都位于操作数后面
遇到操作数字, 则压栈 PUSH
遇到运算符 (+,-,*,/):
先将2个操作数字出栈POP
然后用后面的运算符对两个数字计算
然后在将计算结果压栈PUSH
一般标识法:(1+2) * 3 == 9 ?
逆波兰表示法:1 2 + 3 * 9 == ?
交易验证
锁定脚本
OP_DUP OP_HASH160<发送者 公钥哈希> OP_EQUALVERIFY OP_CHECKSIG
解锁脚本
<发送者签名><发送者公钥>
交易验证: 运行解锁脚本 + 锁定脚本 => True
验证主要:
交易的大小要小于区块大小的上限
交易输入的UTXO是存在的
交易输入UTXO没有被其他的交易引用-防止双花(double spending)
输入总金额 > 输出总金额
解锁脚本验证
将合格的交易加入到本地的transaction 数据库中,并将合法的交易转给临近的节点