交易服务
Last updated
Last updated
仅有转帐数额和转入钱包地址无法证明交易的生成者对转出钱包地址余额有动用的权利。需要用私钥对原始数据进行签名。
通过公钥、签名和转帐信息使用校验算法进行确认。
所有权确认后,接下来就是:
具有可动用的资金
其他交易不会用到同一笔资金
由于缺乏中心化的机构管理,与传统银行中使用账户结余不同,比特币使用了Unspent Transaction Output(UTXO,未花费的交易输出)来确保同一笔资金只出现在一笔交易中。
当一个用户收到一笔 BTC 交易时,会计入UTXO
中。A 想要给 B 转账 5 个 BTC,A 的这 5 个 BTC 可能来自于两个UTXO
(2 BTC + 3 BTC),因此 A 在转账给 B 时,矿工需要检验的是这两笔UTXO
在这笔交易之前有没有被花掉,如果检测已经被花费了,则交易不合法。
UTXO
有一个很重要的特性,不可分割,假如 A 有 20 个 BTC,他想转账 5 个 BTC 给 B,那交易会先将 20 个 BTC 作为输入,然后产生两个输出,一个向 B 转账 5 个 BTC,一个返还给 A 剩下的 15 个 BTC,因此,A 又拥有了一笔价值为 15 BTC 的 UTXO
;如果单个UTXO
不够支付,则可以组合多个形成输入,但总额一定要大于交易额。
矿工验证交易发起者有足够的余额:回顾以前所有的交易,并且找到所有UTXO
并相加。
UTXO交易模型基本形式:
版本号 + Input未花费交易UTXO + Output输出地址以及数量 + 锁定时间
安全性:结合所有权确认,每个交易都包含着比特币拥有者的签名,所有交易记录可以溯源,记录着比特币从出生开始的所有主人。
一般每个交易都会包括两个脚本:负责输入的解锁脚本(scriptSig)和负责输出的锁定脚本(scriptPubKey)。输出脚本一般由付款方对交易设置锁定,用来对能动用这笔交易的输出(例如,要花费该交易的输出)的对象(收款方)进行权限控制,例如限制必须是某个公钥的拥有者才能花费这笔交易。认领脚本则用来证明自己可以满足交易输出脚本的锁定条件,即对某个交易的输出(比特币)的拥有权。
其中,OP_DUP 是复制栈顶元素;OP_HASH160 是计算 hash 值;OP_EQUALVERIFY 判断栈顶两元素是否相等;OP_CHECKSIG 判断签名是否合法。这条指令实际上保证了只有 pubKey 的拥有者才能合法引用这个输出。另外一个交易如果要花费这个输出,在引用这个输出的时候,需要提供认领脚本。其中, 是拿 pubKey 对应的私钥对交易(全部交易的输出、输入和脚本)Hash 值进行签名,pubKey 的 Hash 值需要等于 pubKeyHash。
进行交易验证时,会按照先 scriptSig 后 scriptPubKey 的顺序进行依次入栈处理:
比特币无法造假,因为系统会判断每个币的来源是否合法。