分散式系統最重要的部分是其共識層。但是,“共識”是什麼意思?根據定義,它是一個群體作為一個整體所達成的意見或立場。這可能意味著大多數相關人員達成一致或作出判斷。共識協議通常可以被認為具有:提出建議的一組支持者。將建議標記為有效的一組測試。對每一項提案投票的一組選民。決定一項提案是否被接受或否決的投票機制。當做出決定時觸發的一組動作。投票機制可以:制定關於誰可以投票以及投票人是否需要透過知識考試的規則。有計算每次投票權重的演算法。設定投票分數或時間閾值以觸發投票後或投票操作期間。形式化:我們有一個共識功能,輸入引數:提案、投票機制、時間戳的投票分數、投票池。輸出將是時間戳時的決策快照:根據所使用的投票機制和截至該時間點的投票資料,在某個時間點是否認為該提案已被接受。投票池是有投票權的選民總數,不管他們是否投票。function Consensus( Proposal proposal, VotingMechanism mechanism, address[] votingPool, VotingScore voting_score_at_timestamp) public returns (Decision decision);共識引擎以太坊目前使用工作證明作為其共識協議。我們將簡要介紹一下它是如何工作的。第一階段本身可以被視為共識協議:使用者可以提出實際上是鏈狀態轉換的事務。他們使用自己的以太坊客戶機將事務新增到事務佇列中,並進一步傳播到其連線的對等機。這些對等機遵循相同的流程,事務最終到達也可以挖掘事務的以太坊客戶機。此時,每個礦工都像一個“選民”,決定是否要將事務包含在下一個塊中。他們有自己的投票機制,基於相關的天然氣價格和交易的天然氣成本。他們還需要透過一個硬密碼測試,以便有權提出塊。決策是事務陣列的形式,可以組成下一個塊。第二階段是客戶就哪些鏈版本應該用塊進一步擴充套件達成共識。礦工提議塊,並且由於網路傳播延遲,多個鏈叉同時共存。根據以太坊目前使用的貪婪最重要觀察子樹(GHOST)協議,每個客戶端節點“投票”選擇哪個fork為有效。但以太坊擁有圖靈完全表現力,這意味著它可以成為建立更高層次共識的平臺。Boolean布林共識引擎在以下部分中,我們將僅探討布林值決策(類似於二元共識)。 意思是選民可以為提案指定false或true。為了建立一個通用的(基於布林的)共識協議,應該考慮對以下方面進行細粒度投票:· 函式執行· 資料型別· 資料型別和記錄· 地址· 許可權混合共識記憶化(Consensus Memoization)共識意味著一群人在某件事上達成一致。為了使其有效,必須登記商定的結果。為了避免一次又一次地經歷投票過程,必須把它記下來。共識結果可以作為決策、許可權和宣告儲存在鏈上。有關結果的其他資訊也可以附加-例如,新增包含投票統計和資料的檔案的swarm雜湊。我們可以進一步說,投票過程可以是持續的(在鏈上或鏈下)-如果觀點或假設發生改變,人們可以改變他們的想法。因此,許可權可以看作是某個時間點的記憶化結果。函式執行許可權此類許可權不限於對誰(EOA)以及哪些合同可以執行單個合同函式的共識:還可以具有控制哪些函式可以呼叫/執行給定函式的許可權。您還可以定義具有相似型別許可權的函式類。例如,update()和remove()函式可能具有相同的許可權,基於insert()的執行程式。如果您想在以太坊之上構建可互操作的共識引擎,您可能希望區分EVM和非EVM環境。想象一下,你想在EVM協議中使用一個函式:這樣的函式需要是公開的。但是,您可能不希望從非EVM環境呼叫此函式 - 例如來自JavaScript dapp。資料型別和記錄的許可權想象一下用於身份的共識協議:使用者可能決定將CRUD許可權透過一種身份資料型別提供給某個受信任的第三方。一個這樣的第三方能夠僅驗證使用者身份的一部分並代表使用者在鏈上進行管理。第二個可以管理另一個身份資料型別。考慮Twitter將使用者控制代碼證明附加到使用者的身份合同或附加標識雜湊的管理實體。因此,您可以對資料型別和資料記錄本身具有細粒度的許可權。地址許可權這種許可可以被認為是基於角色的訪問控制機制。乙太網地址(EOA或合同)可以由具有更高許可權的另一個地址授予許可權,從而在層次結構中提供進一步的許可權。許可權混合可以組合上述許可權型別。例如,您可以僅授予以太坊地址更新特定資料型別的資料記錄屬性值的許可權,而不允許它更新其他屬性或刪除該記錄。宣告以下是一些生明的例子:· 使用者有權成為協議更改的技術審閱者。· 使用者年齡超過18歲,因此法律允許使用服務。· 透過投票過程,使用者可以獲得一定的地位、角色,甚至對數字商品的所有權。宣告是對這一結果的永久記錄。布林共識運算讓我們假設我們有一些已建立的許可權。 我們可以透過對現有許可權的布林運算達成共識來定義其他許可權。例如,Bob希望在公共檔案系統資料夾中進行更改。他想把一個檔案從那個資料夾移到另一個資料夾中。系統需要檢查Bob對該檔案的許可權、更改父資料夾的檔案更新功能、當前父資料夾及其刪除子檔案的更新功能、新資料夾及其新增子檔案的更新功能。僅當聚合許可權的最終結果為真時,才允許Bob移動該檔案。計算Bob是否可以移動檔案所需的布林操作序列可以透過提議和投票來完成。一旦序列被接受,任何想要使用它的人都可以使用它。元共識:共識鏈我們已經談到了一些拼圖。拼圖本身就是一個普遍的共識引擎。一種協議,允許您透過使用自己來建立其他共識協議,以便就新協議的設計達成共識。流程如下:Alice提出了一個新的投票機制並將其提交到鏈上(該機制本身甚至可以包含指向swarm儲存指令碼檔案的指標)。Alice無權將投票機制直接新增到協議中。因此,系統宣佈提交併建立新的投票資源。人們現在可以討論和投票(在鏈上或鏈下)。開發人員可以以提交的形式在這個新機制上執行測試。如果投票成功,Alice的投票機制可以完全註冊到協議中,並且Alice可以自動被授予一些新的許可權 - 例如“機制更新評審員”。等等。這是對未來共識的共識。這是到目前為止所描述的依賴圖。
事實上的共識和意見上的共識是不同的。對意見的共識存在易變性和侵蝕性。
雖然事實上的共識也可以(至少部分)以程式方式達成,但意見上的共識可能需要一個靈活的允許/不允許協議,該協議可以連續執行。因此,生命週期可以是:
· 創造性
· 突變性
· 腐蝕性
我已經提到了許可權的使用壽命是有限的,從這個意義上說,如果正在進行的投票結果發生變化,它們就可以被更改。
從道德的角度來看,任何需要共識的事情都應該作為一個連續的投票過程來執行。人們應該能夠隨時撤回對某個想法的支援。只有在以下情況下,系統才能民主和道德:
· 任何人都可以提出改變並開始投票過程。
· 任何先前批准的改革都可以透過投票(背景改變,新選民湧入,老選民消失等)來恢復。
對協議實施連續投票:
· 人們可以提交一個包含所有原始碼和測試和審計所需資訊的協議更改。
· 已啟用對協議更改的投票。
· 如果達到正閾值投票分數,則自動接受更改。
· 投票可以繼續,如果達到負投票分數,更改將自動再次禁用。
· 此時,可以繼續投票,也可以提出一項取消提議變更的建議。
· 可以有一組自動測試,這些測試可以在提議的更改上執行,如果測試不透過,則可以標記提案並暫停投票。這可以透過分散式的協議來實現無信任的計算。
結論
今天我們只探索了在以太坊上使用二元共識的方法。有更多型別的共識可以探索。
從這方面來看,以太坊共識引擎有很大的增長和發展空間。 我們正處於探索不同型別共識可以實現的初期階段。 複雜的共識行動將擴大並開闢新的發現視野。