IOTA Consensus Algorithm Introduction
===
:::danger
以下內容是 proof.K 根據官方資料和推理而得,只討論最簡單的情況,而且時有變更,請留意
:::
# 交易
[一筆交易](https://thetangle.org/transaction/LDBHUZJJDDZJQTIDVCJOIHYXGIGSJLMQCRCKTQBCTGIJGBMUUVBQDJMWQGT9DULGEFHHCPDHHK9M99999)
列出跟本次簡介有關的欄位
## Address
可以看成是銀行或郵局的帳號
## Value
正代表 Address 錢增加
負代表 Address 錢減少
## Trunk
交易會組成 DAG
Trunk 代表交易其中一個有向邊
## Branch
同 Trunk 的解釋 , 代表交易另一個有向邊
# Trunk 與 Branch
決定 Trunk 與 Branch 的算法稱為 tip selection
一筆交易 Trunk 與 Branch 所指向的交易
從帳本的角度看 , 必須有下列性質:
1. 所有被指向的交易 , 全部的 address , 餘額不是負的
2. 所有被指向的交易 , 全部的 address , 餘額加起來是最初的發行量
這邊需要詳細解釋
假設目前交易形成的 DAG 如下圖:
![](https://i.imgur.com/s1jMpG8.png)
整個 DAG 只有兩個 address $A$ 和 $B$ , 初始餘額分別是 10 , 5 , 總發行量是 15
交易 $0$ 是 A , -5
交易 $2$ 是 B , 3
交易 $3$ 是 B , 2
來看交易 $6$ 所驗證的交易(紅色部份):
![](https://i.imgur.com/0wxNe1P.png)
紅色的交易是交易 $6$ 所認可的帳本
經過計算 , $A$ 的餘額是 5 , $B$ 的餘額是 10
所以符合第一個條件 , 所有 address 都沒有負的
也符合第二個條件 , 所有 address 總和是最初的發行量
這兩個條件是這樣來的
每次買賣 , 都有一方給錢 , 一方收錢 , 是單純的錢從某個戶頭轉到另一個戶頭
所以戶頭總共的金額是不變的 , 這是第二個條件
另外 , 戶頭無法轉移超出戶頭的金額 , 這就是第一個條件
這樣看 , 可以理解每一筆交易的 Trunk 與 Branch 都是對一些交易組成帳本的認可
# 帳本
分散式帳本可以理解為人人有一本 , 上面戶頭的金額大家一樣
上面提到每筆交易 trunk 和 branch 代表對先前交易的認同
所以一筆交易如果是大家認同的交易 , 那會有許多的交易驗證
如下圖表示:
![](https://i.imgur.com/ZzN8JnS.png)
藍色是認同交易 $2$ 的交易
可以看出 , 交易 $2$ 大部份都認同
# 確認
來看官方所給的確認算法
:::info
跑100次 Tip selection , 看有多少個 tip 驗證到查詢的交易 , 那就代表有多少%的確認度
:::
以下圖為例:
![](https://i.imgur.com/H1ryYwM.png)
假設要查詢交易 $7$
跑一次 tip selection , 選到交易 $11$
![](https://i.imgur.com/zsEKMxL.png)
交易 $7$ 沒有被驗證到(不是紅色) , 所以沒有增加1%的確認度
如果是選到交易 $13$
![](https://i.imgur.com/r2YUbiZ.png)
交易 $7$ 是紅色的 , 代表有驗證到 , 所以增加 1% 的確認度
可以觀察到 , 有許多 tip 驗證到的交易 , 確認增加 1% 的機率很大
例如交易 $2$:
![](https://i.imgur.com/F5xE6Wb.png)
全部 tip 都驗證到交易 $2$ 了
這邊也得到 tip selection 的一個要求:
:::success
tip selection 要讓一筆交易被 tip 驗證的比例 , 隨著時間要越來越高
:::
# 有問題的帳本
有問題的帳本自然是有 address 的餘額是負
舉個例子說明
![](https://i.imgur.com/0vW1rKc.png)
假設交易 $13$ 所驗證到的交易
只有兩個 address $A$ 和 $B$
$A$ 與 $B$ 的初始餘額為 10 , 5
交易 $0$ , $1$ , $5$ 都是 0 元交易
交易 $2$ 是 $A$ , -10
交易 $7$ 是 $B$ , 10
交易 $4$ 是 $A$ , -10
交易 $10$ 是 $B$ , 10
這樣第二個條件會滿足 , 但是第一個條件不滿足
$A$ 的餘額是 -10
所以交易 $13$ 的 Trunk 與 Branch 需要重選
## 有衝突交易下確認的情況
之前提到是以高比例的 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]
21[label="21" color=blue, fontcolor=blue, fontsize=24, shape=box]
11[label="11" color=red, fontcolor=red, fontsize=24, shape=box]
31[label="31" color=red, fontcolor=red, 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->32;
13->42;
33->22;
33->42;
}
```
$\color{red}{11}$ 與 $\color{red}{31}$ 是衝突交易
$\color{red}{31}$ 被比較多交易驗證
這樣大家就決定出 , $\color{red}{31}$是大家接受的
所以 tip selection 要使 DAG 長成上圖的樣子
既然 $\color{red}{31}$ 被比較多交易驗證 , 那有個數值可以幫助 tip selection 做出選擇
就是一筆交易的累積權重
# 累積權重(cumulative weight)
以一張圖來說明如何計算
```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]
a -> c;
b -> c;
a -> c;
b -> c;
e -> a;
e -> b;
d -> a;
d -> b;
}
```
假設 $a$ , $b$ , $c$ , $d$ , $e$ 的自身權重分別是 3 , 9 , 3 , 3 , 9
那 $a$ 的權重就是有驗證到 $a$ 的交易自身權重和 $a$ 本身的權重相加
所以 $a$ 的累積權重是 3 + 9 + 3 + 3 + 9 = 27
$b$ 有 $e$ , $d$ 驗證
所以 $b$ 的累積權重是 9 + 3 + 9 = 21
## 交易自身權重
依照白皮書
交易自身權重跟交易的 Transaction Hash 有關
![](https://i.imgur.com/oSxc0hz.png)
藍色反白就是交易的 Transaction Hash
注意到 hash 尾端有 5 個 9
這代表交易所做PoW問題的hash格式
PoW問題越難 , 交易自身權重越大
以這個例子 , 權重 15 , Transaction Hash 尾端就要有 5 個 9
# Tip Selection
從以上的討論 , 可以知道累積權重通常代表大家對某筆交易的認可
現在來看看 , 累積權重是如何幫助 tip selection
1. 累積權重影響 tip selection
2. 當 trunk 與 branch 所驗證的交易有衝突交易 , 選累積權重大的
## 累積權重影響 tip selection
簡單一句話 :
:::success
交易累積權重越大 , 驗證該交易的 tips 被選到的機率越大
:::
可以用 [Iota Tangle Visualization](https://github.com/iotaledger/iotavisualization/tree/one-by-one) 觀察
## 有衝突交易 , 選累積權重大的
以圖說明
```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=red, fontcolor=red, fontsize=24, shape=box]
31[label="31" color=red, fontcolor=red, 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->32;
13->42;
33->22;
33->42;
new->12;
new->23
}
```
$\color{red}{11}$ 和 $\color{red}{31}$ 是衝突交易
$new$ 所驗證的交易 , 不滿足第一個條件
由於 $\color{red}{31}$ 累積權重比 $\color{red}{11}$ 大 , 所以交易 $23$ 保留 , 重新選一個 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]
21[label="21" color=blue, fontcolor=blue, fontsize=24, shape=box]
11[label="11" color=red, fontcolor=red, fontsize=24, shape=box]
31[label="31" color=red, fontcolor=red, 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->32;
13->42;
33->22;
33->42;
new->23;
new->33;
}
```
這樣 $new$ 所驗證的交易就是正常的帳本了
###### tags: `IOTA`