在進入選交易的算法前 , 要先討論交易的權重是如何變化的
注意到上面提到node讀的情況
我們想像DAG內有兩個衝突的交易a,b
目前a的權重最大
所以從node讀取會是a
blockchain需要有很難篡改的性質
所以如果在某個時間b的權重比a大
那就篡改了帳本
現在重點來了
選取交易的算法(被選到的交易會增加權重)
要能使一開始就是最大權重的交易 , 在往後任何時間都是最大的
另外 , 攻擊者可以發起對DAG上任意一筆與之衝突的交易
所以增加權重的算法 , 必須盡可能增加最多交易的權重
綜合上面所述 , 問題如下:
給定一個任意的DAG , 給定任意數量的新交易
這些新交易怎麼選 , 才能達到上面的目的?
所以接下來來考慮不同的交易情況 , 討論不同的選法
從簡單的情況開始討論
假設某個node的DAG如下圖
是最一開始的交易
就是白皮書中提到的
這邊給一下 的定義
交易沒有被其他交易指到
就是
我們假設每個交易的權重都是1
這樣 的權重是3
是2
是1
權重的計算是全部有驗證或間接驗證到該交易的加總
所以不會有一筆交易被算兩次
接下來的一段時間 , 來了新的一筆交易 , 並接到DAG上
那它可能有三種接法(以上圖為例)
算一下
這時
的權重是4
還是2
還是1
會發現 和 都沒增加
這時
的權重是4
是3
, 都是1
, 權重沒有增加
算一下權重
是4
是3
是2
只有 是1
這邊分成兩種 , 一個是其中一個指到不存在 , 另一個是都指到不存在
這邊要考慮指到不存在的交易的種類與新交易如何選的情況
所以例子比較多 , 比較複雜
先舉其中一種例子 , 觀察一下如何分析
藍色的 , 是node舊有的
紅色的 , 是其中一個指到不存在的交易
綠色是新來的交易
實際上仔細觀察會發現 , 這跟兩筆所驗證的交易都在DAG是相同權重增加的情況
差別在於 , 所指的不存在的交易 , 會不知道是什麼樣的交易 , 如果是衝突的會有問題
這邊新來交易驗證的選擇 , 共有三種
如下
藍色的 , 是舊有的交易
紅色的 , 是兩筆選的交易 , 都是不存在的交易
兩個是不在node的交易
綠色是發起的交易
可以看到 , 舊有的交易(藍色 , , )
都沒有增加到權重
藍色的 , 是舊有的交易
紅色的 , 是兩筆選的交易 , 都是不存在的交易
兩個是不在node的交易
綠色是發起的交易
可以看到除了綠色的交易 , 其他的交易都會增加權重 , 包含
藍色的 , 是舊有的交易
紅色的 , 是兩筆選的交易 , 都是不存在的交易
兩個是不在node的交易
綠色是發起的交易
只會剩下舊有的交易會增加權重
回想一下之前的假設:
從tangle選衝突內最大權重的交易
這句話意味著:
可能的話 , 加入的交易
權重都要隨著時間而增加
而且 , 可能的話 , 要比第二大衝突的交易增加更多
所以與第二大的權重差不能隨著時間縮小
那從上面的討論很容易看出 , 一個好的選tip算法 , 應該要有:
選接到DAG上的tip
可以使之前的交易增加權重
且大部份舊的交易都被增加到
不過 , DAG不一定都是很簡單
新來的交易選的被驗證交易 , 不一定是同一個
例如:
d選b和c
這樣a,b,c還是有被增加權重
可以這樣說
新交易有選到原本node DAG的tip
那就很容易大部份的交易權重都有增加
不過 , DAG不一定如上圖
比如說可以是
三個變化不多拉
看五個的
有點複雜
從上面的情況
目前大概可以肯定
選取被驗證交易的算法
要盡可能選DAG的tip
接下來
看另一種情況
可以看到 , 都是tip
就是
可是新的交易接到
, , , 都不會增加權重
所以到這邊 , 可以得到結論
選交易的算法 , 要選tip且要盡可能不選lazy tip
來看如果有衝突的交易
先講結論:
不用管
考慮一般情況的衝突示意圖
如下
是衝突的交易
是 或 沒有交易
可以看到新來的交易不管選哪個
的權重都會是最大的
不會出現 會是最大權重的情況
(在 有交集也成立)
所以 永遠替代不了
一樣先看簡單的
紅色的是衝突的交易 , 藍色是正常的交易
以上圖來說 , b與c是衝突的交易 , a是正常的
很明確的 , c往有向邊的方向搜尋 , 是找不到衝突的交易
b同樣也是
可是DAG內有衝突的交易
現在來看增加一筆新交易d的情況 , 只看接在tip的情況(接在比b,c前面不會增加b與c的權重,不考慮這種情況)
b的權重是2
c是1
b權重最大
b的權重是1
c的權重是2
c權重最大
c的權重是2
b也是2
b與c權重一樣大
恩 , 從上面的結果
什麼情況都有
代表這種類型的衝突交易很危險
容易被用來篡改帳本
選取被驗證交易的算法 , 要避免這種情況
由前面共識演算法的一致性
可以知道:
要讓衝突內最大權重的交易 , 一直是最大權重的
node沒發現DAG有衝突交易的話 , 那衝突的交易都可能增加權重
node發現有衝突的交易 , 選的交易會讓衝突交易中權重最大的交易增加權重
例如:
這是一個有衝突交易的DAG
藍色是正常的交易
紅色是衝突的交易
可以看到 是衝突交易內最大權重的
所以當node發現有衝突的交易時 , 是這樣選的
綠色的交易 , 是新發起的交易 , 選到d
這樣 的權重就增加
然後其他衝突交易的權重就沒有增加到
這樣帳本的紀錄就會是 , 跟沒有綠色交易的DAG一樣
有許多種情況 , 基本都要是有向邊搜尋不到的衝突交易
這裡距離是指沿著有向邊 , 找到相遇的交易後 , 共經歷過幾筆交易 , 例如:
假設DAG如下
以紅色的交易代表是衝突的交易
附近是這種情況
這樣就是比較近的交易 , 他們有 這筆相遇的交易
當然 , 這筆也是
可能會有多個 , 看最少那個 , 這個是距離1的
來看相較比較遠的
會是相遇的 , 距離是3
中間經過 , 和
分三種 , 附近 , 附近 , 不是 附近
就是衝突交易其中一筆 , 是
例如
或
就是上面
應該選 , 盡可能不選
所說的
或
基本上是一種
隨著時間過去 , 如果沒node發現的話
會變成類似下圖的情況
這邊假設檢查衝突交易是在選被驗證交易算法中隨機檢查
嚴格來說 , 檢查交易與選被驗證交易是可以分開的兩件事
但是以官方release的資料來看 , 是一起做的
在選被驗證交易時檢查交易
以其中一張有衝突交易的圖為例
是發現 , 是衝突的交易
可是 和 卻沒發現
這跟如何檢查交易是有關係的
一筆交易檢查交易 , 是沿著DAG邊的方向去檢查的
例如 可能會檢查 , , , 和
當然可以檢查更深入的交易 , 例如 與
不過不必要檢查太深的 , 例如
因為已經有許多交易檢查過了
所以 會發現有衝突的交易
但是在 所檢查過的交易 , 並沒有與 衝突的
所以選擇 作為 被驗證的交易是可以的
同樣的情況 , 也是
所以 才能發現
因為 是選 和 , 所以會發現 與 是衝突的
那就不能選 與 , 其中一個要換掉
這蠻多的 , 衝突交易不是 的都是(包含 )
如下的DAG , MCMC不容易發現衝突交易
IOTA