BTC的交易
每一笔交易除了铸币交易(coinbase)外,每一笔交易都拥有至少一个输入(TxIn)和至少一个输出(TxOut)。 比特币的交易模型为UTXO(unspend transaction output),即只记录未花费的比特币输出,每次交易花费的是之前的某一个或多个输出。
transaction重要信息
{
"version": 1,
"locktime": 0,
"id":"afadfadfadfadf"
//输入部分
"vin": [
{
"txid": "7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",
"vout": 0,
"scriptSig":"adfadfadf" (付款人公钥,付款人地址,付款人签名)
}
],
//输出部分,下面有两个输出
"vout": [
{
"value": 0.01500000,
"scriptPubKey": "OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG"(收款人地址)
},
{
"value": 0.08450000,
"scriptPubKey": "OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG",
}
]
}
Input-输入部分
txid : 引用的UTXO所在的那笔交易ID
vout : 引用的UTXO所在交易的输出中的序号(从0开始),就是输出部分的下标
scriptSig : 解锁脚本,包含一个公钥和整个交易的一个签名
output-输出部分
value : 比特币数量
scriptPubkey : 锁定脚本,包含命令(OP_DUP等)和收款人的收款人的地址。
UTXO
- 比特币客户端会在每次接收到新block时更新会所有未花掉的output,检查一个交易是否合法只需要看这个交易的所有input是否在这个未花费的output表中
- 输出存在已使用和未使用两个状态。看某个地址拥有多少btc,就是计算所有这个地址的所有UTXO记录的总额。
- 当一个地址要发布一笔交易时,它所做的其实是向BTC整个网络中的节点广播该条交易,该条交易会被标记为“未确认的”(Unconfirmed)。BTC网络并不是收到一条广播就立刻更新系统的状态,而是有区块以及内存池的设计。在某一个时刻,所有BTC节点都维护着一个记录UTXO的账本,并有一个接收未确认交易的内存池(Mempool),当收到一条交易广播时,节点就会把该交易加入自己的内存池。
- 每个客户端还维护一个UTXO集合,保存所有未被使用的输出。
BTC的交易验证
上面有两个交易TX:A->B, TX:B->C
我们要验证TX:B->C,最主要是验证它的输入部分是否合法。
Transaction由本节点产生
1.接收的数据:收款人地址,付款人公私钥
2.从本节点的UTXO获取付款人可用的output,打包成这个transaction的input.
3.生成新的transaction,并且更新本地的UTXO
4.把transaction打包进区块等待发布
Transaction由其他节点产生,本节点验证
当别人发布区块时,本节点需要验证这个区块的所有交易
1.验证这个交易的所有input是否合法
1.验证公钥-地址是否匹配
2.验证签名是否匹配
3.验证input是否在本地的UTXO中,防止double spending
2.验证输入总额是否等于输出
3.这个交易通过后,需要更新本节点的UTXO
账户安全
付款人需要公开比特币地址(MyBitcoinAddr)以外,还需要公开公钥(MyPubKey)和签名(Signature)。而收款人只需要公开比特币地址,所以说一个地址如果没有发起过交易,他只暴露了比特币地址,而他如果要破解这个账户的私钥,就要先通过地址破解出公钥->再破解私钥,这几乎不可能。所以为了私钥被破解,尽量把剩余btc放到一个新的地址上,避免公钥暴露。
本文由博客群发一文多发等运营工具平台 OpenWrite 发布