本文由幣乎社區(qū)(bihu.com)內(nèi)容支持計劃贊助
在看本文前,最好先了解區(qū)塊鏈相關概念:比特幣潭辈,以太坊鸯屿,錢包,智能合約把敢,秘鑰等
應用程序的確定性并行執(zhí)行
相信你和我一樣寄摆,剛開始看這個標題的時候有點懵逼,這講的啥意思呀修赞?后來我查閱了許多資料以及他人的分析婶恼,這才有點理解其中的意思,下面我來說說我是怎么理解的柏副。首先勾邦,我把這個標題分解成3個:應用程序、確定性割择、并行執(zhí)行眷篇,分解后就明了了,我知道應用程序是什么荔泳,但是不知道它說的確定性和并行執(zhí)行是什么意思蕉饼。于是,就需要查詢確定性和并行執(zhí)行玛歌,得出的結(jié)果是:
并行執(zhí)行:同時獨立地安裝和使用程序集的多個版本的能力昧港。并行執(zhí)行可以應用于應用程序和組件以及 .NET Framework。允許多個程序集在同一臺計算機上共存和同時執(zhí)行支子,對于支持公共語言運行庫中可靠的版本控制至關重要慨飘。--百度百科
簡單的說就是,多個程序可以同時執(zhí)行译荞。
確定性并行執(zhí)行: 由于執(zhí)行個體之間的同步瓤的、競爭和干擾,并行程序的執(zhí)行存在著不確定性問題吞歼,即程序在相同輸入下多次執(zhí)行可能得到不同的結(jié)果圈膏。不確定性給并行程序在開發(fā)、調(diào)試篙骡、測試稽坤、容錯和安全等方面都帶來了挑戰(zhàn)丈甸,嚴重降低了并行程序的可靠性,阻礙了并行程序的發(fā)展尿褪。確定性并行技術通過控制并行程序執(zhí)行個體間的同步睦擂、競爭和干擾,使程序的執(zhí)行結(jié)果僅依賴于輸入杖玲。確定性并行技術能夠從根本上解決了目前并行程序存在的諸多問題顿仇,提升了并行程序的可靠性,給并行程序的發(fā)展帶來了新的機遇。
結(jié)合并行執(zhí)行可以這樣理解摆马,要使多個程序同時執(zhí)行臼闻,并且能更穩(wěn)更安全的執(zhí)行,就需要用到確定性并行技術囤采,理解了嗎述呐?
EOS中也運用了這樣的技術,在白皮書中是這樣說的:
- 區(qū)塊鏈共識取決于確定性(可重現(xiàn))的行為蕉毯。
1.意味著所有的并行程序都不能是“不確定”的乓搬,例如互斥或加鎖是不確定的,就不能用代虾。
2.沒有鎖进肯,就需要一些方法來保證所有賬戶只能讀寫自己的私有數(shù)據(jù)庫
3.所以每個賬戶都必須按照順序處理消息,EOS的并行性在賬戶級別褐着。 - EOS將消息傳遞到獨立的線程中
1.判斷并行的可能性
2.每個賬戶的狀態(tài)只取決于傳遞給它們的消息
3.進度表,我這里理解成消息的執(zhí)行順序托呕,這個順序在區(qū)塊產(chǎn)生后是確定的含蓉,而在產(chǎn)生過程中是不確定的,是由區(qū)塊生產(chǎn)者按照并行算法決定项郊。 - 當腳本生成新消息時馅扣,他不會立即發(fā)送,而是被安排在下一個周期着降。因為接收方可能會在另一個線程中主動修改自己的狀態(tài)差油。
通信延遲優(yōu)化
通常一個賬戶方一條消息到另外一個賬戶,并不是立即就能收到的任洞,其中需要一定的時間蓄喇,這個時間就叫做延遲時間。EOS不希望有這個延遲時間存在交掏,他希望能夠在一個區(qū)塊內(nèi)來回交換消息妆偏。他是怎么做的呢?
EOS將區(qū)塊分成了幾個循環(huán)盅弛,循環(huán)又分成了多個線程钱骂,每個線程包含一個交易列表叔锐,每個交易包含一組要傳遞的消息。這個結(jié)構可以看成為一棵樹见秽,在這個樹中交替的層被順序的并行的處理愉烙,我們看下面這張圖
在一個循環(huán)中生成的交易可以在后續(xù)的任何一個循環(huán)或者區(qū)塊中被發(fā)送。 區(qū)塊生產(chǎn)者會持續(xù)不斷的向區(qū)塊中添加循環(huán)直到最大的墻上時間到了或者沒有更多的新交易要發(fā)送解取。
可以對一個區(qū)塊使用靜態(tài)分析來驗證同一個循環(huán)內(nèi)不存在兩個線程包含同一帳戶下對交易的變更步责。 只要保持不變一個區(qū)塊就可以并行的運行所有的線程。
有點繞肮蛹,其實可以這樣理解勺择,以上做法都是為了讓賬戶和賬戶之間通信更快更及時。
只讀消息處理
只讀消息的處理伦忠,EOS對于無需更新狀態(tài)的消息處理是可以并行的省核,只要特定的只讀消息處理程序被包含在特定的循環(huán)內(nèi)的一個或多個線程中就可以。
多賬戶原子交易
有時我們需要確保消息自動的被多個賬戶傳遞和接收(原子性操作)昆码。 在這種情況下气忠,消息會被放在同一個交易內(nèi),賬戶會被分配到同一個線程赋咽,并且消息被順序的添加旧噪。 這種情況對性能是不理想的,當用戶使用涉及到“賬單”時脓匿,他們將在交易內(nèi)以賬戶唯一索引被列入其中(為了確保交易成功)淘钟。
但是,基于性能和成本原因最好減少涉及兩個或多個重度帳戶的原子性操作陪毡。
部分區(qū)塊鏈狀態(tài)的評估(組件化,模塊化的判斷)
1.大規(guī)模的區(qū)塊鏈技術組件應該是模塊化的
- 每個人都不應該運行所有的東西,特別是他們只需要運行一個小應用時
- 例如慧耍,一個交易所的應用,只需要向用戶展示交易狀態(tài)师枣,而不需要與其他應用程序(社交媒體或其他)有狀態(tài)關聯(lián)洗贰。
2.EOS允許完整節(jié)點選擇要運行的任何程序子集
- 傳遞給其他應用的消息可以被安全的忽略掉敛滋,因為應用程序的狀態(tài)完全由傳遞給它的消息派生绎晃。
- 這與其他帳戶的溝通有一些重要的影響擎勘。 最重要的是棚饵,不能假定其他帳戶的狀態(tài)可以在同一臺機器上訪問硼砰。 這也意味著题翰,雖然很容易啟用“鎖”來允許一個帳戶同步調(diào)用另一個帳戶,如果其他帳戶不駐留在內(nèi)存中桅咆,這種設計模式就會出現(xiàn)問題荚虚。
- 所有賬戶帳戶間的狀態(tài)通信必須通過包含在區(qū)塊鏈中的消息進行版述。
自主最優(yōu)任務安排
1.EOS系統(tǒng)不能強制阻止區(qū)塊生成這向其他賬戶發(fā)送的任何消息
2.每個區(qū)塊生產(chǎn)者都可以根據(jù)處理交易所需的計算復雜性和時間做出自己的主觀預測晚伙。
3.在網(wǎng)絡層面上,所有的交易都會收取一個固定的計算帶寬成本午磁,區(qū)塊生產(chǎn)者也可以使用自己的算法來測量資源的使用衙熔。
4.一般來說青责,只要一個區(qū)塊生產(chǎn)者認為一個交易是有效的扁耐,并且所消耗的資源是可控的构蹬,那么所有的其他區(qū)塊生產(chǎn)者也會接受俗壹,但是交易可能需要最長1分鐘才能找到生產(chǎn)者怖亭。為什么是一分鐘期吓,因為一分鐘內(nèi)交易可以在21個區(qū)塊生產(chǎn)者之間流轉(zhuǎn)一遍,如果還沒有找到,那么這個交易就不會被打包了。
5.這種對計算割捅、資源成本的主觀評估將使區(qū)塊鏈不必精確地去度量運行一個任務需要多長時間奶躯。有了這個設計,就不需要精確地數(shù)指令亿驾,這將極大地增加優(yōu)化的機會嘹黔,而不會打破“共識”。
配合學習筆記系列文章一起讀會更好理解哦
上一篇:EOS技術白皮書學習筆記(二)- 賬戶系統(tǒng)
下一篇:EOS技術白皮書學習筆記(四) - 令牌模型和資源使用
本文首發(fā)于微信公眾號:lin-mingtan 歡迎關注交流 .