# 權重
在進入選交易的算法前 , 要先討論交易的權重是如何變化的
注意到上面提到node讀的情況
我們想像DAG內有兩個衝突的交易a,b
目前a的權重最大
所以從node讀取會是a
blockchain需要有很難篡改的性質
所以如果在某個時間b的權重比a大
那就篡改了帳本
現在重點來了
:::success
選取交易的算法(被選到的交易會增加權重)
要能使一開始就是最大權重的交易 , 在往後任何時間都是最大的
:::
另外 , 攻擊者可以發起對DAG上任意一筆與之衝突的交易
所以增加權重的算法 , 必須盡可能增加最多交易的權重
綜合上面所述 , 問題如下:
:::info
給定一個任意的DAG , 給定任意數量的新交易
這些新交易怎麼選 , 才能達到上面的目的?
:::
所以接下來來考慮不同的交易情況 , 討論不同的選法
## 沒有指向DAG不存在的交易 , 一個增加一筆交易的例子
從簡單的情況開始討論
假設某個node的DAG如下圖
```graphviz
digraph tangle{
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]
a -> b;
b -> c;
a -> b;
b -> c;
}
```
$\color{blue}{a}$ 是最一開始的交易
$\color{blue}{c}$ 就是白皮書中提到的 $tip$
這邊給一下 $tip$ 的定義
:::success
交易沒有被其他交易指到
就是 $tip$
:::
我們假設每個交易的權重都是1
這樣 $\color{blue}{a}$ 的權重是3
$\color{blue}{b}$ 是2
$\color{blue}{c}$ 是1
權重的計算是全部有驗證或間接驗證到該交易的加總
所以不會有一筆交易被算兩次
接下來的一段時間 , 來了新的一筆交易 $\color{green}{d}$ , 並接到DAG上
那它可能有三種接法(以上圖為例)
### 第一種 接到最初的交易
```graphviz
digraph tangle{
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]
d[label="d" color=green, fontcolor=green, fontsize=24, shape=box]
a -> b;
b -> c;
a -> b;
b -> c;
d -> c;
d -> c;
}
```
算一下
這時
$\color{blue}{a}$ 的權重是4
$\color{blue}{b}$ 還是2
$\color{blue}{c}$ 還是1
會發現 $\color{blue}{b}$ 和 $\color{blue}{c}$ 都沒增加
### 第二種 接中間的交易
```graphviz
digraph tangle{
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]
d[label="d" color=green, fontcolor=green, fontsize=24, shape=box]
a -> b;
b -> c;
a -> b;
b -> c;
d -> b;
d -> b;
}
```
這時
$\color{blue}{a}$ 的權重是4
$\color{blue}{b}$ 是3
$\color{blue}{c}$ , $\color{blue}{d}$ 都是1
$\color{blue}{c}$ , $\color{green}{d}$ 權重沒有增加
### 第三種 接到tip上
```graphviz
digraph tangle{
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]
d[label="d" color=green, fontcolor=green, fontsize=24, shape=box]
a -> b;
b -> c;
a -> b;
b -> c;
d -> a;
d -> a;
}
```
算一下權重
$\color{blue}{a}$ 是4
$\color{blue}{b}$ 是3
$\color{blue}{c}$ 是2
只有 $\color{green}{d}$ 是1
### 當有交易指向DAG不存在的交易 , 一個增加一筆交易的例子
這邊分成兩種 , 一個是其中一個指到不存在 , 另一個是都指到不存在
### 其中一個指到不存在的交易
這邊要考慮指到不存在的交易的種類與新交易如何選的情況
所以例子比較多 , 比較複雜
先舉其中一種例子 , 觀察一下如何分析
```graphviz
digraph tangle{
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]
d[label="d" color=red, fontcolor=red, fontsize=24, shape=box];
e[label="e" color=green, fontcolor=green, fontsize=24, shape=box];
a -> b;
b -> c;
a -> b;
b -> c;
d -> b;
d -> "Transaction doesn't exist in this node's DAG.";
e -> d;
e -> a;
}
```
藍色的 , 是node舊有的
紅色的 , 是其中一個指到不存在的交易
綠色是新來的交易
實際上仔細觀察會發現 , 這跟兩筆所驗證的交易都在DAG是相同權重增加的情況
差別在於 , 所指的不存在的交易 , 會不知道是什麼樣的交易 , 如果是衝突的會有問題
### 都指到不存在的交易
這邊新來交易驗證的選擇 , 共有三種
如下
#### 新交易兩邊都選指到不存在的交易
```graphviz
digraph tangle{
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]
d[label="d" color=red, fontcolor=red, fontsize=24, shape=box];
e[label="e" color=green, fontcolor=green, fontsize=24, shape=box];
a -> b;
b -> c;
a -> b;
b -> c;
d -> f;
d -> g;
e -> d;
e -> d;
}
```
藍色的 , 是舊有的交易
紅色的 , 是兩筆選的交易 , 都是不存在的交易
$f\space ,\space g$ 兩個是不在node的交易
綠色是發起的交易
可以看到 , 舊有的交易(藍色 $\color{blue}{a}$ , $\color{blue}{b}$ , $\color{blue}{c}$)
都沒有增加到權重
#### 新交易其中一個選到都指到不存在的交易
```graphviz
digraph tangle{
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]
d[label="d" color=red, fontcolor=red, fontsize=24, shape=box];
e[label="e" color=green, fontcolor=green, fontsize=24, shape=box];
a -> b;
b -> c;
a -> b;
b -> c;
d -> f;
d -> g;
e -> d;
e -> a;
}
```
藍色的 , 是舊有的交易
紅色的 , 是兩筆選的交易 , 都是不存在的交易
$f\space ,\space g$ 兩個是不在node的交易
綠色是發起的交易
可以看到除了綠色的交易 , 其他的交易都會增加權重 , 包含 $f\space ,\space g$
#### 新交易都沒選都指到不存在的交易
```graphviz
digraph tangle{
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]
d[label="d" color=red, fontcolor=red, fontsize=24, shape=box];
e[label="e" color=green, fontcolor=green, fontsize=24, shape=box];
a -> b;
b -> c;
a -> b;
b -> c;
d -> f;
d -> g;
e -> a;
e -> a;
}
```
藍色的 , 是舊有的交易
紅色的 , 是兩筆選的交易 , 都是不存在的交易
$f\space ,\space g$ 兩個是不在node的交易
綠色是發起的交易
只會剩下舊有的交易會增加權重
### 總結
回想一下之前的假設:
:::info
從tangle選衝突內最大權重的交易
:::
這句話意味著:
:::info
可能的話 , 加入的交易
權重都要隨著時間而增加
而且 , 可能的話 , 要比第二大衝突的交易增加更多
所以與第二大的權重差不能隨著時間縮小
:::
那從上面的討論很容易看出 , 一個好的選tip算法 , 應該要有:
:::success
選接到DAG上的tip
可以使之前的交易增加權重
且大部份舊的交易都被增加到
:::
不過 , DAG不一定都是很簡單
新來的交易選的被驗證交易 , 不一定是同一個
例如:
```graphviz
digraph tangle{
rankdir=RL;
a[ label="c" color=Blue, fontcolor=Red, fontsize=24, shape=box];
b[label="b" color=Blue, fontcolor=Red, fontsize=24, shape=box];
c[label="a" color=Blue, fontcolor=Red, fontsize=24, shape=box]
d[label="d" color=Blue, fontcolor=Red, fontsize=24, shape=box]
a -> b;
b -> c;
a -> b;
b -> c;
d -> a;
d -> b;
}
```
d選b和c
這樣a,b,c還是有被增加權重
可以這樣說
:::info
新交易有選到原本node DAG的tip
那就很容易大部份的交易權重都有增加
:::
不過 , DAG不一定如上圖
比如說可以是
```graphviz
digraph tangle{
rankdir=RL;
a[ label="c" color=Blue, fontcolor=Red, fontsize=24, shape=box];
b[label="b" color=Blue, fontcolor=Red, fontsize=24, shape=box];
c[label="a" color=Blue, fontcolor=Red, fontsize=24, shape=box]
a -> c;
b -> c;
a -> c;
b -> c;
}
```
三個變化不多拉
看五個的
```graphviz
digraph tangle{
rankdir=RL;
a[ label="c" color=Blue, fontcolor=Red, fontsize=24, shape=box];
b[label="b" color=Blue, fontcolor=Red, fontsize=24, shape=box];
c[label="a" color=Blue, fontcolor=Red, fontsize=24, shape=box]
d[label="d" color=Blue, fontcolor=Red, fontsize=24, shape=box]
e[label="e" color=Blue, fontcolor=Red, fontsize=24, shape=box]
a -> c;
b -> c;
a -> b;
b -> c;
d -> b;
d -> a;
e -> d;
e -> c;
}
```
有點複雜
從上面的情況
目前大概可以肯定
:::success
選取被驗證交易的算法
要盡可能選DAG的tip
:::
接下來
看另一種情況
```graphviz
digraph tangle{
rankdir=RL;
a[ label="c" color=Blue, fontcolor=Red, fontsize=24, shape=box];
b[label="b" color=Blue, fontcolor=Red, fontsize=24, shape=box];
c[label="a" color=Blue, fontcolor=Red, fontsize=24, shape=box]
d[label="d" color=Blue, fontcolor=Red, fontsize=24, shape=box]
e[label="e" color=Blue, fontcolor=Red, fontsize=24, shape=box]
f[label="f" color=Blue, fontcolor=Red, fontsize=24, shape=box]
a -> b;
b -> c;
a -> b;
b -> c;
d -> a;
d -> a;
e -> b;
e -> b;
f -> d;
f -> d;
}
```
可以看到 $\color{red}{e}$ , $\color{red}{f}$ 都是tip
$\color{red}{e}$ 就是 $lazy \space tip$
可是新的交易接到 $\color{red}{e}$
, $\color{red}{c}$ , $\color{red}{d}$ , $\color{red}{f}$ 都不會增加權重
所以到這邊 , 可以得到結論
:::success
選交易的算法 , 要選tip且要盡可能不選lazy tip
:::
# 衝突交易
來看如果有衝突的交易
## 有向邊可搜尋到的衝突交易
先講結論:
:::success
不用管
:::
考慮一般情況的衝突示意圖
如下
```graphviz
digraph tangle{
rankdir=RL;
b[label="b" color=red, fontcolor=Red, fontsize=24, shape=box];
a[label="a" color=red, fontcolor=red, fontsize=24, shape=box];
a -> init;
b -> d;
c -> a;
d -> a;
e -> d;
f -> b;
}
```
$\color{red}{a},\color{red}{b}$ 是衝突的交易
$init,c,d,e,f$ 是 $sub-DAG$ 或 沒有交易
可以看到新來的交易不管選哪個
$\color{red}{a}$ 的權重都會是最大的
不會出現 $\color{red}{b}$ 會是最大權重的情況
(在 $c,d,e,f$ 有交集也成立)
所以 $\color{red}{b}$ 永遠替代不了 $\color{red}{a}$
## 有向邊搜尋找不到的衝突交易
一樣先看簡單的
```graphviz
digraph tangle{
rankdir=RL;
a[ label="c" color=red, fontcolor=red, fontsize=24, shape=box];
b[label="b" color=red, fontcolor=Red, fontsize=24, shape=box];
c[label="a" color=blue, fontcolor=blue, fontsize=24, shape=box]
a -> c;
b -> c;
a -> c;
b -> c;
}
```
紅色的是衝突的交易 , 藍色是正常的交易
以上圖來說 , b與c是衝突的交易 , a是正常的
很明確的 , c往有向邊的方向搜尋 , 是找不到衝突的交易
b同樣也是
可是DAG內有衝突的交易
現在來看增加一筆新交易d的情況 , 只看接在tip的情況(接在比b,c前面不會增加b與c的權重,不考慮這種情況)
### 接在b
```graphviz
digraph tangle{
rankdir=RL;
a[ label="c" color=red, fontcolor=red, fontsize=24, shape=box];
b[label="b" color=red, fontcolor=Red, fontsize=24, shape=box];
c[label="a" color=blue, fontcolor=blue, fontsize=24, shape=box]
d[label="d" color=blue, fontcolor=blue, fontsize=24, shape=box]
d -> b;
d -> b;
a -> c;
b -> c;
a -> c;
b -> c;
}
```
b的權重是2
c是1
b權重最大
### 接在c
```graphviz
digraph tangle{
rankdir=RL;
a[ label="c" color=red, fontcolor=red, fontsize=24, shape=box];
b[label="b" color=red, fontcolor=Red, fontsize=24, shape=box];
c[label="a" color=blue, fontcolor=blue, fontsize=24, shape=box]
d[label="d" color=blue, fontcolor=blue, fontsize=24, shape=box]
d -> a;
d -> a;
a -> c;
b -> c;
a -> c;
b -> c;
}
```
b的權重是1
c的權重是2
c權重最大
### b與c都接
```graphviz
digraph tangle{
rankdir=RL;
a[ label="c" color=red, fontcolor=red, fontsize=24, shape=box];
b[label="b" color=red, fontcolor=Red, fontsize=24, shape=box];
c[label="a" color=blue, fontcolor=blue, fontsize=24, shape=box]
d[label="d" color=blue, fontcolor=blue, fontsize=24, shape=box]
d -> a;
d -> b;
a -> c;
b -> c;
a -> c;
b -> c;
}
```
c的權重是2
b也是2
b與c權重一樣大
### 小總結
恩 , 從上面的結果
什麼情況都有
代表這種類型的衝突交易很危險
容易被用來篡改帳本
選取被驗證交易的算法 , 要避免這種情況
## 衝突交易的選擇
由前面共識演算法的一致性
可以知道:
:::success
要讓衝突內最大權重的交易 , 一直是最大權重的
:::
### node 發現衝突交易與沒發現衝突交易的行為
node沒發現DAG有衝突交易的話 , 那衝突的交易都可能增加權重
node發現有衝突的交易 , 選的交易會讓衝突交易中權重最大的交易增加權重
例如:
```graphviz
digraph tangle{
rankdir=RL;
a[ label="c" color=red, fontcolor=red, fontsize=24, shape=box];
b[label="b" color=red, fontcolor=Red, fontsize=24, shape=box];
c[label="a" color=blue, fontcolor=blue, fontsize=24, shape=box]
d[label="d" color=blue, fontcolor=blue, fontsize=24, shape=box]
d -> b;
d -> b;
a -> c;
b -> c;
a -> c;
b -> c;
}
```
這是一個有衝突交易的DAG
藍色是正常的交易
紅色是衝突的交易
可以看到 $\color{red}{b}$ 是衝突交易內最大權重的
所以當node發現有衝突的交易時 , 是這樣選的
```graphviz
digraph tangle{
rankdir=RL;
a[ label="c" color=red, fontcolor=red, fontsize=24, shape=box];
b[label="b" color=red, fontcolor=Red, fontsize=24, shape=box];
c[label="a" color=blue, fontcolor=blue, fontsize=24, shape=box]
d[label="d" color=blue, fontcolor=blue, fontsize=24, shape=box]
e[label="e" color=green, fontcolor=green, fontsize=24, shape=box]
d -> b;
d -> b;
a -> c;
b -> c;
a -> c;
b -> c;
e -> d;
e -> d;
}
```
綠色的交易 , 是新發起的交易 , 選到d
這樣 $\color{red}{b}$ 的權重就增加
然後其他衝突交易的權重就沒有增加到
這樣帳本的紀錄就會是 $\color{red}{b}$ , 跟沒有綠色交易的DAG一樣
## 衝突交易的檢查
### 有衝突交易的DAG
有許多種情況 , 基本都要是有向邊搜尋不到的衝突交易
#### 距離
這裡距離是指沿著有向邊 , 找到相遇的交易後 , 共經歷過幾筆交易 , 例如:
假設DAG如下
```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;
}
```
以紅色的交易代表是衝突的交易
附近是這種情況
```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=red, fontcolor=red, 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=red, fontcolor=red, 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;
}
```
這樣就是比較近的交易 , 他們有 $\color{blue}{21}$ 這筆相遇的交易
當然 , $\color{blue}{31}$ 這筆也是
可能會有多個 , 看最少那個 , 這個是距離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]
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=red, fontcolor=red, 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=red, fontcolor=red, 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;
}
```
$\color{blue}{e}$ 會是相遇的 , 距離是3
中間經過 $\color{blue}{e}$ , $\color{blue}{41}$ 和 $\color{blue}{42}$
#### 兩筆衝突交易距離比較近
分三種 , $lazy \space tip$ 附近 , $tip$ 附近 , 不是 $tip$ 附近
##### lazy tip 附近
就是衝突交易其中一筆 , 是 $lazy \space tip$
例如
```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=red, fontcolor=red, 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=red, fontcolor=red, 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;
}
```
或
```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=red, fontcolor=red, fontsize=24, shape=box]
51[label="51" color=red, fontcolor=red, 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;
51->e;
51->e;
}
```
##### tip 附近
就是上面
:::success
應該選 $tip$ , 盡可能不選 $lazy \space tip$
:::
所說的 $tip$
```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=red, fontcolor=red, fontsize=24, shape=box]
33[label="33" color=red, fontcolor=red, 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;
}
```
或
```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=red, fontcolor=red, fontsize=24, shape=box]
43[label="43" color=blue, fontcolor=blue, fontsize=24, shape=box]
33[label="33" color=red, fontcolor=red, 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;
}
```
##### 不是tip 附近
基本上是一種
```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=red, fontcolor=red, 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=red, fontcolor=red, 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;
}
```
隨著時間過去 , 如果沒node發現的話
會變成類似下圖的情況
```graphviz
digraph init{
rankdir=RL;
a[ label="c" color=red, fontcolor=red, fontsize=24, shape=box];
b[label="b" color=red, fontcolor=red, 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;
}
```
#### 兩筆衝突交易距離比較遠
##### 有tip
* $lazy \space tip$
```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=red, fontcolor=red, fontsize=24, shape=box]
22[label="22" color=blue, fontcolor=blue, fontsize=24, shape=box]
11[label="11" color=red, fontcolor=red, 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;
}
```
* 不是 $tip$
```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=red, fontcolor=red, fontsize=24, shape=box]
22[label="22" color=blue, fontcolor=blue, fontsize=24, shape=box]
11[label="11" color=red, fontcolor=red, fontsize=24, shape=box]
12[label="12" 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;
12->11;
12->21;
}
```
* 只有 $lazy \space tip$
```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=red, fontcolor=red, 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=red, fontcolor=red, 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->a;
11->a;
22->21;
22->31;
33->22;
33->42;
}
```
##### 沒tip
```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=red, fontcolor=red, 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]
f[label="f" color=red, fontcolor=red, 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->f;
22->21;
22->31;
33->22;
33->42;
f->a;
f->a;
}
```
### 白皮書提到的交易選取算法問題
這邊假設檢查衝突交易是在選被驗證交易算法中隨機檢查
嚴格來說 , 檢查交易與選被驗證交易是可以分開的兩件事
但是以官方release的資料來看 , 是一起做的
在選被驗證交易時檢查交易
以其中一張有衝突交易的圖為例

$\color{red}{5}$ 是發現 $\color{red}{w}$ , $\color{red}{y}$ 是衝突的交易
可是 $\color{yellow}{1}$ 和 $\color{yellow}{2}$ 卻沒發現
這跟如何檢查交易是有關係的
一筆交易檢查交易 , 是沿著DAG邊的方向去檢查的
例如 $\color{yellow}{1}$ 可能會檢查 $\color{red}{w}$ , $\color{blue}{x}$ , $\color{blue}{q}$ , $\color{blue}{s}$ 和 $\color{blue}{u}$
當然可以檢查更深入的交易 , 例如 $\color{green}{m}$ 與 $\color{blue}{p}$
不過不必要檢查太深的 , 例如 $\color{green}{a}$
因為已經有許多交易檢查過了
所以 $\color{yellow}{1}$ 會發現有衝突的交易
但是在 $\color{yellow}{1}$ 所檢查過的交易 , 並沒有與 $\color{red}{w}$ 衝突的
所以選擇 $\color{red}{w}$ 作為 $\color{yellow}{1}$ 被驗證的交易是可以的
同樣的情況 , $\color{yellow}{2}$ 也是
所以 $\color{red}{5}$ 才能發現
因為 $\color{red}{5}$ 是選 $\color{yellow}{1}$ 和 $\color{yellow}{2}$ , 所以會發現 $\color{red}{w}$ 與 $\color{red}{y}$ 是衝突的
那就不能選 $\color{yellow}{1}$ 與 $\color{yellow}{2}$ , 其中一個要換掉
#### Uniform 不好找到衝突交易的DAG
這蠻多的 , 衝突交易不是 $tip$ 的都是(包含 $lazy \space tip$)
#### MCMC 不好找到衝突交易的DAG
如下的DAG , MCMC不容易發現衝突交易
```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=red, fontcolor=red, 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=red, fontcolor=red, 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;
}
```
# 權重計算的實作
[cumulative weight](https://github.com/alongalky/iota-docs/blob/master/cumulative.md)
###### tags: `IOTA`