《精通比特幣》學習:深度剖析比特幣的交易過程

1、比特幣交易是比特幣系統中最重要的部分。根據比特幣系統的設計原理,系統中任何其他的部分都是為了確保比特幣交易可以被生成、能在比特幣網絡中得以傳播和通過驗證,並最終添加入全球比特幣交易總賬簿(比特幣區塊鏈)。

2、比特幣交易的生命週期:起始於比特幣交易被創建,隨後交易被一個或多個簽名加密,接下來交易被廣播到比特幣網絡,網絡中每一個節點驗證再廣播,直到被大多數節點接受,最後比特幣交易被一個挖礦節點驗證,並被添加到區塊鏈上一個記錄著許多交易的區塊中。一筆比特幣交易被記錄到區塊鏈上以後,被超過6次後續區塊的確認證明,就成為區塊鏈總賬簿的一部分。這筆交易分配的比特幣資金到了新的所有者名下(交易的輸出),可以在新的交易中被使用(作為新交易的輸入),進入下一個週期。

所以比特幣交易的生命週期包含以下環節:創建交易----》廣播交易至網絡----》交易在網絡中傳播----》交易被打包進區塊,挖礦驗證----》交易所屬區塊被加入區塊鏈----》被後續區塊證明達到6次----》成為總賬簿的一部分,確認為有效交易----》交易完成,比特幣到了新的所有者名下----》開始新的交易,進入新的週期。

3、創建比特幣交易:任何人都可以創意比特幣交易,創建交易的人不一定是簽署這筆交易的人,比如公司的業務員可以發起一筆交易,然後讓CEO來簽字。一旦一筆比特幣交易被創建,它會被資金所有者(們)簽名。

4、一筆比特幣交易只是300-400個字節的數據,這個數據主要是根據典型的交易場景得來的,根據交易輸入和輸出的數量不同,交易數據量大小都會不同,比如你發表一篇文章在網上讓讀者打賞,那麼你的得到交易輸出就全部是小額的,用這些輸出作為下一筆交易的輸入時,可能需要很多的交易輸入才足夠支付一筆交易。

延伸資料:比特幣交易的交易費用不是根據金額決定的,而是根據交易的數據大小,1000個字節的交易費用0.0001BTC,不夠1000字節按1000字節收取,比如1200字節的交易費就是0.0002BTC,交易大小的關鍵因素是輸入的數量,輸入數量越大交易大小越大,交易費越高。但是符合一些條件的話,可以免收交易費,大概要求是“小於1000字節; 所有輸出大於10 mBTC; 輸入值大且時間久”。這樣使得交易額度大價值高的交易有機會免交易費,只要交易間隔時間足夠長,交易輸入越大等待時間越短。大概是接收到一筆1比特幣的交易,等一天再支付出去可以免手續費。後續我想專門用一篇文章來學習瞭解這個問題,今天先不展開了。

5、廣播交易至網絡:比特幣交易能在任意網絡環境被髮送,只要這筆交易能到達能將它傳播到比特幣網絡的那一個比特幣節點就行,如何到達的並不重要,所以比特幣交易可以通過未加密網絡發送,比如wifi、藍牙、二維碼,甚至發佈到論壇。

6、一旦一筆比特幣交易被髮送到任意一個連接至比特幣網絡的節點,這筆交易將會被該節點驗證,驗證有效後,該節點會繼續傳播到所連接的其他節點,以此類推。同時交易發起者會收到一條表示交易有效並被接受的返回信息,如果交易無效,就會被拒絕並返回信息給交易發起者。一筆剛通過驗證並被傳遞到比特幣網絡中任意節點的交易會被髮送到三到四個相鄰節點,而每一個相鄰節點又會將交易發送到三至四個與它們相鄰的節點。以此類推,在幾秒鐘之內,一筆有效的交易就會像指數級擴散的波一樣在網絡中傳播,直到所有連接到網絡的節點都接收到它。

《精通比特幣》學習:深度剖析比特幣的交易過程

7、一個交易的數據結構包含信息有:版本、輸入總數、輸入數據(1或N個)、輸出總數、輸出數據(1或N個)、時鐘時間(一個UNIX時間戳或區塊號)。從這個數據結構可以看出,一個交易主要包含輸入和輸出的數據,與賬號身份無關

8、交易鎖定時間:交易鎖定時間是指交易能加到區塊鏈裡的最早交易時間,相當於定時生效的意思,如果鎖定時間是0代表立即執行,如果不是0且小余5億,就被視為區塊高度(最長鏈條的長度),意思是說沒達到這個區塊高度之前就不包含在區塊鏈裡。如果鎖定時間大於5億,就被視為是一個UNIX紀元時間戳(從1970年1月1日開始到5億秒的時間),沒達到這個時間點之前交易不包含在區塊鏈裡面。

