大部分材料都詳細分析了挖礦過程,介紹了區塊是如何產生的。然而,區塊的產生并不是區塊鏈的最終目的,保存交易信息才是區塊鏈的最終目的。所以,更重要的一點是要理解,交易信息是如何被打包進區塊鏈的。
輸入和輸出
一個交易在系統里被輸入和輸出表示。輸入是指這筆交易所要進行轉移的幣來自之前的哪些輸出。輸出是指這些幣將會被發送給哪些地址。在區塊鏈上記賬,不是告訴你一個賬號現在有多少錢,而是告訴你這個賬號當前得到了哪些輸出。比如一個地址xsw0923sdfew2389dsfw它的相關記錄里面,有A、B、C三個輸出的目標地址是它,那麼它實際上的余額就是這三個輸出的金額的總和。
但是現在這個地址的用戶要轉賬了,轉賬過程不是直接從總和數字中取出一部分進行轉移,而是分別從A、B、C三個輸出中取出部分或全部,加起來為想要轉移的總和的幣,進行轉移。這個“取出”過程中,A、B、C就變成了輸入,轉賬目標記錄才是這次交易的輸出。
這樣的設計,保證了區塊鏈中的錢從哪里來,到哪里去,一清二楚,絕不含糊。跟會計做賬一樣,花一筆錢,不單單要記錄它花到哪里去了,還要記錄這筆錢是從哪里來的,整個資金鏈是可追溯的,這也保證了交易不可偽造,資金既不會憑空消失,也不會無中生有。
hash
將交易加入到區塊里面需要涉及三個hash,一個是交易本身的hash,另一個是當前這個區塊所有交易的merkle hash root,還有一個就是區塊hash。
上面已經說過輸入與輸出了,一個交易可能包含多個輸入輸出,通過將這些輸入輸出信息進行排列并進行hash運算,就得到一個交易的唯一hash值。
一個區塊里面包含了多個交易,包括挖礦獎勵交易,這些交易都被通過一個merkle運算,得到一個hash root所包含,對于merkle可以閱讀《區塊鏈如何運用merkle tree驗證交易真實性》了解。
區塊都hash運算里面,merkle hash root作為一個參數,因此,所有交易的信息都體現在了一個區塊的hash里面。
挖礦
挖礦過程就是計算上述區塊hash的過程,幾乎所有的機器都可以挖礦成功。關鍵在于誰先挖到礦,因為當一臺機器挖礦成功就向網絡廣播,其他挖礦在對這個hash進行校驗之后,就停止自己的挖礦,開始基于這個區塊挖新的礦。而每一個被挖到區塊中記錄的第一筆交易是給挖到這個區塊的礦工自己的獎勵金,所以搶到第一個挖礦成功名額對于礦工來說至關重要。
前面說過,計算區塊hash過程里面,會以區塊包含的交易的merkle hash root作為計算的一個參數,因此,挖礦時,礦工會事先從自己本地的交易信息里面提煉出merkle hash root,也就是說,在挖礦之前,對于當前這個礦工來說,新區塊會包含哪些交易就已經確定好了的。關于這個過程,可以閱讀《Merkle Tree》。
打包交易記錄
挖礦成功之后,礦工需要將完整的區塊向網絡廣播,這個時候,這個區塊里面就打包了所有上述對應的交易。
現在有三個問題:
在打包開始之前,這些交易記錄是以什麼方式存在于網絡?
打包是否會把所有交易記錄打包進區塊?怎麼可能保證所有交易都不被遺漏?
如何防止礦工偽造交易?將偽造的交易打包進區塊?
手續費
這里需要知道另外一個概念,即“手續費”。手續費是發起交易的節點決定給的,和小費性質一樣。比如A打算轉給B0.5個BTC,A手上有一個完整的(來自一個輸入)BTC,這時A將這1BTC作為輸入,輸出包含兩條,一條是給B0.5BTC,另一條是給自己0.49BTC(這個過程叫“找零”)。那麼這個交易中就有0.01BTC是消失了,消失了的BTC將作為小費獎賞給礦工。
現在我們把自己的角色轉換為礦工,當我們從自己的內存中收集所有交易,準備打包區塊時,發現這里有一條交易有0.01BTC的小費,于是我把它作為本次打包優先考慮的交易記錄。由于每個區塊的大小限制在1M左右,所有我只選了那些給小費的交易打包進這次區塊。而那些未給交易費的交易,在優先考慮完這些有交易費的交易之后,我才會考慮把它們加進來。
這也就是為什麼有些交易被確認很快,有些交易被確認很慢。
確認
“確認”這個概念也要解釋一下,一個區塊產生之后,它不是立即可信的,網絡上的節點總是相信最長的區塊鏈,當一條交易記錄被打包進一個區塊之后,就有了一個確認,而這個區塊所在的鏈后面被再加入一個區塊,就是第二個確認,如此下去,一個交易有了6個確認,我們就認為這個交易已經確定了,會被永遠記錄在區塊鏈中。為什麼是6個確認呢?因為每一個確認就是一個挖礦過程,都需要提供非常嚴格的計算,因此,這6個區塊被同一個礦工創建的可能性微乎其微(可以說是不可能),因此礦工偽造交易也基本不可能。
由于比特幣的區塊平均產生時間是10分鐘,所以一個交易要1小時左右才能保證成功(最快),不過也不是所有的系統都這樣認為,有些網站在接受比特幣支付時,認為4個確認就可以給客戶發貨了。如果不幸這個交易在創建的時候,沒有被打包進最近的那個區塊,那就要延遲10分鐘,如此下去,如果后面過了好幾個區塊,交易都沒有被打包進區塊鏈,那就悲劇了。
廣播交易
不過也不用著急,比特幣系統中只留給了這種優先級高的交易50k的存儲空間,即使你沒有給交易費,也可能在24小時內被打包進區塊。不過也不一定,有些交易可能永遠都進不了區塊,因為礦工是從自己都內存中獲取自己暫存的交易信息,一旦這些內存被釋放,那麼這些交易信息就會被清空。為了解決這個問題,比特幣錢包需要不斷對自己發起的交易進行檢查,如果發現沒有被打包進最新的區塊,就要對網絡廣播,這樣,這個交易就會在網絡里不斷被提起,礦工又可以把這筆交易寫進自己的內存里暫時放著,等到下次打包區塊時,選擇是否把它打包進去。
小結
本文講解了對于一個交易而言,“創建(輸入輸出)-廣播-挖礦-打包-確認”的整個過程,讀完你應該可以理解交易是怎麼被打包進區塊的了。
發文者:鏈站長,轉載請註明出處:https://www.jmb-bio.com/4280.html