簡介
比特幣交易被創(chuàng)建后,會被一個或多個簽名加密鹃锈,這些簽名標志著交易指向的比特幣的使用許可荤胁。隨后,這筆交易會被廣播到比特幣網(wǎng)絡(luò)中屎债,節(jié)點在收到這筆交易仅政,并記錄、驗證這筆交易盆驹,然后再把交易廣播出去已旧,直到比特幣網(wǎng)絡(luò)中大部分節(jié)點接收。最后會有一個挖礦節(jié)點驗證交易召娜,并把交易寫入比特幣區(qū)塊鏈中的一個記錄著許多交易的區(qū)塊中。
一筆比特幣交易創(chuàng)建后惊楼,需要有效的簽名來授權(quán)這些比特幣的使用權(quán)玖瘸。由于交易信息有簽名保證使用權(quán),所以交易可以在任何網(wǎng)絡(luò)上傳播檀咙,甚至非安全的網(wǎng)絡(luò)雅倒。交易一旦被節(jié)點接收,節(jié)點會驗證交易的正確性弧可,如果正確蔑匣,節(jié)點會返回一條交易有效并被接收的返回消息給交易發(fā)起者。如果交易不正確棕诵,節(jié)點會返回交易被拒絕的信息給交易發(fā)起者裁良。
比特幣網(wǎng)絡(luò)是一個點對點網(wǎng)絡(luò),任何節(jié)點都會連接到其它一些節(jié)點校套,節(jié)點會將驗證通過的交易發(fā)給自己連接到的其它節(jié)點价脾,其它節(jié)點也會進行同樣的操作,以此類推笛匙,幾秒鐘便會以指數(shù)級的擴散速度傳播至全網(wǎng)侨把。但為了避免垃圾消息泛濫犀变,每個節(jié)點在傳播交易前都會驗證交易,異常交易所能到達的節(jié)點不會超過一個秋柄。
交易結(jié)構(gòu)
一筆比特幣交易的結(jié)構(gòu)如下圖所示
交易的輸入輸出
比特幣交易的基本單位是未經(jīng)使用的一個交易輸出获枝,叫做UTXO,UTXO是記錄比特幣交易信息的最基本方式骇笔,沒有比它還基礎(chǔ)的了省店,所以它是不可再分割的了。比特幣系統(tǒng)里并沒有專門存儲某個用戶余額的地方蜘拉,也沒有存儲比特幣地址萨西,而是通過掃描一個個UTXO后,得到的最終結(jié)果旭旭。比特幣錢包通過掃描所有與你相關(guān)的UTXO后谎脯,便可知道你有多少比特幣可用。之前說過持寄,比特幣就是個復(fù)式記賬系統(tǒng)源梭,掃描區(qū)塊里的UTXO就相當(dāng)于翻遍整個賬本,找到你的交易記錄稍味,自然就知道你到底有多少錢废麻。
當(dāng)一個用戶接收比特幣時,實際上是比特幣系統(tǒng)添加了一條這個用戶的未經(jīng)使用的交易輸出模庐,這個交易輸出中包含了比特幣金額烛愧。當(dāng)這個用戶需要使用這些比特幣時,實際上是把這條未經(jīng)使用的交易輸出拿來使用了掂碱。
舉個不太恰當(dāng)?shù)睦踝恿耍粋€UTXO就相當(dāng)于一張鈔票,這張鈔票的面額就是UTXO里記錄的金額疼燥,比如我的某個UTXO里記錄了10個btc沧卢,我現(xiàn)在需要花1個btc買個披薩,我用我的這個UTXO(面值10)來支付這筆金額醉者。剛才說過但狭,UTXO不能再分割了,相當(dāng)于用10元錢買個一元錢的商品撬即,你不可能把錢撕成10份立磁,給老板一份,剩下9份我揣著搞莺,而是把10元錢變成一張5元和5張1元息罗,拿一元給老板,剩下的一張5元和四張1元我揣著才沧。
比特幣系統(tǒng)中對UTXO的使用方式與剛才的例子差不多迈喉,將一個UTXO作為交易的輸入绍刮,輸出兩個UTXO即可完成交易,輸出的一個UTXO包含1btc挨摸,是給老板的孩革,另一個UTXO包含9btc,是我自己揣著的得运,也就是找零錢的過程膝蜈。
相反的,如果我有N多個小額的UTXO熔掺,可以將多個小額的UTXO一起作為交易的輸入饱搏,完成一筆金額較大的交易。比如我有五張1元置逻,要買一輛價值5元的蘭博基尼推沸,每張1元都不足以支付價值5元的蘭博基尼,但我可以把五張1元一起給老板券坞,我就可以高高興興開著蘭博基尼回家了鬓催。這就是比特幣的交易方式。
另外有一種特殊的交易方式恨锚,叫coinbase交易宇驾,是每個區(qū)塊的首個交易,這個交易是給挖出區(qū)塊的礦工獎勵的交易猴伶,后面再詳述课舍。
交易的輸出
每一筆比特幣交易都會創(chuàng)造一個或多個輸出,這些輸出被比特幣賬簿記錄下來(除了后面會介紹的OP_RETURN操作外)他挎,幾乎所有的交易輸出都會創(chuàng)造一定數(shù)量的可用于支付的比特幣布卡,也就是我們之前提到的UTXO,這些UTXO被整個網(wǎng)絡(luò)識別雇盖,所有者可在未來的交易中使用它們,給某個地址發(fā)送比特幣實際上是創(chuàng)造新的UTXO栖忠,并關(guān)聯(lián)到目的地址(目測應(yīng)該是公鑰加密崔挖,私鑰解密類似的原理吧),從而新的與之相關(guān)的UTXO能被目的地址賬戶的所有者使用庵寞。
一個交易輸出包含兩個部分:
- 一定量的比特幣狸相,以最小單位“聰”表示
- 一個鎖定腳本,用于鎖住這筆比特幣捐川,只有滿足解鎖條件的賬戶才有資格使用這筆比特幣
交易的輸入
交易的輸入實際上是多個指向不同UTXO(達到或大于支付金額)的指針的集合脓鹃,同時,交易的輸入也包含解鎖腳本古沥,以使用被鎖住的UTXO瘸右。解鎖腳本通常是一個簽名娇跟,用來證明對于在鎖定腳本中的比特幣地址的所有權(quán)。
選擇哪些UTXO通常由錢包程序調(diào)用比特幣核心來完成太颤,或者通過第三方的程序接口檢索來完成苞俘。
交易費
交易費是大多數(shù)交易都包含的,主要是給礦工的獎勵龄章。交易費是基于當(dāng)前交易的數(shù)據(jù)大小來決定的吃谣,數(shù)據(jù)越多,交易費當(dāng)然越高做裙。對于礦工來說岗憋,高的交易費意味著優(yōu)先處理,低的交易費可能延遲處理或者根本不處理锚贱。
交易的數(shù)據(jù)結(jié)構(gòu)中并沒有交易費這個字段仔戈,交易費的計算方式是所有的輸入-所有的輸出,這就意味著如果你的交易不包含找零的話惋鸥,所有交易輸入 - 所有交易輸出的差值就全是礦工的交易費了杂穷。
比特幣的交易腳本
比特幣交易驗證引擎依賴兩類交易腳本來驗證比特幣交易,一個鎖定腳本(包含公鑰)卦绣,一個解鎖腳本(包含通過私鑰生成的數(shù)字簽名)耐量,執(zhí)行過程如下:
如果我花費一個指向我的比特幣地址的UTXO,那么生成這個UTXO的人會在這個UTXO中加入一個只有我能解開的“障礙”(可以理解為用我的公鑰簽名的數(shù)據(jù)滤港,只有我的私鑰可以解開)廊蜒,如果我要使用這筆UTXO,我要使用解鎖腳本(包含我的私鑰)來解鎖這個“障礙”溅漾,然后將解鎖后的數(shù)據(jù)作為鎖定腳本的輸入執(zhí)行一遍山叮,結(jié)果為真,說明我有權(quán)力使用這筆UTXO添履,否則我就沒有權(quán)利使用這筆UTXO屁倔。我覺得比特幣消費的認證,粗略地說暮胧,就是公鑰加密數(shù)據(jù)锐借,私鑰解密數(shù)據(jù);私鑰加密數(shù)據(jù)往衷,生成數(shù)字簽名钞翔,公鑰驗簽的過程。
比特幣腳本語言
比特幣腳本語言是采用逆波蘭表示法席舍,基于堆棧執(zhí)行的腳本語言布轿。
比特幣腳本語言是基于棧的,棧的操作只有兩個,入棧和出棧汰扭。參數(shù)被推到棧內(nèi)稠肘,碰到操作符,則取出棧內(nèi)的操作數(shù)东且,執(zhí)行操作后將結(jié)果入棧启具。
比特幣腳本是非圖靈完備的,不能執(zhí)行無限循環(huán)或其它的邏輯炸彈珊泳,從而保證比特幣的安全鲁冯。
標準交易
標準交易一,P2PKH(Pay-to-Publiic-Key-Hash)
比特幣網(wǎng)絡(luò)上的大多數(shù)交易都是P2PKH交易色查,此類交易都含有一個鎖定腳本薯演,該腳本由公鑰的哈希(即比特幣地址)實現(xiàn)前面提到的"障礙",鎖定腳本的輸出可由公鑰和對應(yīng)私鑰生成的數(shù)字簽名來解除“障礙”秧了。
標準交易二跨扮,P2PK(Pay-to-Public-Key)
在P2PK交易中,公鑰直接存儲在鎖定腳本中验毡,代碼長度更短衡创。目前,P2PK在Coinbase交易中最常見晶通。
多重簽名
多重簽名腳本設(shè)置了這樣的條件璃氢,腳本中記錄了N個公鑰,必須提供M個公鑰(N > M)才能生成激活交易的簽名狮辽,通過驗證后才可以使用這筆資金一也。
數(shù)據(jù)輸出(OP_RETURN操作符)
OP_RETURN操作允許開發(fā)者在交易輸出上增加40字節(jié)的非交易信息,這些信息存儲在區(qū)塊鏈上喉脖,而不是UTXO中椰苟,從而防止UTXO容量增大,同時允許開發(fā)者在區(qū)塊鏈上記錄非交易信息树叽。例如我存一個文本的Hash舆蝴,將來驗證這個文本是否被修改過,算一下這個Hash题诵,再在區(qū)塊鏈上找到存儲的文本Hash须误,對比下就能知道文本是否被修改,從而擴大比特幣系統(tǒng)的功能仇轻。因為OP_RETURN不將數(shù)據(jù)存在UTXO中,實際上沒有真正的交易發(fā)生奶甘,也就沒有成本篷店。OP_RETURN通常是一個金額為0的比特幣輸出,如果你將一個OP_RETURN的輸出作為另一筆交易的輸入,則該交易是無效的疲陕,所以任何與該類輸出對應(yīng)的比特幣都會永久丟失方淤。
P2SH(Pay-to-Script-Hash)
如果我希望我的比特幣接收地址支持多重簽名,那么蹄殃,支付者的錢包也必須支持多重支付簽名携茂,擁有對應(yīng)的驗證腳本,這就提高了使用難度诅岩。為了解決這個問題,P2SH應(yīng)運而生。
P2SH顧名思義滨彻,就是將支付與腳本代碼本身作為輸入生成的Hash相關(guān)聯(lián)前塔。在使用P2SH交易方式生成的UTXO中,需要使用原始腳本和必要的解鎖簽名來使用UTXO式廷。一個P2SH的地址以“3”開頭咐扭,比如0x39RF6JqABiHdYHkfChV6USGMe6Nsr66Gzw。P2SH地址隱藏了所有的復(fù)雜性滑废,使得對P2SH地址轉(zhuǎn)賬和普通轉(zhuǎn)賬沒有任何區(qū)別蝗肪,所有使用成本都轉(zhuǎn)嫁到了使用方,誰使用這筆資金蠕趁,就需要提供所有的驗證資料薛闪。注意,P2SH不能自循環(huán)妻导,所以不能嵌套使用P2SH逛绵,也不要使用OP_RETURN。