比特幣交易構成

比特幣交易構成

轉自:http://618.io/html

交易類型

  • 產量交易(Generation) java

    每一個Block都對應一個產量交易(Generation TX),該類交易是沒有輸入交易的,挖出的新幣是全部幣的源頭。數組

  • 合成地址交易(Script Hash)bash

    該類交易的接收地址不是一般意義的地址,而是一個合成地址,以3開頭,須要幾對公私鑰一塊兒生成合成地址,在生成過程當中能夠指定,幾對公私鑰中的幾個簽名之後,就能夠消費該地址的比特幣。markdown

  • 通用地址交易(Pubkey Hash)數據結構

    該類是最多見的交易類型,由N個輸入、M個輸出構成。
    輸入和輸出能夠簡單的理解成,發出幣的地址就是輸入,收到幣的地址就是輸出。app

數據結構

字段 數據類型 字段大小 字段描述
version uint32_t 4 交易數據結構的版本號
tx_in count var_int 1+ 輸入交易的數量
tx_in tx_in[] 41+ 輸入交易的數組,每一個輸入>=41字節
tx_out count var_int 1+ 輸出地址的數量
tx_out tx_out[] 9+ 輸入地址的數組,每一個輸入>=9字節
lock_time uint32_t 4

lock_time是一個多意字段,表示在某個高度的Block以前或某個時間點以前該交易處於鎖定態,沒法收錄進Block。post

含義
0 當即生效
< 500000000 含義爲Block高度,處於該Block以前爲鎖定(不生效)
>= 500000000 含義爲Unix時間戳,處於該時刻以前爲鎖定(不生效)

若該筆交易的全部輸入交易的sequence字段,均爲INT32最大值(0xffffffff),則忽略lock_time字段。不然,該交易在未達到Block高度或達到某個時刻以前,是不會被收錄進Block中的。ui

示例spa

爲了演示方便,咱們讀取稍早期的塊數據,以高度116219 Block爲例。

# ~ bitcoind getblock 0000000000007c639f2cbb23e4606a1d022fa4206353b9d92e99f5144bd74611 
{
    "hash" : "0000000000007c639f2cbb23e4606a1d022fa4206353b9d92e99f5144bd74611",
    "confirmations" : 144667,
    "size" : 1536,
    "height" : 116219,
    "version" : 1,
    "merkleroot" : "587fefd748f899f84d0fa1d8a3876fdb406a4bb8f54a31445cb72564701daea6",
    "tx" : [
        "be8f08d7f519eb863a68cf292ca51dbab7c9b49f50a96d13f2db32e432db363e",
        "a387039eca66297ba51ef2da3dcc8a0fc745bcb511e20ed9505cc6762be037bb",
        "2bd83162e264abf59f9124ca517050065f8c8eed2a21fbf85d454ee4e0e4c267",
        "028cfae228f8a4b0caee9c566bd41aed36bcd237cdc0eb18f0331d1e87111743",
        "3a06b6615756dc3363a8567fbfa8fe978ee0ba06eb33fd844886a0f01149ad62"
    ],
    "time" : 1301705313,
    "nonce" : 1826107553,
    "bits" : "1b00f339",
    "difficulty" : 68977.78463021,
    "previousblockhash" : "00000000000010d549135eb39bd3bbb1047df8e1512357216e8a85c57a1efbfb",
    "nextblockhash" : "000000000000e9fcc59a6850f64a94476a30f5fe35d6d8c4b4ce0b1b04103a77"
}

> 該Block裏面有5筆交易,第一筆爲Generation TX,解析出來看一下具體內容:

