比特幣(非隔離見證/隔離見證)的txid是怎麼生成的?會重嗎?

非隔離見證txid

# hex包括[nVersion][txins][txouts][nLockTime]
txid = SHA256(SHA256(hex))

下面是hex解析後的內容

01000000   // 版本號,UINT32
03         // Tx輸入數量,變長INT。3個輸入。

/*** 第一組Input Tx ***/
// Tx Hash,固定32字節
c9f3b07ebfca68fd1a6339d0808fbb013c90c6095fc93901ea77410103489ab7
00000000  // 消費的Tx位於前向交易輸出的第0個,UINT32,固定4字節
8a        // 簽名的長度, 0x8A = 138字節
// 138字節長度的簽名,含有兩個部分:公鑰+簽名
47       // 簽名長度,0x47 = 71字節
3044022055bac1856ecbc377dd5e869b1a84ed1d5228c987b098c095030c12431a4d5249022055523130a9d0af5fc27828aba43b464ecb1991172ba2a509b5fbd6cac97ff3af01
41       // 公鑰長度,0x41 = 65字節
048aefd78bba80e2d1686225b755dacea890c9ca1be10ec98173d7d5f2fefbbf881a6e918f3b051f8aaaa3fcc18bbf65097ce8d30d5a7e5ef8d1005eaafd4b3fbe
ffffffff  // sequence,0xffffffff = 4294967295, UINT32, 固定4字節

/*** 第二組Input Tx。與上同理,省略分解 ***/
c9f3b07ebfca68fd1a6339d0808fbb013c90c6095fc93901ea77410103489ab7010000008a47304402206b993231adec55e6085e75f7dc5ca6c19e42e744cd60abaff957b1c352b3ef9a022022a22fec37dfa2c646c78d9a0753d56cb4393e8d0b22dc580ef1aa6cccef208d0141042ff65bd6b3ef04253225405ccc3ab2dd926ff2ee48aac210819698440f35d785ec3cec92a51330eb0c76cf49e9e474fb9159ab41653a9c1725c031449d31026affffffff

/*** 第三組Input Tx ***/
c98620a6c40fc7b3a506ad79af339541762facd1dd80ff0881d773fb72b230da010000008b483045022040a5d957e087ed61e80f1110bcaf4901b5317c257711a6cbc54d6b98b6a8563f02210081e3697031fe82774b8f44dd3660901e61ac5a99bff2d0efc83ad261da5b4f1d014104a7d1a57e650613d3414ebd59e3192229dc09d3613e547bdd1f83435cc4ca0a11c679d96456cae75b1f5563728ec7da1c1f42606db15bf554dbe8a829f3a8fe2fffffffff

02  // Tx輸出數量,變長INT。兩個輸出。

/*** 第一組輸出 ***/
00bd010500000000    // 輸出的幣值,UINT64,8個字節。字節序需翻轉,~= 0x000000000501bd00 = 84000000 satoshi
19                  // 輸出目的地址字節數, 0x19 = 25字節,由一些操作碼與數值構成
// 目標地址
// 0x76 -> OP_DUP(stack ops)
// 0xa9 -> OP_HASH160(crypto)
// 0x14 -> 長度,0x14 = 20字節
76 a9 14 
// 地址的HASH160值,20字節
634228c26cf40a02a05db93f2f98b768a8e0e61b 
// 0x88 -> OP_EQUALVERIFY(bit logic)
// 0xac -> OP_CHECKSIG(crypto)
88 ac

/*** 第二組輸出 ***/
c096c7a603000000
19
76 a9 14 7514080ab2fcac0764de3a77d10cb790c71c74c2 88 ac

00000000  // lock_time,UINT32,固定4字節

重複的txid

值得注意的是,早期的coinbase交易可能會出現相同的txid,見這個coinbase交易。當出現相同txid的coinbase交易時,會出現覆蓋的現象。例如,你在91880,91722區塊都挖到礦了。理論上你會獲得100個比特幣,但由於你的coinbase交易的txid是一樣的,後面的覆蓋前面,你最後只獲得50個比特幣。
但是,後面修復了這個問題:

  • BIP 30 introduced a rule that prevented blocks from containing a TXID that already exists.
  • BIP 34 required coinbase transactions to include the height of the block the were mining in to their transaction data.

隔離見證的txid與wtxid

在隔離見證的結構下,每個交易將有兩個ID.

  1. txid保持不變,Double SHA256哈希以下序列化的數據:[nVersion][txins][txouts][nLockTime]

  2. 新定義一個wtxid,Double SHA256哈希含有witness數據的序列化數據:[nVersion][marker][flag][txins][txouts][witness][nLockTime]

其中:

nVersion, txins, txouts, and nLockTime保持不變
marker必須爲一個字節的零值:0x00
flag必須爲一個字節的非零值,目前使用0x01
witness爲交易的所有見證數據
起始用var_int表示有幾個輸入
然後每個項的起始用var_int標識其數據長度
Witness數據並不是腳本

如果一個交易輸入不含有任何的witness program(可以視爲不帶OP操作碼的scriptPubKey),則交易的wtxid等於txid。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章