BTC的Transaction

littlexiaoshuishui發表於2021-03-26

每一筆交易除了鑄幣交易(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 協議》,轉載必須註明作者和本文連結
用過哪些工具?為啥用這個工具(速度快,支援高併發...)?底層如何實現的?

相關文章