一個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`