交易:A向B进行比特币转账

交易本质:节点构建一段数据,然后广播到全网各个节点。这段数据包含交易输入和交易输出。交易输入是用比特币转账人的私钥生成的签名和公钥组成的解锁脚本。交易输出是对被转账人的比特币地址进行锁定的锁定脚本。

这是一段普通的交易脚本

{  
    "version": 1,  
    "locktime": 0,  

    "vin": 
    [    
        {      
            "txid": "7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18", 
            "vout": 0,
            "scriptSig" : "3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb649
                           8c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e381[ALL]

                           30484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc541233
                           6376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf",
            "sequence": 4294967295
        }
    ], 

    "vout": 
    [
        {
            "value": 0.01500000,
            "scriptPubKey": "OP_DUP OP_HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 OP_EQUALVERIFY OP_CHECKSIG“
        },
        {
            "value": 0.08450000,
            "scriptPubKey": "OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG",
        }
    ]
} 

 

1、构建交易。

交易输入vin:从UTXO集中找到UTXO,或者这些UTXO对应的交易ID和索引。用私钥对交易进行签名,并和公钥组成解锁脚本

交易输出vout:计算手续费,计算找零,对输出的公钥哈希地址(比特币地址)进行锁定,生成锁定脚本。

2、广播交易

通过比特币网络向已连接的节点广播该交易,每个节点验证后又转发出去,很快这笔交易便会被所有节点收到。

3、验证交易

节点收到交易后,必须要验证该交易是否正确,正确的交易才会继续向其他节点传播。每个节点都可独立验证该笔交易。

节点解析交易脚本,从本地中读出UTXO,将这个交易输入的解锁脚本和UTXO的锁定脚本组合,验证对这个比特币地址的所有权,防止作假

4、打包交易

当节点验证交易后,便会将这个交易转发出去,整个网络所有的节点很快都会收到该交易,每个节点都会把收到的交易放到一个叫临时交易池的地方,并把临时交易池的交易打包到候选区块中,进行挖矿。

 

其中构建交易和广播交易的QT客户端流程图如下比特币交易源码学习

 

如果这个交易是通过命令行构建的,其流程图如下

比特币交易源码学习

从上面两个流程图看出,可谓殊途同归,最终都是通过INV命令发送出去

 

相关文章: