一個node的DAG(Directed Acyclic Graph)成長
===
從最簡單的例子開始(一個node的不算)
```graphviz
graph graphname{
1 -- 2;
}
```
網路拓樸如上圖
這邊有兩個node( $1$ , $2$ )
這邊假設兩個node初始的DAG是一樣的 , 來玩一次模擬
假設 $1$ 與 $2$ 初始的DAG如下
```graphviz
digraph init{
rankdir=RL;
a[ label="c" color=green, fontcolor=green, fontsize=24, shape=box];
b[label="b" color=green, fontcolor=green, fontsize=24, shape=box];
c[label="a" color=blue, fontcolor=blue, fontsize=24, shape=box]
a -> c;
b -> c;
a -> c;
b -> c;
}
```
假設 $1$ 發起一筆交易 , $2$ 收到 $1$ 發的交易前也發起一筆交易
來看中間DAG變化的情況
* node1
```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]
d[label="d" color=green, fontcolor=green, fontsize=24, shape=box]
a -> c;
b -> c;
a -> c;
b -> c;
d -> a;
d -> b;
}
```
$1$ 發起新的交易 , 驗證 $b$ 與 $c$
來看 $2$
* node2
```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=green, fontcolor=green, fontsize=24, shape=box]
a -> c;
b -> c;
a -> c;
b -> c;
e -> a;
e -> b;
}
```
$2$ 發起的交易 , 跟 $1$ 的驗證是一樣的
所以最終 $1$ 和 $2$ 收到交易會變成
* node1
```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=green, fontcolor=green, fontsize=24, shape=box]
d[label="d" color=green, fontcolor=green, fontsize=24, shape=box]
a -> c;
b -> c;
a -> c;
b -> c;
e -> a;
e -> b;
d -> a;
d -> b;
}
```
* node2
```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=green, fontcolor=green, fontsize=24, shape=box]
d[label="d" color=green, fontcolor=green, fontsize=24, shape=box]
a -> c;
b -> c;
a -> c;
b -> c;
e -> a;
e -> b;
d -> a;
d -> b;
}
```
假設接下來 , $1$ 發起一筆交易 , 等$2$ 收到後 , $2$ 再發一筆交易
來看中間DAG的變化
* node1
```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=green, fontcolor=green, fontsize=24, shape=box]
f[label="f" color=green, fontcolor=green, fontsize=24, shape=box]
a -> c;
b -> c;
a -> c;
b -> c;
e -> a;
e -> b;
d -> a;
d -> b;
f -> e;
f -> e;
}
```
$1$ 新發起的交易 $\color{green}{f}$ 選 $e$
看 $2$ 收到後 , 選交易的情況
* node2
```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]
f[label="f" color=blue, fontcolor=blue, fontsize=24, shape=box]
g[label="g" color=green, fontcolor=green, fontsize=24, shape=box]
a -> c;
b -> c;
a -> c;
b -> c;
e -> a;
e -> b;
d -> a;
d -> b;
f -> e;
f -> e;
g -> f;
g -> d;
}
```
$2$ 發起的交易 $\color{green}{g}$ 選 $f$ 和 $d$
最終 , $1$ 和 $2$ 的DAG如下
* node1
```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]
f[label="f" color=blue, fontcolor=blue, fontsize=24, shape=box]
g[label="g" color=green, fontcolor=green, fontsize=24, shape=box]
a -> c;
b -> c;
a -> c;
b -> c;
e -> a;
e -> b;
d -> a;
d -> b;
f -> e;
f -> e;
g -> f;
g -> d;
}
```
* node2
```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]
f[label="f" color=blue, fontcolor=blue, fontsize=24, shape=box]
g[label="g" color=green, fontcolor=green, fontsize=24, shape=box]
a -> c;
b -> c;
a -> c;
b -> c;
e -> a;
e -> b;
d -> a;
d -> b;
f -> e;
f -> e;
g -> f;
g -> d;
}
```
從上面的模擬 , 就可以來討論下面兩個問題
## node發起交易 , 選取交易的DAG
上面的模擬 , 都是選當下DAG的tip
於是有個疑問
:::warning
如果不是依據最新收到交易所組成的DAG選取 , 那會發生什麼情況?
:::
### 對權重的影響
假設某個node目前收到交易所組成的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]
f[label="f" color=blue, fontcolor=blue, fontsize=24, shape=box]
g[label="g" color=green, fontcolor=green, fontsize=24, shape=box]
a -> c;
b -> c;
a -> c;
b -> c;
e -> a;
e -> b;
d -> a;
d -> b;
f -> e;
f -> e;
g -> f;
g -> d;
}
```
發起交易選tip的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]
a -> c;
b -> c;
a -> c;
b -> c;
e -> a;
e -> b;
d -> a;
d -> b;
}
```
如果只從上圖的 $e$ , $d$ 選的話
$f$ 和 $g$ 就不會累積權重
所以可以得到結論
:::success
選被驗證的交易 , 要從最新交易所組成的DAG選取
:::
### 對確認度的影響
## [一筆交易最終的權重增長](https://hackmd.io/s/Bk1vw3B8z)
## IRI發起交易選取驗證交易的現況
目前發起一次的買賣
是一個 $bundle$
$bundle$ 內有多個交易
同個 $bundle$ 內的交易 , 是由iota.lib.xxx之類的lib決定的
所以不是MCMC算法決定的
但是 , $bundle$ 內會有一筆交易
選取驗證交易是由node決定(command:getTransactionsToApprove)
那就是MCMC算法決定的
所以目前交易所選的驗證交易 , 是都有
不完全是MCMC算法決定
###### tags: `IOTA`