9、比特幣交易的最小單位是未消費的交易輸出,即UTXO。重點:一筆比特幣交易可以有任意數值,但必須從用戶可用的UTXO中創建出來,這樣就真正把交易有效的鏈接起來,每一個交易每一個幣都可追溯都有源頭。這裡要搞清楚比特幣的一個概念,比特幣網絡是不存在比特幣餘額這個說法的,就是說沒有地方存儲比特幣餘額的數據,比特幣餘額是比特幣錢包應用軟件創建的派生之物。那賬戶擁有多少比特幣是怎麼體現的呢,就是通過UTXO,舉個例子,A用戶接收了一筆1BTC的比特幣,那麼這個1BTC就被當做未消費的交易輸出記錄在區塊鏈裡面,用戶每接收一筆都會被記錄。注意A用戶如果用這筆錢再支付給B一部分,剩餘的幣會當做零錢返回給A,這筆零錢也是未消費的輸出,舉例:A有一個1BTC的未消費交易輸出,然後他把此交易輸出當做輸入,支付給B用戶0.5BTC,假設沒有交易費,那麼這個交易就會產生兩個交易輸出,一個是支付給B用戶0.5BTC(對於A用戶來講,這0.5BTC是已消費的),一個是找零0.5BTC給A用戶(對於A用戶這一筆是未消費的),那麼這時A用戶的UTXO還有0.5BTC,把A用戶的所有UTXO累加起來就是比特幣的餘額。

10、對於輸出和輸入鏈來說,有一個例外,它是一種特殊的交易類型,稱為Coinbase交易。這是每個區塊中的首個交易。這種交易存在的原因是作為對挖礦的獎勵而產生全新的可用於支付的比特幣給“贏家”礦工,現在簡單理解是:區塊的首個交易是礦工添加的比特幣獎勵,如果挖礦成功則通過此交易將比特幣獎勵支付給自己,這個過程就是比特幣發行的過程,無中生有的創造輸出。

11、既然比特幣交易中沒有賬戶的概念,就是說沒有轉賬到賬一說,那麼怎麼來用戶怎麼來控制和使用比特幣呢?一筆比特幣交易通過使用所有者的簽名來解鎖UTXO,並通過使用新的所有者的比特幣地址來鎖定並創建UTXO。怎麼理解,先看一下交易輸出的數據結構如下:

《精通比特幣》學習:深度剖析比特幣的交易過程

這裡關鍵問題是什麼是鎖定腳本?鎖定腳本,也被當作是“障礙”,提出支付輸出所必須被滿足的條件以“鎖住”這筆總額。舉例:A創建了一筆交易,支付B用戶0.1BTC,從而創造了一個0.1BTC的輸出,B作為新的擁有者,此輸出就被鎖定在B的比特幣地址上。B在選用此輸出來支付時,通過一個包含B的私鑰的解鎖腳本來解鎖輸出,障礙被釋放。個人理解:比特幣沒有賬戶一說,只有交易和流通,交易輸出代表的就是這一次有多少錢流轉到你這裡了,暫時這筆錢被鎖定在這裡,有一些障礙,如果你要用就用密鑰簽名來解鎖釋放障礙。

12、關於交易輸入,首先要明白交易輸入都是對應之前一筆未消費的交易輸出(UTXO),而且UTXO有鎖定腳本,那麼一個交易輸入也要有解鎖腳本,用來滿足支付條件,解鎖腳本通常是一個簽名,用來證明鎖定腳本中的比特幣地址是屬於你的;然後要清楚UTXO的選擇一般是錢包軟件來自動選擇,比如要支付0.15比特幣,錢包軟件會選擇一個0.1和0.05的UTXO來滿足付款額。交易輸入的數據結構如下:

《精通比特幣》學習:深度剖析比特幣的交易過程

解讀這個數據結構就是:本輸入對應哪一個交易的第幾個輸出,還有本輸入的解鎖腳本是什麼,以及解鎖腳本有多長。

13、提醒特別注意交易費,交易費是“交易輸入總和-交易輸出總和”,在支付構建的時候,多餘的幣一定要找零回來,否則就會被礦工當獎勵拿走了。比如:A消耗一個20比特幣的UTXO來支付1比特幣給B,如果A不小心沒有把19個比特幣找零回來,那麼這19個比特幣就給了礦工當小費了。另外注意交易費越高就會被礦工優先處理,當然符合條件的交易可以免交易費,具體後續再詳細瞭解。

14、比特幣交易不只是“A轉給B”這麼簡單的形式,由腳本的存在,讓比特幣交易成為可編程的貨幣,可以支持多到數不清的條件變種。個人理解:鎖定輸出和解鎖輸入是強關聯的,鎖定設定條件,符合條件就讓你解開,那麼這個條件誰說一定只是簡單的簽名驗證呢,是不是可以更加複雜?

15、比特幣腳本語言包含許多操作,但是故意限定沒有循環或者複雜流控制功能以外的其他條件的流控制(後面這段我還沒完全理解,55555)。總的來說,我理解就是腳本語言的複雜性和能力受到限制,不能幹很複雜的事,這樣就降低被黑客利用攻擊的風險。


分享到:


相關文章: