為什麼在檢查雙花之前選擇最長的鏈?
我們是否可以對目前的 POW 協議進行以下更改,以更好地避免雙花:
a) 對於接收兩條鏈的完整/挖礦節點,檢查執行雙花的兩條鏈上是否出現相同的地址。如果有的話,忽略會導致節點進行重組(reorg)的鏈,選擇另一個鏈;
b) 如果沒有,選擇較長的鏈條;
c) 對於只接收一條鏈的節點,如果不需要重組,則接受它。
這不是比目前協議更好地避免雙花,即盲目地接受最長的鏈嗎?在決定接受哪一個之前,我們不應該檢查兩條鏈的塊內容嗎?
如果有雙花嘗試,節點就無法知道*“哪個鏈(交易)實際上先出現並且是合法的”*。一些節點可能首先聽到“合法”鏈,一些節點可能首先聽到雙花鏈。
因此,如果規則規定節點在雙花的情況下避免重組,那麼我們預計網路會在發生雙花時分裂。考慮一下:如果有雙花嘗試,並且您的節點聽到的第一個鍊是即將成為較短鏈的鏈,會發生什麼?你會被困在孤兒鏈上,而網路的其餘部分繼續前進。這顯然不好,因為網路共識和可靠性很重要。
c) 對於只接收一條鏈的節點,如果不需要重組,則接受它。
如果節點只收到一條鏈,那麼它永遠不需要重組。只有接收到替代的更長鏈的節點才會重組。
..盲目接受最長的鏈條?在決定接受哪一個之前,我們不應該檢查兩條鏈的塊內容嗎?
我不會說盲目地接受鏈,接受要求鏈根據所有網路規則是有效的。你的節點會檢查新區塊的內容,但正如我上面提到的,沒有辦法在網路共識層面可靠地區分“合法”交易和“雙重支付”交易。
這不是比目前協議更好地避免雙花,即盲目地接受最長的鏈嗎?在決定接受哪一個之前,我們不應該檢查兩條鏈的塊內容嗎?
你在哪裡讀到最長的鏈被盲目接受?當然,沒有雙花鍊是有效的——這將完全違背目的。
確實發生的事情(至少在比特幣核心中)是雙重支出和簽名有效性的檢查僅在特定鏈成為最有效的鏈之後發生。但在完全驗證之前,它不會被視為公認的最佳鏈。如果在候選最佳鏈中發現雙重花費或無效簽名,則該鏈被丟棄,選擇算法將恢復到第二大工作鏈,並充分驗證這一點。
延遲雙花和腳本檢查直到一個區塊處於最工作鏈中的原因是為了節省資源。執行這些檢查的計算成本比所有其他驗證規則加起來要高出許多倍,因此我們懶惰地執行它們。