我對共識演算法的看法與假設 === 共識演算法本質是一個分散式系統的演算法 所以有些關於分散式系統的知識必須先知道 從系統的實做上 , 可以知道下列事實 :::info 要求越強的一致性 , 效能越差 ::: 先回答幾個問題 * 共識演算法要求的一致性 , 是什麼一致性? :::success 如果一筆交易,在某個node是最大的權重 過一段時間後 , 在全部的node,也會是最大的權重(不考慮斷線) ::: 講的更白話點 :::success 帳本有address餘額是負數 , 選衝突交易內最大權重 任意兩個node , 交易都是最大權重 並不代表最大權重的交易 , 權重一樣 所以 node是可以有很鬆的一致性 甚至資料完全不一致也沒差 0元交易的數量 , 各node不同 不是0元的, 大家都有 , 然後衝突內最大權重是一樣的交易 這樣就可以了 ::: * 白皮書內提到的tangle , 是一個node有的還是多個node有的? 個人以為,只有單一node # 系統運作 分散式帳本 , 可以想到就是可以讀取與寫入 ## node的讀 目前推測是選權重最大的交易 , 在DB所組成的DAG內 tangle內部可以有互相衝突的交易 ## node的寫(接收別的node或自己發起的交易) node發起新的交易與接收別node廣播的交易 都會做些檢查後 , 放入database 且不會刪除 , 直到node做快照(snapshot)後 , 才會把舊的交易清除 ### node接收交易的情況 新接收的交易 , 都有紀錄選取那兩筆交易的紀錄 所以可以分為: #### 兩筆選取的交易都在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=Blue, fontcolor=blue, fontsize=24, shape=box]; e[label="e" color=Black, fontcolor=black, fontsize=24, shape=box]; a -> b; b -> c; a -> b; b -> c; d -> b; d -> c; e -> d; e -> a; } ``` 藍色的 , 都是原本node有的交易 黑色的 , 是node剛接收的交易 #### 其中一筆在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=Blue, fontcolor=blue, fontsize=24, shape=box]; e[label="e" color=Black, fontcolor=black, fontsize=24, shape=box]; a -> b; b -> c; a -> b; b -> c; d -> b; d -> c; e -> a; e -> f; } ``` 藍色的 , 是原本node有的交易 黑色e , 是node接收新來的交易 黑色f , 這交易不在node裡面 至於這樣情況可能的原因 , 見node網路拓樸的討論 #### 兩筆都不在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=Blue, fontcolor=blue, fontsize=24, shape=box]; e[label="e" color=Black, fontcolor=black, fontsize=24, shape=box]; a -> b; b -> c; a -> b; b -> c; d -> b; d -> c; e -> f; e -> g; } ``` 藍色的 , 是node原來有的交易 黑色e , 是node接受新來的交易 f和g , 是不在node的DB內有的交易 可能的原因 , 見node網路拓樸的討論 #### node接收交易的條件 node要不要接收一個交易放入到node本身的DAG , 有許多考量 ### node綜述 由以上的猜測 可以想像 網路上某個node上的tangle 可以有自己發起的交易 , 別人送的交易 , 有衝突的交易 tangle的有向邊 可以是自己node所選的驗證 , 也可以是別的node所選的驗證 ## node發起交易 白皮書的過程是這樣的 ``` 1.選兩筆舊的交易 2.檢查有無衝突 3.做一次工作量證明(找出特定格式的hash value) 4.發送給其他node ``` 可是再看過整個白皮書 個人以為是這樣的 ``` 1.檢查舊tangle , 有無自己發送的交易變成懶惰的tip(白皮書內有說明) 接下來分兩種情況 2.有的話,直接選擇驗證就是那個自己發起的懶惰的tip 3.做工作量證明 4.發送新交易給其他node 接下來是沒有的情況,就如同白皮書所寫的 2.沒有的話,選兩筆交易 3.檢查有無衝突 4.做工作量證明 5.發送新交易給其他node ``` 當然 , 上面的新交易 , 也會加入發起交易的node的tangle裡面 # 一筆交易在node的生命週期 先從 $Pending$ 開始 然後 $Confirmation$ 最後 $Local \space Snapshot$ 清掉 ## Pending $Pending$ 的交易不會拿來算帳 所以亂七八糟都沒關係 但會有衝突的交易 , 需要檢查出來 至於發現後如何處理 , 目前有許多想法 , 不肯定如何實做 基本上是一定要孤立一些交易(不增加權重) ## Confirmation(確認) 只有確認的交易 , 才能拿來算帳 所以這邊必須找出衝突的交易 , 而且要讓最大權重的交易維持最大權重 另外 , 依照本人的看法 一筆交易是確認 , 可由賣家定義確認的門檻 ## Local Snapshot 因為要用在IoT上 我們知道IoT的裝置 硬體資源很受限 , 所以對於帳本來說 , 真的無法存全部的交易 , 所以需要做清除交易的工作 原則上 , 這是各node自行決定的 當然也會有安全的問題 目前還沒仔細分析 , 只有一些想法 [12/18會議補充 關於swarm node的討論](https://hackmd.io/s/SJcu6eLmz) 另外 , 由於交易會被刪除 , 所以node網路需要有node是負責存全部曾經出現過的交易