node如何處理不合作的鄰居node === ## node如何發現不合作的鄰居node 由[權重](https://hackmd.io/s/rkZAX1xuf)得到的結論: :::success 選交易的算法 , 要選tip且要盡可能不選lazy tip ::: 從這結論可以來判斷怎樣的 $node$ 要繼續連結 , 怎樣的 $node$ 要處罰或是斷線 對 $node$ 來說 , 好的鄰居 $node$ 行為應該是盡量增加非 $lazy \space tip$ 的 $tip$ 權重 先來看 [$lazy \space tip$](https://hackmd.io/s/BJ5ylOOrG) 所模擬的例子 * 3 ```graphviz digraph init{ rankdir=RL; a[ label="c" color=blue, fontcolor=blue, fontsize=24, shape=box]; b[label="b" color=blue, fontcolor=blue, fontsize=24, shape=box]; c[label="a" color=blue, fontcolor=blue, fontsize=24, shape=box] e[label="e" color=blue, fontcolor=blue, fontsize=24, shape=box] d[label="d" color=blue, fontcolor=blue, fontsize=24, shape=box] 31[label="31" color=blue, fontcolor=blue, fontsize=24, shape=box] 21[label="21" color=blue, fontcolor=blue, fontsize=24, shape=box] 41[label="41" color=blue, fontcolor=blue, fontsize=24, shape=box] 32[label="32" color=blue, fontcolor=blue, fontsize=24, shape=box] 11[label="11" color=blue, fontcolor=blue, fontsize=24, shape=box] 22[label="22" color=blue, fontcolor=blue, fontsize=24, shape=box] 42[label="42" color=blue, fontcolor=blue, fontsize=24, shape=box] 33[label="33" color=blue, fontcolor=blue, fontsize=24, shape=box] 12[label="12" color=blue, fontcolor=blue, fontsize=24, shape=box] 23[label="23" color=blue, fontcolor=blue, fontsize=24, shape=box] 43[label="43" color=blue, fontcolor=blue, fontsize=24, shape=box] a -> c; b -> c; a -> c; b -> c; e -> a; e -> b; d -> a; d -> b; 31->d; 31->d; 21->e; 21->d; 41->e; 41->d; 32->31; 32->21; 11->e; 11->e; 22->21; 22->31; 42->41; 42->31; 33->42; 33->22; 12->11; 12->21; 23->22; 23->32; 43->32; 43->42; } ``` * 4 ```graphviz digraph init{ rankdir=RL; a[ label="c" color=blue, fontcolor=blue, fontsize=24, shape=box]; b[label="b" color=blue, fontcolor=blue, fontsize=24, shape=box]; c[label="a" color=blue, fontcolor=blue, fontsize=24, shape=box] e[label="e" color=blue, fontcolor=blue, fontsize=24, shape=box] d[label="d" color=blue, fontcolor=blue, fontsize=24, shape=box] 41[label="41" color=blue, fontcolor=blue, fontsize=24, shape=box] 31[label="31" color=blue, fontcolor=blue, fontsize=24, shape=box] 42[label="42" color=blue, fontcolor=blue, fontsize=24, shape=box] 21[label="21" color=blue, fontcolor=blue, fontsize=24, shape=box] 32[label="32" color=blue, fontcolor=blue, fontsize=24, shape=box] 43[label="43" color=blue, fontcolor=blue, fontsize=24, shape=box] 33[label="33" color=blue, fontcolor=blue, fontsize=24, shape=box] 22[label="22" color=blue, fontcolor=blue, fontsize=24, shape=box] 11[label="11" color=blue, fontcolor=blue, fontsize=24, shape=box] a -> c; b -> c; a -> c; b -> c; e -> a; e -> b; d -> a; d -> b; 41->e; 41->d; 31->d; 31->d; 42->41; 42->31; 21->e; 21->d; 32->21; 32->31; 43->42; 43->32; 11->e; 11->e; 22->21; 22->31; 33->22; 33->42; } ``` 這裡舉的是 $3$ , $4$ node的DAG 注意到 $11$ , $12$ 和 $23$ 都是 $4$ 沒有的交易 然後看 $1$ , $4$ node的DAG * 1 ```graphviz digraph init{ rankdir=RL; a[ label="c" color=blue, fontcolor=blue, fontsize=24, shape=box]; b[label="b" color=blue, fontcolor=blue, fontsize=24, shape=box]; c[label="a" color=blue, fontcolor=blue, fontsize=24, shape=box] e[label="e" color=blue, fontcolor=blue, fontsize=24, shape=box] d[label="d" color=blue, fontcolor=blue, fontsize=24, shape=box] 11[label="11" color=blue, fontcolor=blue, fontsize=24, shape=box] 21[label="21" color=blue, fontcolor=blue, fontsize=24, shape=box] 12[label="12" color=blue, fontcolor=blue, fontsize=24, shape=box] 22[label="22" color=blue, fontcolor=blue, fontsize=24, shape=box] 31[label="31" color=blue, fontcolor=blue, fontsize=24, shape=box] 13[label="13" color=blue, fontcolor=blue, fontsize=24, shape=box] 41[label="41" color=blue, fontcolor=blue, fontsize=24, shape=box] 32[label="32" color=blue, fontcolor=blue, fontsize=24, shape=box] 23[label="23" color=blue, fontcolor=blue, fontsize=24, shape=box] a -> c; b -> c; a -> c; b -> c; e -> a; e -> b; d -> a; d -> b; 11->e; 11->e; 21->e; 21->d; 12->11; 12->21; 22->21; 22->31; 31->d; 31->d; 13->12; 13->22; 41->e; 41->d; 32->21; 32->31; 23->22; 23->32; } ``` * 4 ```graphviz digraph init{ rankdir=RL; a[ label="c" color=blue, fontcolor=blue, fontsize=24, shape=box]; b[label="b" color=blue, fontcolor=blue, fontsize=24, shape=box]; c[label="a" color=blue, fontcolor=blue, fontsize=24, shape=box] e[label="e" color=blue, fontcolor=blue, fontsize=24, shape=box] d[label="d" color=blue, fontcolor=blue, fontsize=24, shape=box] 41[label="41" color=blue, fontcolor=blue, fontsize=24, shape=box] 31[label="31" color=blue, fontcolor=blue, fontsize=24, shape=box] 42[label="42" color=blue, fontcolor=blue, fontsize=24, shape=box] 21[label="21" color=blue, fontcolor=blue, fontsize=24, shape=box] 32[label="32" color=blue, fontcolor=blue, fontsize=24, shape=box] 43[label="43" color=blue, fontcolor=blue, fontsize=24, shape=box] 33[label="33" color=blue, fontcolor=blue, fontsize=24, shape=box] 22[label="22" color=blue, fontcolor=blue, fontsize=24, shape=box] 11[label="11" color=blue, fontcolor=blue, fontsize=24, shape=box] a -> c; b -> c; a -> c; b -> c; e -> a; e -> b; d -> a; d -> b; 41->e; 41->d; 31->d; 31->d; 42->41; 42->31; 21->e; 21->d; 32->21; 32->31; 43->42; 43->32; 11->e; 11->e; 22->21; 22->31; 33->22; 33->42; } ``` $1$ , $4$ 不是鄰居 $1$ node缺 $42$ , $33$ , $43$ $4$ node缺 $12$ , $13$ , $23$ 會發現 $1$ 與 $4$ DAG差異比較大 , $3$ 與 $4$ DAG差異比較小 但更重要的是 $tips$ (不考慮 $lazy \space tip$ ) $1$ node的 $tips$ 是 $13$ , $23$ $3$ node的 $tips$ 是 $12$ , $23$ , $33$ , $43$ $4$ node的 $tips$ 是 $33$ , $43$ 會發現 $1$ 與 $4$ 的 $tips$ 沒有交集 $1$ 與 $3$ 的 $tips$ 有交集 從這可以有一個猜測: :::info 相連的 $node$ $tips$ 的交集 , 交集元素數量在 $node$ 的 $tips$ 比例比較高 ::: 那就可以推出下面不肯定的結論: :::info 正常鄰居 $node$ 所發起的交易 , 選取的被驗證交易 , 很大機率是自己 $tips$ 內非 $lazy \space tip$ 的交易 ::: 這是要實驗看看的 不過先假設對 , 來看進一步推論 猜測: :::info 間隔較遠的 $node$ $tips$ 的交集在 node的 $tips$ 比例較少 ::: 這猜測有點難懂 , 繼續以 [$lazy \space tip$](https://hackmd.io/s/BJ5ylOOrG) 的 $node$ 為例子 上面有了 $1$ , $3$ , $4$ 的 $tips$ 來看 $2$ node的DAG * 2 ```graphviz digraph init{ rankdir=RL; a[ label="c" color=blue, fontcolor=blue, fontsize=24, shape=box]; b[label="b" color=blue, fontcolor=blue, fontsize=24, shape=box]; c[label="a" color=blue, fontcolor=blue, fontsize=24, shape=box] e[label="e" color=blue, fontcolor=blue, fontsize=24, shape=box] d[label="d" color=blue, fontcolor=blue, fontsize=24, shape=box] 21[label="21" color=blue, fontcolor=blue, fontsize=24, shape=box] 11[label="11" color=blue, fontcolor=blue, fontsize=24, shape=box] 31[label="31" color=blue, fontcolor=blue, fontsize=24, shape=box] 22[label="22" color=blue, fontcolor=blue, fontsize=24, shape=box] 12[label="12" color=blue, fontcolor=blue, fontsize=24, shape=box] 32[label="32" color=blue, fontcolor=blue, fontsize=24, shape=box] 41[label="41" color=blue, fontcolor=blue, fontsize=24, shape=box] 23[label="23" color=blue, fontcolor=blue, fontsize=24, shape=box] 13[label="13" color=blue, fontcolor=blue, fontsize=24, shape=box] 42[label="42" color=blue, fontcolor=blue, fontsize=24, shape=box] 33[label="33" color=blue, fontcolor=blue, fontsize=24, shape=box] a -> c; b -> c; a -> c; b -> c; e -> a; e -> b; d -> a; d -> b; 21->e; 21->d; 11->e; 11->e; 31->d; 31->d; 22->21; 22->31; 41->e; 41->d; 12->11; 12->21; 32->21; 32->31; 23->22; 23->32; 42->41; 42->31; 13->12; 13->22; 33->22; 33->42; } ``` $2$ node的 $tips$ 是 $13$ , $23$ , $33$ 把 $1$ , $2$ , $3$ , $4$ 的 $tips$ 一起看: $1$ : $13$ , $23$ $2$ : $13$ , $23$ , $33$ $3$ : $12$ , $23$ , $33$ , $43$ $4$ : $33$ , $43$ 再看一下 [$lazy \space tip$](https://hackmd.io/s/BJ5ylOOrG) 的網路拓樸 ```graphviz graph graphname{ 1 -- 2; 2 -- 3; 3 -- 4; } ``` 發現跟 $4$ $tips$ 沒有交集的 $1$ 是間隔比較遠的 $node$ 然後 $4$ 跟 $2$ $tips$ 交集是 $33$ 最近的 $3$ $tips$ 交集是 $33$ , $43$ 確實就這模擬 , 間隔較遠的 $node$ , $tips$ 交集的交易也較少 既然鄰居node的 $tips$ 與自己node有很高的重疊 那就可以開始討論與鄰居node保持連線的條件 ### 與鄰居node保持連線的條件 鄰居node發的交易會有許多情況 因為 $node$ 是靠 鄰居node 收全部網路上 $node$ 發起的交易 所以會有沒選取DAG上的交易 , 選 $lazy \space tip$ 的交易 , 選不是 $tip$ 的交易 這樣的情況 , 就不能要求 鄰居node 大部份送的交易都指到非 $lazy \space tip$ 的 $tip$ 所以只能用最低的要求來當標準 而這邊就跟白皮書提到 $node$ 會不會認真工作的描述有關了 白皮書描述: :::info 是甚麼動機促使節點們產生、傳播 (propagate) 交易? 事實上,我們佈署的節點並沒有理由不產生及傳播交易。每個節點會計算一些數據,其中之一是計算會從鄰居接收多少新的交易。如果某個特定節點「太懶惰」,便會被它的鄰居捨棄。所以即使節點並沒有發布任何的交易(也因此沒有分享新的交易來驗證自己交易的動力),他仍然有動機努力工作。 ::: 如果某個特定節點「太懶惰」,便會被它的鄰居捨棄。 這句就是說明對於 鄰居node 不送交易 , $node$ 會跟 鄰居node 斷連的 白皮書說的是一段時間內 , 完全不發交易的處理 可是就[權重章節](https://hackmd.io/s/rkZAX1xuf#權重)的討論 , 有發交易還不代表對增加權重是有最大的幫助的 所以最低條件是: :::success 一段時間內 , 至少一筆鄰居node發的交易所選取被驗證的交易 , 必須是node DAG 內非 $lazy \space tip$ 的 $tip$ ::: ## 知道不合作鄰居node後的應對 上面推出了最低要求 接下來討論各式應對方法 實際上不合作鄰居node已經可以視為惡意node了 所以手段激烈沒有關係 , 有幾個可選的 ### 斷連 最直接了當的方法 , 反正該鄰居node不互相增加彼此交易的權重 基本上有跟沒有是一樣的 , 那就斷連 斷連會少收交易 , 所以 $client$ 需要紀錄些備用的 $node$ ### 要求難的PoW題目 上面斷連是完全不收交易的做法 這邊難的PoW題目就是少收交易的做法 那 $client$ 就不需要紀錄備用的 $node$ 只是交易確認的效率會變差 , 但可以降低不合作鄰居node的影響 ## 有衝突交易DAG ### 其中一個 confirmation 這裡要講講常見的誤解 :::info 用礦機之類可以做大量PoW的機器 灌大量交易接到第二大權重的交易 這樣就能輕易篡改帳本了 ::: 假設這台礦機是正常node的鄰居 網路拓樸如下: ```graphviz graph graphname{ 1 -- 2; 2 -- 3; 3 -- 1; 1 -- 4; 4 -- 礦機; } ``` 考慮上面對於 鄰居node 的管理 礦機會在發一段時間的交易後 , 被斷線 所以直連的礦機是難以成功的 為何會被斷線 , 兩個原因 * 網路頻寬限制 * 不合作的 $node$ 我們知道一個事實: :::info $node$ 接收交易每單位時間是有上限的 ::: 想像礦機對 $4$ 發大量的交易 如果要最大的效果 , 就是會把 $4$ 的網路頻寬都用掉 這樣會讓 $1$ 有一段時間沒有收到 $4$ 發來的交易 根據 :::success 一段時間內 , 至少一筆鄰居node發的交易所選取被驗證的交易 , 必須是node DAG 內非 $lazy \space tip$ 的 $tip$ ::: 的要求 $1$ 會跟 $4$ 斷線 斷線後的網路拓樸如下: ```graphviz graph graphname{ 1 -- 2; 2 -- 3; 3 -- 1; 4 -- 礦機; } ``` 這樣礦機的交易是無法進入 $1$ , $2$ 和 $3$ 如果不管 $4$ 上的帳本紀錄 這樣 $1$ , $2$ 和 $3$ 的帳本 , 衝突內最大交易還是沒變 如果 $4$ 紀錄衝突交易內 , 不是最大權重交易可以增加交易權重的 $tips$ 可以有下列的方法來防禦這樣的攻擊 * 不收交易 由[零元交易](https://hackmd.io/s/H17mcMKef#0元交易)這章 可以得知 :::success 不收零元交易 ::: 是一種阻擋的方式 但是如果攻擊者弄很多非零元交易 , 還是抵擋不了 , 所以就需要下一點了 * 要求做難的PoW題目 IOTA的PoW跟比特幣不一樣 , 不需要全網node的hash難度共識 所以可以拿來針對惡意的node 要求做足夠難度的hash格式問題 這樣礦機發的交易就會變少 , 更難超過最大權重 以上只是一種可行的方法 , 不排除有其他方法