比特幣系統(tǒng)中最重要的部分是比特幣交易,其他部分都是為了確保比特幣交易的生成、能夠在比特幣網(wǎng)絡(luò)中得以傳播和通過驗證,最終添加到全球比特幣交易總賬簿。
比特幣交易的基礎(chǔ)構(gòu)建單元是交易輸出,記錄在區(qū)塊上,被整個網(wǎng)絡(luò)識別為有效。比特幣完整節(jié)點(diǎn)跟蹤所有可找到的和可使用的輸出,稱為UTXO(unspent transaction outputs)。UTXO只記錄未花費(fèi)的比特幣輸出,每次交易花費(fèi)的是之前的某一個或多個輸出。比特幣存儲的實(shí)際是一筆又一筆的交易,最后永遠(yuǎn)只有未花費(fèi)過的交易輸出,也就是UTXO。
用戶錢包收到比特幣時,是錢包檢測到了可用的UTXO。通過錢包控制的密鑰可以把UTXO花出去。因此,用戶的比特幣“余額”是指用戶錢包中可用的UTXO總和,可能分散在數(shù)百個交易和區(qū)塊中。比特幣錢包通過掃描區(qū)塊鏈統(tǒng)計所有屬于該用戶的UTXO來計算該用戶的余額。
一個UTXO可以是1“聰”(satoshi)的任意整數(shù)倍,比特幣可以被分割成八位小數(shù)的“聰”。UTXO一旦被創(chuàng)建出來就不可分割,一個UTXO只能在一次交易中作為一個整體被消耗。
有一種特殊的交易,稱為Coinbase交易,即礦工挖出的比特幣,該交易沒有輸入,只有輸出。
交易輸出包含兩個部分:
1.一定量的比特幣,面值為“聰”,是最小的比特幣單位
2.確定花費(fèi)輸出所需條件的加密難題,加密難題也被稱為locking script, witness script或scriptPubKey

交易輸入將UTXO標(biāo)記為將被消費(fèi),通過解鎖腳本提供所有權(quán)證明。
要構(gòu)建一個交易,一個錢包從它控制的UTXO中選擇足夠的價值來執(zhí)行被請求的付款。有時一個UTXO足夠,有時不止一個。對于將用于此付款的每個UTXO,錢包將創(chuàng)建一個指向UTXO的輸入,并使用解鎖腳本解鎖。
輸入包括兩個主要部分去下:
1.指向UTXO的指針,通過指向UTXO被記錄在區(qū)塊鏈中所在的交易的哈希值和序列號實(shí)現(xiàn)。
2.解鎖腳本,大部分情況下,解鎖腳本是一個證明比特幣所有權(quán)的數(shù)字簽名和公鑰。

交易數(shù)據(jù)格式
比特幣交易數(shù)據(jù)解碼網(wǎng)站:https://blockchain.info/decode-tx

示例:
播報數(shù)據(jù)HEX格式
01000000024a2989e933ed9875f83776ddb4ee105a3ee7363e60e0f53db8a682f82aa52303010000006b483045022071e572d11357a0801ce69741ffde20de49099cd4ddeac19d4ad6697ca766c5fc022100835d7dabdc674e78ca523f09811b7178b3c31d08735909a28975721c6a2d2e34012103be47f412d8e23a3baf591bbe42c5859062b5b0b168567ecd8746ddc1948103fdffffffff0bcdf46d36a33c8d768e25be6b185bc9efad8aca7fad55b5180c9475afe6718f000000006c493046022100ae57aeb9711a6879bc7ddd363feb62aa5aa42b0dca6aa81e1eafc533e4cce0c4022100db46f11ac362e0fe494c65d24fb702c92ebc554690a7447365d38e7aa3613a740121030b7979840ce44d7318f5883aed9d8f5a3c0778326beae0c2117ea8712c7de5aaffffffff0108880200000000001976a9148c2cbf83f9b3034007456580a9072a9304684a4988ac00000000
解碼如下:

HEX字段解析:
01000000? ? //verison
02? ? //輸入交易個數(shù)
//第一組輸入交易
4a2989e933ed9875f83776ddb4ee105a3ee7363e60e0f53db8a682f82aa52303? ? //交易ID,前向交易HASH值,反轉(zhuǎn)字節(jié)順序序列化,小端
01000000? ? //輸出索引,要花費(fèi)的UTXO的索引號
6b? ? //簽名的長度, 0x6b = 107字節(jié), 107字節(jié)長度的簽名,含有兩個部分:公鑰+簽名
48? ? //簽名長度,0×48 = 72字節(jié)
3045022071e572d11357a0801ce69741ffde20de49099cd4ddeac19d4ad6697ca766c5fc022100835d7dabdc674e78ca523f09811b7178b3c31d08735909a28975721c6a2d2e3401? ? //簽名序列化(DER)
? ? 0x30? ? //表示DER序列的開始
? ? 0x45? ? //序列的長度
? ? 0x02? ? //一個整數(shù)值
? ? 0x20? ? //整數(shù)的長度
? ? R-71e572d11357a0801ce69741ffde20de49099cd4ddeac19d4ad6697ca766c5fc
? ? 0x02? ? //接下來是一個整數(shù)
? ? 0x21? ? //整數(shù)的長度
? ? S-00835d7dabdc674e78ca523f09811b7178b3c31d08735909a28975721c6a2d2e34
? ? 后綴(0x01)指示使用的哈希的類型(SIGHASH_ALL)
21? ? //公鑰長度
03? ? //公鑰壓縮格式
be47f412d8e23a3baf591bbe42c5859062b5b0b168567ecd8746ddc1948103fd? ? //公鑰
ffffffff? ? // sequence
//第二組輸入交易,格式同上
0bcdf46d36a33c8d768e25be6b185bc9efad8aca7fad55b5180c9475afe6718f000000006c493046022100ae57aeb9711a6879bc7ddd363feb62aa5aa42b0dca6aa81e1eafc533e4cce0c4022100db46f11ac362e0fe494c65d24fb702c92ebc554690a7447365d38e7aa3613a740121030b7979840ce44d7318f5883aed9d8f5a3c0778326beae0c2117ea8712c7de5aaffffffff
01? ? //輸出地址的個數(shù)
0888020000000000? ? // 輸出的幣值,8個字節(jié)。字節(jié)序需翻轉(zhuǎn),~= 0x0000000000028808 = 165896 satoshi
19? ? // 輸出目的地址字節(jié)數(shù), 0×19 = 25字節(jié),由一些操作碼與數(shù)值構(gòu)成
76? ? //OP_DUP(stack ops)
a9? ? //OP_HASH160(crypto)
14? ? //長度,0×14 = 20字節(jié)
8c2cbf83f9b3034007456580a9072a9304684a49? ? // 地址的HASH160值,20字節(jié)
88? ? //OP_EQUALVERIFY(bit logic)
ac? ? //OP_CHECKSIG(crypto)
00000000? ? // lock_time,固定4字節(jié)
由于一個交易的輸入、輸出都可能具有多個,那么簽名也具有多種類型,目前共三類:SIGHASH_ALL, SIGHASH_NONE, SIGHASH_SINGLE。
SIGHASH_ALL
該簽名類型為默認(rèn)類型,也是目前絕大部分交易采用的,顧名思義即簽名整單交易。首先,組織所有輸出、輸入,就像上文分解Hex過程一樣,每個輸入都對應(yīng)一個簽名,暫時留空,其他包括sequence等字段均須填寫,這樣就形成了一個完整的交易Hex(只缺簽名字段)。然后,每一個輸入均需使用私鑰對該段數(shù)據(jù)進(jìn)行簽名,簽名完成后各自填入相應(yīng)的位置,N個輸入N個簽名。簡單理解就是:對于該筆單子,認(rèn)可且只認(rèn)可的這些輸入、輸出,并同意花費(fèi)我的那筆輸入。
SIGHASH_NONE
該簽名類型是最自由松散的,僅對輸入簽名,不對輸出簽名,輸出可以任意指定。某人對某筆幣簽名后交給你,你可以在任意時刻填入任意接受地址,廣播出去令其生效。簡單理解就是:我同意花費(fèi)我的那筆錢,至于給誰,我不關(guān)心。
SIGHASH_SINGLE
該簽名類型其次自由松散,僅對自己的輸入、輸出簽名,并留空sequence字段。其輸入的次序?qū)?yīng)其輸出的次序,比如輸入是第3個,那么簽名的輸出也是第三個。簡單理解就是:我同意花費(fèi)我的那筆錢,且只能花費(fèi)到我認(rèn)可的輸出,至于單子里的其他輸入、輸出,我不關(guān)心。
交易簽名
對每個輸入交易都需要單獨(dú)計算簽名,以上廣播數(shù)據(jù)有兩個輸入交易,簽名數(shù)據(jù)組織如下:
第一個簽名數(shù)據(jù)是將第一個交易簽名位置替換為上一個交易的鎖定腳本,第二個交易簽名置空,數(shù)據(jù)組織如下:
0100000002
4a2989e933ed9875f83776ddb4ee105a3ee7363e60e0f53db8a682f82aa5230301000000
1976a9143f120b35b8d25b30a4fd405a9d5bada5a959033588ac //第一個交易簽名就處替換為上一個交易(要花出去的)的鎖定腳本
ffffffff 0bcdf46d36a33c8d768e25be6b185bc9efad8aca7fad55b5180c9475afe6718f00000000
00 //第二個交易簽名置為空
ffffffff
0108880200000000001976a9148c2cbf83f9b3034007456580a9072a9304684a4988ac0000000001000000
第二個簽名數(shù)據(jù)將第二個交易簽名替換為上一個交易的鎖定腳本,第一個交易簽名置空,數(shù)據(jù)如下:
01000000024a2989e933ed9875f83776ddb4ee105a3ee7363e60e0f53db8a682f82aa5230301000000
00 //第一個交易簽名處置空
ffffffff
0bcdf46d36a33c8d768e25be6b185bc9efad8aca7fad55b5180c9475afe6718f00000000
1976a91492c2ad259239543f1723982621bdb8625b609b2588ac //第二個交易簽名處替換為上一個交易(要花出去的)的鎖定腳本
ffffffff
0108880200000000001976a9148c2cbf83f9b3034007456580a9072a9304684a4988ac0000000001000000
對交易數(shù)據(jù)進(jìn)行雙哈希運(yùn)算sha256(sha256(空白交易))得出哈希值,以上兩個輸入的哈希結(jié)果如下:
3517704667f173e73c381494b78b67f35d615132ccc4d9273b56261d8f199e6a
5a643c0c7a68960a29d6e08d4b865ddeffba0358013fb7923b6f4257060be2b0
對哈希結(jié)果再進(jìn)行簽名,填入空白交易,得到完整的交易即可發(fā)布。