BTC的Transaction

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的交易验证

preview

上面有两个交易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.验证签名是否匹配,这个是关键,签名是用付款人私钥生成的,必须用input里面的公钥去验证,
2.验证input是否在本地的UTXO中,你要使用这个钱,首先要找到来源。使用input里面的付款人地址(公钥双hash)去UTXO匹配,匹配上就说明这个地址还有未花的btc.
这两个验证是相辅相成的,假如你得到一个人的公钥,想用它转钱到自己地址上,你就必须用它的私钥做签名才能通过验证。假如你用假的公钥和假的签名,那这个假的公钥对应的地址去匹配UTXO就匹配不到。所以只有同时有公私钥才能发生交易。

2.验证输入总额是否等于输出

3.这个交易通过后,需要更新本节点的UTXO

账户安全

付款人需要公开比特币地址(MyBitcoinAddr)以外,还需要公开公钥(MyPubKey)和签名(Signature)。而收款人只需要公开比特币地址,所以说一个地址如果没有发起过交易,他只暴露了比特币地址,而他如果要破解这个账户的私钥,就要先通过地址破解出公钥->再破解私钥,这几乎不可能。所以为了私钥被破解,尽量把剩余btc放到一个新的地址上,避免公钥暴露。

本作品采用《CC 协议》,转载必须注明作者和本文链接
用过哪些工具?为啥用这个工具(速度快,支持高并发...)?底层如何实现的?
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!