---
# System prepended metadata

title: 資料可得性

---

# 資料可得性

在資料分片的環境底下，我們不能讓全節點去完整下載其他分片上所有的資料，否則就失去分片的意義了。

但我們仍然要顧慮一種情況：某個分片上的惡意節點，發佈了承諾，卻窩藏承諾背後的資料沒有發布。如果說在其他分片上的全節點，都乖乖收下了帶有這個承諾的區塊，這會是個危險的情況。相當於整個系統產出了一個區塊，但區塊上屬於該分片上的資料，除了惡意節點外沒有人知道是什麼。

要解決這個問題可以引入兩個機制：抽樣挑戰和糾刪碼。

抽樣挑戰是我們可以把該分片需要發布的資料切成幾等份，並要求全節點對其抽樣。例如切為 256 份，並對其抽取 75 份。全節點必須在抽樣的 75 份的資料都有正確回應的情況下，才能收下區塊。注意這時候惡意節點的選擇變成到底 256 份的資料中要發布幾份和窩藏幾份。抽樣挑戰的好處是全節點只要少少的抽樣，惡意節點必須發布很大比例的資料（例如 250 份），才能讓全網大部分的全節點完成挑戰並收下區塊。

但發布很大比例的資料仍然不夠，只要惡意節點能夠窩藏一份資料，這區塊就是一個資料不完整的不合格區塊。所以我們除了抽樣挑戰外還需要糾刪碼。

糾刪碼是原來資料的延伸，我們可以把原本的 256 份延伸出另外 256 份糾刪碼，總共 512 份。糾刪碼的性質是只要能在 512 份中取得任何 256 份，就能還原出原本資料的 256 份。惡意節點要通過抽樣挑戰，現在必須發布 512 份中大比例的份額，例如 500 份。但這 500 份足夠讓網路中的節點湊出剩下任何窩藏的 12 份了。

網路中的節點必須完成抽樣挑戰才能收下區塊。節點有抽不到的份額而沒辦法完成挑戰時，可以等別的節點分享從糾刪碼還原回來的份額，最終還是能完成。當整個網路都收下某個區塊時，我們可以確認原本資料的 256 份都是有發布出來的。而且這中間滿足擴容的條件，也就是全節點都只有下載少於 256 份的資料。


----

釋出：我目前的理解這個釋出的標準是資料有在其他 subnet 出現，這包含用糾刪碼還原出來的。Dankrad 的解釋是節點沒有窩藏資料。

## 數學細節

### 抽樣挑戰

假設 256 份裡面，惡意節點釋出了 X 比例的份額。節點抽樣 75 份，都沒抽到窩藏部分的機率是 $X^{75}$ 。在 X 為 50% 時，機率是 $10^{-23}$ ，在 X 為 75% 時，機率還是 $10^{-10}$ 的極小數字。但在 X 為 99% 時，機率上升到 0.47 了。

以文章的例子， 256 份裡面發布 250 份，這是 X 為 97% ，完成挑戰的機率 0.17 。換個角度看，全網大概有 17% 的節點完成挑戰而收下區塊，這樣子區塊還是會被拋棄。

但發布到 255 份時，完成挑戰的機率上升到 0.75 了。假設是有抵押的驗證節點，在 75% 有辦法收下這個區塊時，驗證者會對這個有窩藏一份的區塊形成共識，這樣的狀況是不能接受的。

在這邊機率的計算中，我們是當成投返式抽樣在計算，目的是簡化計算流程。實際的行為是不投返，假設窩藏 k 份。在 75 抽的第一抽挑戰成功，則下一次要從剩下的 255 份去抽，成功機率是 $\frac{255-k}{255}$ ，這數字會比 X 再小一點。所以 75 抽挑戰成功的機率還會比前面算的再更低。

### 糾刪碼

定義 X, Y 座標軸都是有限域。選擇的這個有限域大小必須能塞入資料的一份。例如一個有限域中的整數可以用 31 位元組來表達，則資料的一份不能多於 31 位元組。

想像原本的資料為 4 份。或視為一個 4 元素的陣列，每個元素 31 位元組。

想像一個 3 次多項式。我們關心多項式在 X 軸上 1 到 8 的 Y 值。
對於原來的 4 份資料，我們可以用拉格朗日插值法，去得到這個 3 次多項式，使得多項式在 X 軸 1 ~ 4 上面的 Y 值為原本資料陣列中的值。

這個多項式在 X 軸 5~8 上面的 Y 值就是糾刪碼。在 X 軸上 1 到 8 的 Y 值任意取得 4 個值，都可以通過同一條 3 次多項式。最後可以用多項式再去取得 X 軸 1 ~ 4 上面的 Y 值，來還原出原先的資料。


