Blockchain

礦工如何避免交易被丟棄?

  • February 1, 2021

我在弄清楚礦工如何解決以下問題時遇到了問題:

假設我們有 2 個礦工:M1、M2。

M1 將交易 A、B、C、D 添加到他們的區塊中。M2 將交易 A、B、C 添加到他們的區塊中。由於某種原因,交易 D 將在 M1 收到後幾秒鐘到達 M2。

現在,M2 解決了這個塊並將這個塊發送給每個人。因此,M1 扔掉他們的區塊並開始處理新的區塊。

接下來,M1 將交易 E、F、G 添加到他們的區塊中,而 M2 將 D、E、F、G(M2 現在獲得 D)添加到他們的區塊中。現在,M1 先解出塊並廣播它。因此,M2 扔掉他們的塊並開始一個新的塊。

在這種情況下,交易 D 不會進入任何區塊!(這個問題是由網路速度引起的,導致 D 在到達 M1 後幾秒鐘就到達了 M2。)

那麼,如何處理或避免這個問題呢?

礦工有記憶體池,他們在其中儲存他們認為包含在未來區塊中的所有交易。他們不會立即將收到的交易放入他們的區塊中。

但他們也不會立即將它們放入記憶體池。每個礦工的記憶體池中的交易都是有效的,值得礦工付出努力(至少支付一定的費用)。

目前,他們甚至無法將他們知道的所有交易都包含在他們的區塊中。塊的大小最多為 1 MB,並且由於目前有很多交易,礦工的記憶體池比 1 MB 大得多。

在時間點 0,記憶體池如下所示:

mem_M1 = {A, B, C, D}
mem_M2 = {A, B, C}

當 M2 解決區塊時,他們會從他們的記憶體池中刪除他們包含在他們的區塊中的所有交易:

mem_M1 = {A, B, C, D}
mem_M2 = {}

然後 M2 將塊發送給 M1,M1 驗證新收到的塊。如果 M1 認為該塊有效,他們會從其記憶體池中刪除該塊中的所有交易:

mem_M1 = {D}
mem_M2 = {}

請注意,D 仍然在那裡。M1 不會刷新他們的記憶體池。只有新收到的區塊中包含的交易被刪除。

然後他們會收到更多交易:

mem_M1 = {D, E, F, G}
mem_M2 = {D, E, F, G}

接下來,M1 解決一個區塊並從他們的記憶體池中刪除他們包含的交易:

mem_M1 = {}
mem_M2 = {D, E, F, G}

在 M1 將他們新開采的區塊發送到 M2 之後,M2 從他們的記憶體池中刪除該區塊中包含的所有交易:

mem_M1 = {}
mem_M2 = {}

所有交易都包含在區塊中。

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