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格式問題
這樣礦機發的交易就會變少 , 更難超過最大權重
以上只是一種可行的方法 , 不排除有其他方法