Something on NGIN: 一些隨筆
隨意地記錄一些NGIN上的一些思考
28 April 2020 爲什麽選擇不添加TD(Toatl Difficulty)?
本來是打算加的,因爲有如下好處
- 藉鑒ETH的sync
- 讓同一時間收到的Block之間有不同的rank, 方便node決定fork方向
但是後來取消了,選擇了不添加TD,只使用Diff(target)
- 無法排查Block的内部TD錯誤
- 需要修改難度算法。因爲當前Block難度是在一個checkround中不變的,TD決定rank的特性毫無意義。
- Block的獨立性。這個是一直在爭取的東西,可以讓整個架構更可插拔,方便拓展。Diff的關聯已經和上一區塊過於緊密了。在不改變算法的情況下要使得rank不同就需要使用由nonce決定的ActualDiff,而每次ActualDiff實際上都是在re-hash,對PoW算法要求高。而NGIN本來就是CPU算法,不應當采取這樣的機制。
- Sync還不完善。Sync機制還是殘廢狀態,不應該開始考慮調優
- rank應該能有別的替代品: UnixNano, len(txs) …
28 April 2020 Sync機制?
P2P_protocol-v0.0.1下NGIN的Sync機制比較殘廢,是直接不停地pingpong來獲取Wired Node的狀態(最高高度)來確認自己是不是out of date.
這裏先簡單説一下其他區塊鏈網絡的Sync機制
- Bitcoin
BTC的Sync機制是發一個hash_stop=0(即取盡可能多)的getheaders/getblocks,讓remoteNode傳回一份Inv也就是庫存清單,localNode就check了一眼這個清單,對自己沒的Block發getdata
- Ethereum
ETH有倆種Sync,一個是Block的,一個是State也就是合約狀態的
這裏就講下Block的。
ETH在連接建立之後就會優先交換一個Status message,裏面就包括了bestHash,前面說的TD,還有一些區別forknet的字段。
然後localNode一看我自家的TD不如別家啊,然後,就會發個GetBlockHeaders請求,認證了PoW信息之後再通過GetBlockBodies把内容也取來,之後就存(執行)起來。
因爲Discovery是利用libp2p的kaddht實現,Broadcast機制也已經用libp2p的pubsub給實現了,所以NGIN天生就和上面的不一樣……
當然還有ipfs自己在用的raft
雖然這個raft庫不能用,也不能從ipfs的改,但是一些架構可以參考
比如,這個consensus是建立在p2p的上層
這就很顛覆了……
= =這樣咋收response
!!!
哦對哦
這個Wired又不是broadcast要register!我返回stream然後做個阻塞讀不就好了!
參考prysm
媽的,被libp2p的example帶跑了……
看了下prysm的sync,看來他們對initial sync也花了不少心思……居然還有個old……
orphan
因爲上綫了測試網,因此p2p上很多問題就暴露出來了,其中最嚴重的是由於BlockTime過短導致的分叉。
查了很多遍"prevent/avoid fork"都沒結果,現在在看DAG方案時候才發現人家管這個問題叫orphan block…
大概是手上沒有算力的情況分叉的確就孤兒了……
eth的思路是uncle block,形象一点就是把敌人化为己用,就把uncle的header和hash保存进Block的uncle字段里。
如果分叉节点收到这个带uncle的Block广播就知道了自己手里拿着的这个Block是没用的,它就会“从良”回到这个主线上。
NGIN没有这个设计,因为我觉得uncle信息是冗余的,而且真的作为10s的blockTime要叉出去也很难直接救回来
所以在NGIN裏只有强制fork的情況,儅遠程節點比本機高出數個blockCheckRound的時候就會觸發
爲了防止惡意擡高區塊高度來强制fork,我們需要給這個機制加一個cap。換句話説就是對於離綫過久切分叉太遠的直接孤立隔離,避免其污染網絡
quill
在对错误处理升级的时候突然萌生了使用子协议来对tx进行操作的想法。暂时把这个协议称为quill(羽毛笔)。
现在tx的种类众多,却只是通过switch来将他们发到各个handler上进行验证或是处理。
现在我们希望能把contract相关的tx(append,delete,以及未来的lock,unlock)通过quill来进行整合,
即,使用quill来解析extra内容。看起来就应该像是在用tx操作一个quill(羽毛笔)在contract上写内容。
除了负责这些基本操作以外,quill也应当负责保证accounts的一致性。
和raft,paxos这些算法不同,quill是一个针对PoW环境的一致性算法,即记账人已经确定。