# ~ bitcoind getrawtransaction be8f08d7f519eb863a68cf292ca51dbab7c9b49f50a96d13f2db32e432db363e 1
{
    "hex" : "01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff070439f3001b0134ffffffff014034152a010000004341045b3aaa284d169c5ae2d20d0b0673468ed3506aa8fea5976eacaf1ff304456f6522fbce1a646a24005b8b8e771a671f564ca6c03e484a1c394bf96e2a4ad01dceac00000000",
    "txid" : "be8f08d7f519eb863a68cf292ca51dbab7c9b49f50a96d13f2db32e432db363e",
    "version" : 1,
    "locktime" : 0,
    "vin" : [
        {
            "coinbase" : "0439f3001b0134",
            "sequence" : 4294967295
        }
    ],
    "vout" : [
        {
            "value" : 50.01000000,
            "n" : 0,
            "scriptPubKey" : {
                "asm" : "045b3aaa284d169c5ae2d20d0b0673468ed3506aa8fea5976eacaf1ff304456f6522fbce1a646a24005b8b8e771a671f564ca6c03e484a1c394bf96e2a4ad01dce OP_CHECKSIG",
                "hex" : "41045b3aaa284d169c5ae2d20d0b0673468ed3506aa8fea5976eacaf1ff304456f6522fbce1a646a24005b8b8e771a671f564ca6c03e484a1c394bf96e2a4ad01dceac",
                "reqSigs" : 1,
                "type" : "pubkey",
                "addresses" : [
                    "1LgZTvoTJ6quJNCURmBUaJJkWWQZXkQnDn"
                ]
            }
        }
    ],
    "blockhash" : "0000000000007c639f2cbb23e4606a1d022fa4206353b9d92e99f5144bd74611",
    "confirmations" : 145029,
    "time" : 1301705313,
    "blocktime" : 1301705313
}

Generation TX的輸入不是一個交易,而帶有coinbase字段的結構。該字段的值由挖出此Block的人填寫,這是一種「特權」:能夠把信息寫入貨幣系統(你們很喜歡用系統中的數據結構字段名來命名站點,例如blockchain、coinbase等,這些詞的各類後綴域名都被搶注一空)。中本聰在比特幣的第一個交易中的寫入的coinbase值是:

"coinbase":"04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73"

將該段16進制轉換爲ASCII字符,就是那段著名的創世塊留言:

The Times 03/Jan/2009 Chancellor on brink of second bailout for banks

接下來展現的是一個三個輸入、兩個輸出的普通交易:

