BTC的交易

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

  1. 比特币客户端会在每次接收到新block时更新会所有未花掉的output,检查一个交易是否合法只需要看这个交易的所有input是否在这个未花费的output表中
  2. 输出存在已使用和未使用两个状态。看某个地址拥有多少btc,就是计算所有这个地址的所有UTXO记录的总额。
  3. 当一个地址要发布一笔交易时,它所做的其实是向BTC整个网络中的节点广播该条交易,该条交易会被标记为“未确认的”(Unconfirmed)。BTC网络并不是收到一条广播就立刻更新系统的状态,而是有区块以及内存池的设计。在某一个时刻,所有BTC节点都维护着一个记录UTXO的账本,并有一个接收未确认交易的内存池(Mempool),当收到一条交易广播时,节点就会把该交易加入自己的内存池。
  4. 每个客户端还维护一个UTXO集合,保存所有未被使用的输出。

BTC的交易验证

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 发布

上一篇:浅析类加载


下一篇:【经验】JavaScript