Bitcoin交易及验证
UTXO 理解
未花费交易输出: Unspent Transxtion output
UTXO
---用比特币拥有者的公钥锁定
(加密)的一个数字UTXO
== 比特币- 比特币系统里没有必有比特币,只有UTXO
- 比特币系统没有账户, 只有UTXO(公钥锁定)
- 比特币系统里没有账户余额,只有UTXO(账户月只是比特币钱包的概念)
- UTXO存在全节点的数据库里
- 转账将消耗掉属于自己的UTXO,同时生成新的UTXO,并用接收者的公钥锁定。
- 比特币系统没有账户概念。
交易的结构
- 交易的输出(UTXO)
- 锁定的比特币数量
- 锁定的脚本(用接收者的公钥哈希)
- 交易的输入(UTXO+解锁脚本)
- 解锁(自己的私钥)脚本(用发送者签名,接收者的公钥hash)
交易的确认
交易的确认必须放在区块链上才算完成
交易验证
基于栈的脚本语言
-
栈(
stack
)- 操作数据的一种结构- 只能从一端操作数据,后进新出
LIFO(Last In, First Out)
- 如同子弹匣,先压入的子弹最后打出
- 压栈(
PUSH
),出栈(POP
)
- 只能从一端操作数据,后进新出
-
验证交易- 基于栈的脚本语言
-
对栈的操作:
OP_DUP
--- -
逻辑运算符:
OP_EQUALVERIFY
-
加解密运算符:
OP_HASH160
OP_CHECKSIG
-
算数运算符:
OP_ADD
--- 加0P_SUB
--- 减OP_MUL
--- 乘OP_DIV
--- 除
-
逆波兰表示法
- 简易运算规则:
- 所有造作符号位于操作数的后面
- 遇到操作数(数字),则压栈
(PUSH)
- Y遇到二元运算符(
+,-, x ,/
)- 先将2个操作数出栈
pop
- 然后对运算数进行计算
- 最后将计算结构压栈
- 先将2个操作数出栈
- 传统表达式(中缀表示法):
(1+2)*3 == 9
- 逆波兰表示法(后缀表示法):
1 2 + 3 * 9 ==
使用逆波兰表示法验证交易
-
锁定脚本
OP_DUP OP_HASH160<发送者公钥哈希> OP_EQUALVERIFY OP_CHECKSIG
-
解锁脚本
- <发送者的签名><发送者公钥>
-
交易验证:
签名
公钥
DUP
HASH
公钥哈希
==
验证签名
运行解锁脚本
+锁定脚本
=> True
过程如下(逆波兰表示法):
-
a.
发送者签名
与发送者公钥
进行压栈(保护在解锁脚本正) -
b.
DUP
--将公钥copy到栈顶 -
c.
HASH
运算符,只需要一个数,将公钥POP出去进行hash算法,生成一个公钥hash -
d. 将新生成的公钥哈希 压栈
-
e. 将锁定脚本(UTXO)中的公钥哈希压栈;
-
f.
OP_EQUALVERIFY
---遇到==
操作符,将栈中两个公钥哈希比较,为True的话,栈中的两个哈希公钥会废除掉,继续进行压栈操作 -
g. 验证签名(
OP_CHECKSI
)--POP出栈中的发送者签名
与发送者公钥
,使用公钥验证签名,如果通过,则UTXO可以使用
♥永远年轻,永远热泪盈眶♥