在上一篇文章中,我們討論什麼是分片,它要解決的問題以及有效實現它需要克服的一些障礙。今天我們將討論跨分片事務、無效事務和惡意行為。
我們在上一篇文章中描述的基本分片型別不是一種非常有用或實用的分片方法,因為它們無法相互通訊,這使得它們像單個區塊鏈一樣。
讓我們舉一個簡單付款的例子。如果使用者a和使用者b在同一個分片上,分片內的驗證者將能夠處理事務而不會出現問題,但是當它們在不同分片上有帳戶時會發生什麼情況?
使用者A在分片1上,使用者B在分片2上。單個分片上的驗證者無法借記或記入使用者的帳戶,因為它們對彼此各自的分片沒有許可權。
不過,這個問題有很多解決方案,所以讓我們更詳細地看一看其中的一些方法:
同步(同時)跨分片事務
在這種情況下,當分片1上的使用者a需要向分片2上的使用者b傳送資金時,每個分片中包含與事務本身相關的狀態轉換的塊同時產生,並且每個分片上的驗證者協同工作以確認事務。
非同步跨分片事務
這是一個稍微容易完成的操作,並且更容易協調,因此它比同步事務更受歡迎。
同樣,我們將使用分片1上的使用者a想要向分片2上的使用者b匯款的例子。
在這種情況下,負責記入使用者B帳戶的分片只有在有足夠證據證明負責記入使用者A帳戶的分片已經完成後才會驗證其部分交易。
這種方法並不完美,但其中一個分片的其中一個區塊被孤立的可能性非零。非零機會,無論多麼不可能,仍然是一個不容忽視的漏洞。
考慮下面的數字,我們將看看為什麼:
這個區塊鏈有兩個分片,純粹巧合的是,它們都是在事務被合併到分片#1中的塊A和分片#2中的塊X'的確切點上。
當像發生這樣的分叉時,孤立分片必須其中一個鏈子並接受另一個鏈子。如果鏈A,B等成為分片#1中的可接受鏈並且鏈'W',X'等成為分片#2中的可接受鏈,則事務最終確定並且每個人都很高興。
如果分片 1中的a',b'等被chan接受,那麼分片 2中的chain w,x等被接受,則整個事務失敗,這也是一個可接受的結果,因為該事務可以重新傳送。
如果在分片1中接受鏈a、b等,而在分片2中接受鏈w、x等,會發生什麼情況?交易的一部分最終確定(A、B等),而交易的另一部分被放棄(W、X等)。
是這樣嗎?
現在您已經對分片及其工作方式有了更好的理解,您可能會感到滿意,或者有更多問題,但至少還有一件事需要考慮:惡意使用者
惡意節點
在任何情況下都很常見的是,當有可能發生大的發薪日時,就會有人想到打敗系統的方法,無論系統是什麼。
批准無效塊
惡意參與節點可能會透過建立嘗試更改網路的塊來決定是否要攻擊網路。 假設使用者#1有10個代幣而使用者#2有0個代幣。當使用者#1將這10個代幣傳送給使用者#2時,網路上的惡意節點可以嘗試建立區塊,終端使用者#1具有0個代幣而使用者#2具有1000個代幣。
在沒有分片的常規區塊鏈中,這種型別的攻擊是不可能的,因為每個節點都會驗證每個區塊,如果發現了無效區塊,則所有節點(無論是否為礦工)都會拒絕該區塊。
對於經典的區塊鏈,不管惡意節點建立了多少個區塊,也不管它們建立的速度有多快,網路的誠實參與者總是會忽略這些區塊,繼續構建誠實鏈。
假設一個鏈被分成兩部分,因為壞節點希望構建無效的區塊來用一堆代幣填充他們的帳戶。惡意節點的數量甚至可能超過誠實節點,正如本例所示。短鏈是誠實鏈,長鏈是無效鏈。在一個普通的非分片區塊鏈中,每個參與者都有責任驗證他們收到的所有區塊並確認狀態,因此在區塊鏈中擁有既得利益(並擴充套件其完整性)的任何人都會立即識別無效鏈並忽略它(在這種情況下)較短的鏈條。
分片鏈稍微複雜一些,因為參與者無法驗證每個分片上的每個事務,因此我們必須弄清楚如何確認分片的整個歷史記錄中沒有無效的區塊。
由於信標鏈(在我們上一篇文章中討論過)通常不具備驗證每個分片中每個區塊的能力,因此我們需要另一種解決方案來確保每個鏈的完整性。
假設網路和關聯,每個分片都有一個拜占庭式的容錯機制,並且分片內的惡意節點控制率低於66.667%,那麼您可以構建一個機制,在嘗試生成無效區塊時向系統發出警報,其中一個或多個誠實的節點可以證明有效或無效的區塊。如果66.667%以上的shard被惡意節點控制,那麼理論上它們可以最終確定區塊,但是隻要分片中的一個節點是誠實的,就可以建立一種機制,允許誠實節點對抗惡意節點。