5.交易 - 精通比特幣筆記

簡介

比特幣交易被創(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)如下圖所示


image.png

交易的輸入輸出

比特幣交易的基本單位是未經(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能被目的地址賬戶的所有者使用庵寞。

一個交易輸出包含兩個部分:

  1. 一定量的比特幣狸相,以最小單位“聰”表示
  2. 一個鎖定腳本,用于鎖住這筆比特幣捐川,只有滿足解鎖條件的賬戶才有資格使用這筆比特幣

交易的輸入

交易的輸入實際上是多個指向不同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í)行過程如下:

image.png

如果我花費一個指向我的比特幣地址的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。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末倔韭,一起剝皮案震驚了整個濱河市术浪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寿酌,老刑警劉巖胰苏,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異醇疼,居然都是意外死亡硕并,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門秧荆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倔毙,“玉大人,你說我怎么就攤上這事乙濒∩略撸” “怎么了卵蛉?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長么库。 經(jīng)常有香客問我傻丝,道長,這世上最難降的妖魔是什么诉儒? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任葡缰,我火速辦了婚禮,結(jié)果婚禮上忱反,老公的妹妹穿的比我還像新娘泛释。我一直安慰自己,他們只是感情好缭受,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布胁澳。 她就那樣靜靜地躺著,像睡著了一般米者。 火紅的嫁衣襯著肌膚如雪韭畸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天蔓搞,我揣著相機與錄音胰丁,去河邊找鬼。 笑死喂分,一個胖子當(dāng)著我的面吹牛锦庸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蒲祈,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼甘萧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了梆掸?” 一聲冷哼從身側(cè)響起扬卷,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎酸钦,沒想到半個月后怪得,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡卑硫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年徒恋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欢伏。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡入挣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出硝拧,到底是詐尸還是另有隱情径筏,我是刑警寧澤风皿,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站匠璧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏咸这。R本人自食惡果不足惜夷恍,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望媳维。 院中可真熱鬧酿雪,春花似錦、人聲如沸侄刽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽州丹。三九已至醋安,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間墓毒,已是汗流浹背吓揪。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留所计,地道東北人柠辞。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像主胧,于是被迫代替她去往敵國和親叭首。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容