# ~ bitcoind getrawtransaction 028cfae228f8a4b0caee9c566bd41aed36bcd237cdc0eb18f0331d1e87111743 1
{
    "hex" : "0100000003c9f3b07ebfca68fd1a6339d0808fbb013c90c6095fc93901ea77410103489ab7000000008a473044022055bac1856ecbc377dd5e869b1a84ed1d5228c987b098c095030c12431a4d5249022055523130a9d0af5fc27828aba43b464ecb1991172ba2a509b5fbd6cac97ff3af0141048aefd78bba80e2d1686225b755dacea890c9ca1be10ec98173d7d5f2fefbbf881a6e918f3b051f8aaaa3fcc18bbf65097ce8d30d5a7e5ef8d1005eaafd4b3fbeffffffffc9f3b07ebfca68fd1a6339d0808fbb013c90c6095fc93901ea77410103489ab7010000008a47304402206b993231adec55e6085e75f7dc5ca6c19e42e744cd60abaff957b1c352b3ef9a022022a22fec37dfa2c646c78d9a0753d56cb4393e8d0b22dc580ef1aa6cccef208d0141042ff65bd6b3ef04253225405ccc3ab2dd926ff2ee48aac210819698440f35d785ec3cec92a51330eb0c76cf49e9e474fb9159ab41653a9c1725c031449d31026affffffffc98620a6c40fc7b3a506ad79af339541762facd1dd80ff0881d773fb72b230da010000008b483045022040a5d957e087ed61e80f1110bcaf4901b5317c257711a6cbc54d6b98b6a8563f02210081e3697031fe82774b8f44dd3660901e61ac5a99bff2d0efc83ad261da5b4f1d014104a7d1a57e650613d3414ebd59e3192229dc09d3613e547bdd1f83435cc4ca0a11c679d96456cae75b1f5563728ec7da1c1f42606db15bf554dbe8a829f3a8fe2fffffffff0200bd0105000000001976a914634228c26cf40a02a05db93f2f98b768a8e0e61b88acc096c7a6030000001976a9147514080ab2fcac0764de3a77d10cb790c71c74c288ac00000000",
    "txid" : "028cfae228f8a4b0caee9c566bd41aed36bcd237cdc0eb18f0331d1e87111743",
    "version" : 1,
    "locktime" : 0,
    "vin" : [
        {
            "txid" : "b79a4803014177ea0139c95f09c6903c01bb8f80d039631afd68cabf7eb0f3c9",
            "vout" : 0,
            "scriptSig" : {
                "asm" : "3044022055bac1856ecbc377dd5e869b1a84ed1d5228c987b098c095030c12431a4d5249022055523130a9d0af5fc27828aba43b464ecb1991172ba2a509b5fbd6cac97ff3af01 048aefd78bba80e2d1686225b755dacea890c9ca1be10ec98173d7d5f2fefbbf881a6e918f3b051f8aaaa3fcc18bbf65097ce8d30d5a7e5ef8d1005eaafd4b3fbe",
                "hex" : "473044022055bac1856ecbc377dd5e869b1a84ed1d5228c987b098c095030c12431a4d5249022055523130a9d0af5fc27828aba43b464ecb1991172ba2a509b5fbd6cac97ff3af0141048aefd78bba80e2d1686225b755dacea890c9ca1be10ec98173d7d5f2fefbbf881a6e918f3b051f8aaaa3fcc18bbf65097ce8d30d5a7e5ef8d1005eaafd4b3fbe"
            },
            "sequence" : 4294967295
        },
        {
            "txid" : "b79a4803014177ea0139c95f09c6903c01bb8f80d039631afd68cabf7eb0f3c9",
            "vout" : 1,
            "scriptSig" : {
                "asm" : "304402206b993231adec55e6085e75f7dc5ca6c19e42e744cd60abaff957b1c352b3ef9a022022a22fec37dfa2c646c78d9a0753d56cb4393e8d0b22dc580ef1aa6cccef208d01 042ff65bd6b3ef04253225405ccc3ab2dd926ff2ee48aac210819698440f35d785ec3cec92a51330eb0c76cf49e9e474fb9159ab41653a9c1725c031449d31026a",
                "hex" : "47304402206b993231adec55e6085e75f7dc5ca6c19e42e744cd60abaff957b1c352b3ef9a022022a22fec37dfa2c646c78d9a0753d56cb4393e8d0b22dc580ef1aa6cccef208d0141042ff65bd6b3ef04253225405ccc3ab2dd926ff2ee48aac210819698440f35d785ec3cec92a51330eb0c76cf49e9e474fb9159ab41653a9c1725c031449d31026a"
            },
            "sequence" : 4294967295
        },
        {
            "txid" : "da30b272fb73d78108ff80ddd1ac2f76419533af79ad06a5b3c70fc4a62086c9",
            "vout" : 1,
            "scriptSig" : {
                "asm" : "3045022040a5d957e087ed61e80f1110bcaf4901b5317c257711a6cbc54d6b98b6a8563f02210081e3697031fe82774b8f44dd3660901e61ac5a99bff2d0efc83ad261da5b4f1d01 04a7d1a57e650613d3414ebd59e3192229dc09d3613e547bdd1f83435cc4ca0a11c679d96456cae75b1f5563728ec7da1c1f42606db15bf554dbe8a829f3a8fe2f",
                "hex" : "483045022040a5d957e087ed61e80f1110bcaf4901b5317c257711a6cbc54d6b98b6a8563f02210081e3697031fe82774b8f44dd3660901e61ac5a99bff2d0efc83ad261da5b4f1d014104a7d1a57e650613d3414ebd59e3192229dc09d3613e547bdd1f83435cc4ca0a11c679d96456cae75b1f5563728ec7da1c1f42606db15bf554dbe8a829f3a8fe2f"
            },
            "sequence" : 4294967295
        }
    ],
    "vout" : [
        {
            "value" : 0.84000000,
            "n" : 0,
            "scriptPubKey" : {
                "asm" : "OP_DUP OP_HASH160 634228c26cf40a02a05db93f2f98b768a8e0e61b OP_EQUALVERIFY OP_CHECKSIG",
                "hex" : "76a914634228c26cf40a02a05db93f2f98b768a8e0e61b88ac",
                "reqSigs" : 1,
                "type" : "pubkeyhash",
                "addresses" : [
                    "1A3q9pDtR4h8wpvyb8SVpiNPpT8ZNbHY8h"
                ]
            }
        },
        {
            "value" : 156.83000000,
            "n" : 1,
            "scriptPubKey" : {
                "asm" : "OP_DUP OP_HASH160 7514080ab2fcac0764de3a77d10cb790c71c74c2 OP_EQUALVERIFY OP_CHECKSIG",
                "hex" : "76a9147514080ab2fcac0764de3a77d10cb790c71c74c288ac",
                "reqSigs" : 1,
                "type" : "pubkeyhash",
                "addresses" : [
                    "1Bg44FZsoTeYteRykC1XHz8facWYKhGvQ8"
                ]
            }
        }
    ],
    "blockhash" : "0000000000007c639f2cbb23e4606a1d022fa4206353b9d92e99f5144bd74611",
    "confirmations" : 147751,
    "time" : 1301705313,
    "blocktime" : 1301705313
}

字段hex記錄了全部相關信息,後面顯示的是hex解析出來的各種字段信息。下面把逐個分解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字節

Tx Hash,俗稱交易ID,由hex得出:Tx Hash = SHA256(SHA256(hex))。因爲每一個交易只能成爲下一個的輸入,有且僅有一次,那麼不存在輸入徹底相同的交易,那麼就不存在相同的Tx Hash(SHA256碰撞機率極小,因此無需考慮Hash碰撞的問題,就像無需考慮地址私鑰被別人撞到同樣)。

即使如此,在系統裏依然產生了相同的Tx Hash,是某位礦工兄弟挖出Block後,打包Block時忘記修改Generation Tx coinbase字段的值,幣量相同且輸出至相同的地址,那麼就構造了兩個徹底如出一轍的交易,分別位於兩個Block的第一個位置。這個對系統不會產生什麼問題,但只要花費其中一筆,另外一個也被花費了。相同的Generation Tx至關於覆蓋了另外一個,白白損失了挖出的幣。該交易ID爲e3bf3d07d4b0375638d5f1db5255fe07ba2c4cb067cd81b84ee974b6585fb468,第一次出如今#91722,第二次出如今#91880。

交易簽名

簽名是對全部權的驗證,節點收到交易廣播後,會對交易進行驗證,經過後則收錄進內存、打包進Block,不然,丟棄之。簽名就相似傳統紙質合同蓋章、簽字過程,合法轉移全部權的保證手段。

簽名類型

因爲一個交易的輸入、輸出均可能具備多個,那麼簽名也具備多種類型,目前共三類:SIGHASH_ALL, SIGHASH_NONE, SIGHASH_SINGLE。

SIGHASH_ALL

該簽名類型爲默認類型,也是目前絕大部分交易採用的,顧名思義即簽名整單交易。首先,組織全部輸出、輸入,就像上文分解Hex過程同樣,每一個輸入都對應一個簽名,暫時留空,其餘包括sequence等字段均須填寫,這樣就造成了一個完整的交易Hex(只缺簽名字段)。而後,每個輸入均需使用私鑰對該段數據進行簽名,簽名完成後各自填入相應的位置,N個輸入N個簽名。簡單理解就是:對於該筆單子,承認且只承認的這些輸入、輸出,並贊成花費個人那筆輸入。

SIGHASH_NONE

該簽名類型是最自由鬆散的,僅對輸入簽名,不對輸出簽名,輸出能夠任意指定。某人對某筆幣簽名後交給你,你能夠在任意時刻填入任意接受地址,廣播出去令其生效。簡單理解就是:我贊成花費個人那筆錢,至於給誰,我不關心。

SIGHASH_SINGLE

該簽名類型其次自由鬆散,僅對本身的輸入、輸出簽名,並留空sequence字段。其輸入的次序對應其輸出的次序,好比輸入是第3個,那麼簽名的輸出也是第三個。簡單理解就是:我贊成花費個人那筆錢,且只能花費到我承認的輸出,至於單子裏的其餘輸入、輸出,我不關心。

轉載於:https://www.cnblogs.com/sesexxoo/p/6190506.html