Bitcoin-Core

交易究竟什麼時候得到驗證?

  • November 27, 2019

我對交易生命週期的理解存在一些空白,我希望有人幫助我專門通過驗證填充它們。

我對生命週期的理解與我的問題:

1) 使用者通過錢包應用程序簽署交易並廣播到區塊鍊網路。

這一步的問題是:錢包應用程序是否執行任何類型的交易驗證,需要在這個級別檢查區塊鏈的整個歷史?


2)廣播的交易現在被發送到網路上的許多節點,這些節點將交易轉發/“傳播”到其他節點,直到所有節點在他們的“未確認交易池”中都有這個交易?

告訴我是否有任何部分錯誤或順序不正確


3)每個礦工都會選擇一些交易並開始挖礦(做工作證明直到找到正確的雜湊)

在這個級別,當礦工選擇交易時,他是否對需要全面掃描區塊鏈歷史的每筆交易進行驗證?


4)當礦工解決區塊時,他會將該區塊連同他產生的雜湊值一起廣播到區塊鍊網路,就像交易被廣播到一些節點並傳播到其他節點一樣。然後節點將散列塊頭以驗證它是否產生相同的散列,以便它們可以接受該塊。

這裡的問題是:節點是否對使用塊頭髮送的所有交易執行另一次驗證,以驗證它們是真實交易,而不是由解決區塊的礦工創建的假交易?

這些交易的驗證是否需要檢查區塊鏈的所有歷史?

我知道 merkle 樹如何散列多個交易,並且對交易散列的任何修改都會改變 merkle 根的值,但我的問題是這有什麼幫助?已經偽造任何交易的礦工難道不擁有區塊中所有交易的正確默克爾根,因為他是首先添加它們的人嗎?我的觀點是 merkle root 有什麼幫助?它增加了什麼價值?它可以防止什麼樣的攻擊?


最後一個問題是共識,從其定義來看,所有節點都同意它們與新區塊處於同一級別。我知道 PoW,但是所有節點如何檢查和通信以確認所有節點都獲得了相同的塊?

這一步的問題是:錢包應用程序是否執行任何類型的交易驗證,需要在這個級別檢查區塊鏈的整個歷史?

這取決於錢包。

一般來說,錢包可能會做一些驗證作為健全性檢查,以確保他們創建的交易是有效的,並且會被網路上的節點接受。他們通常會檢查簽名是否有效,以及交易是否有效,前提是它之前花費的交易也是有效的。

這些先前的交易是否有效是另一回事。使用了不同的驗證和安全模型。但一般來說,錢包只會在認為交易有效時才會儲存和辨識交易。然後它將依賴於它是有效的假設(無論它是驗證它還是有其他方式相信它是有效的),因此它以後不需要重新驗證交易。

2)廣播的交易現在被發送到網路上的許多節點,這些節點將交易轉發/“傳播”到其他節點,直到所有節點在他們的“未確認交易池”中都有這個交易?

那是正確的。但是在這個階段,節點在將交易進一步轉發給其他對等方之前,會使用完整的交易歷史來驗證交易。請注意,它們不會重新驗證以前的交易,也不會線性搜尋區塊鏈。相反,他們擁有數據庫和索引,可以非常快速地進行事務驗證。

此外,並非所有節點都需要擁有交易或看到交易。也無法知道是否所有節點都已經看到並驗證了特定交易。

這裡的問題是:節點是否對使用塊頭髮送的所有交易執行另一次驗證,以驗證它們是真實交易,而不是由解決區塊的礦工創建的假交易?

天真地(和以前),是的。一個簡單的實現將簡單地重新驗證在一個塊中收到的每一個交易。

更快的實現(以及現在比特幣核心所做的)是記憶體特定交易之前是否已經過驗證以及它是否有效。因此,當它通過一個區塊時,它不會重新驗證節點之前看到的所有交易,它只是呼叫之前的驗證結果。這可以通過將記憶體池(未確認的交易池)限制為如果它們包含在下一個塊中將是有效的交易來輕鬆完成。因此,如果在記憶體池中找到一個塊中接收到的交易,那麼它就被認為是有效的,不需要重新驗證。

我知道 merkle 樹如何散列多個交易,並且對交易散列的任何修改都會改變 merkle 根的值,但我的問題是這有什麼幫助?已經偽造任何交易的礦工難道不擁有區塊中所有交易的正確默克爾根,因為他是首先添加它們的人嗎?我的觀點是 merkle root 有什麼幫助?它增加了什麼價值?它可以防止什麼樣的攻擊?

merkle 根與交易有效性無關。

merkle 有兩個目的:確保所有交易都包含在塊雜湊中,並證明特定交易在塊中而不需要塊本身。

由於 merkle 根是塊頭的一部分,並且由於它是塊中所有交易的雜湊,它用於將所有這些交易送出到塊頭和工作證明。它只是確保塊雜湊也涵蓋交易。

用於生成 merkle 根的 merkle 樹也意味著任何擁有完整塊的人都可以生成一個簡單的證明,證明交易包含在特定的塊中。這對 SPV 錢包很有用。它不能證明交易是有效的,對交易是否有效也沒有影響。礦工可能包含無效交易,它會成為默克爾樹的一部分。這不會使該交易有效,也不會使區塊有效。

最後一個問題是共識,從其定義來看,所有節點都同意它們與新區塊處於同一級別。我知道 PoW,但是所有節點如何檢查和通信以確認所有節點都獲得了相同的塊?

他們沒有;沒有必要。達成共識是因為節點相互連接並相互廣播塊。因為每個節點都被程式為以最多的工作跟隨區塊鏈,並儘最大努力確保其對等節點了解它認為最好的區塊鏈,所以網路自然會在沒有任何形式的協議和確認的情況下達成共識。通過依靠節點切換使用工作量最大的有效區塊鏈,節點將匯聚到同一個區塊鏈上,最終一個區塊鏈將擁有最多的工作量。

引用自:https://bitcoin.stackexchange.com/questions/91979