|
Algorand是權(quán)益證明(POS)的一個(gè)升級(jí),徹底消除區(qū)塊鏈分叉的可能性,可以在一小段時(shí)間內(nèi)確認(rèn)交易,Algorand的核心使用稱為BA?的拜占庭協(xié)議,同時(shí)擴(kuò)展到許多用戶。即使一些用戶是惡意的,網(wǎng)絡(luò)被臨時(shí)分區(qū),Algorand也確保用戶從未對(duì)已確認(rèn)的交易有不同意見。在Algorand的BA?協(xié)議中,除了私鑰之外,用戶不會(huì)保留任何私有狀態(tài)。 兩種共識(shí): 最終共識(shí): BA?()將不會(huì)在這一輪的任何其他塊達(dá)成共識(shí)。 暫定共識(shí):其他用戶可能已經(jīng)在不同的塊上達(dá)成了暫定共識(shí)(只要沒有用戶達(dá)成最終的共識(shí))。 這個(gè)算法每一輪的總流程,分為兩個(gè)大部分——塊提議和BA?。塊提議中首先在普通用戶中通過加密抽簽選擇出這一輪的委員會(huì)成員(委員會(huì)成員會(huì)在每一輪通訊進(jìn)行替換),然后在委員會(huì)成員中再次通過加密抽簽選擇出這一輪的提議者,每個(gè)提議者提議一個(gè)塊。然后連同哈希和證明(一種隨機(jī)號(hào)碼,數(shù)字簽名可以很容易對(duì)其進(jìn)行驗(yàn)證)一起傳播到網(wǎng)絡(luò)上。之后,這一輪的所有委員會(huì)成員接到消息后,通過BA?協(xié)議對(duì)塊達(dá)成共識(shí)(暫定或最終共識(shí))。如果這一輪是暫定共識(shí),則只有在當(dāng)后續(xù)塊(后幾輪的塊)有達(dá)成最終共識(shí)的情況下才能確認(rèn)前幾輪的暫定共識(shí)塊。 加密抽簽。用來創(chuàng)建和驗(yàn)證區(qū)塊鏈(如若是在一個(gè)擁有數(shù)百萬用戶的系統(tǒng)中,那么參與者的數(shù)量可能達(dá)到數(shù)千人)。這種抽簽的方法基于前一個(gè)區(qū)塊,選擇過程是自動(dòng)并且完全隨機(jī)的。用戶被選中的概率基于他的權(quán)重。關(guān)鍵技術(shù)是使用可驗(yàn)證的隨機(jī)函數(shù)(VRFs),以私人和非交互方式隨機(jī)選擇用戶。允許用戶私下檢查是否被選擇參與拜占庭協(xié)議。 每個(gè)用戶在每一輪都要進(jìn)行加密抽簽。在輸入字符串(種子+角色)上,VRFsk返回兩個(gè)值:散列和證明。然后用為該角色選擇的用戶的預(yù)期數(shù)量τ除上所有用戶的權(quán)重和,得到一個(gè)概率p。j參數(shù)表示此用戶被選擇了多少次。 被選擇j次意味著用戶以j個(gè)不同的“子用戶”的身份參與。一開始j初始化為0,然后循環(huán)確定此用戶的多少子用戶被選擇,抽簽算法將區(qū)間[0,1)劃分為連續(xù)區(qū)間的形式,如果hash / 2hashlen(其中hashlen是散列的比特長度)屬于間隔,則用戶恰好具有j個(gè)選定的子用戶。 要進(jìn)行加密抽簽就要先獲得本輪的種子seed。每一輪都會(huì)產(chǎn)生一個(gè)新的種子。假設(shè)現(xiàn)在為第r輪,在r輪的塊提議期間,通過這個(gè)公式,為第r+1輪塊提議計(jì)算種子seed r+1。這個(gè)種子(和相應(yīng)的VRF證明π)被包含在每個(gè)提出的塊中,所以一旦Algorand在r輪的塊上達(dá)成一致,在r+1輪開始時(shí),每個(gè)人都知道seed r+1。 如果塊不包含有效的種子(例如,因?yàn)樵搲K是由惡意用戶提出的并且包括無效的交易),則用戶將整個(gè)提出的塊看作是空的,并且使用這個(gè)公式來計(jì)算第r輪的相關(guān)種子。引導(dǎo)種子選擇的seed0的值可以在算法一開始時(shí)通過初始參與者(在聲明他們的公鑰之后)用分布式隨機(jī)數(shù)隨機(jī)選擇生成。 由第一個(gè)公式可知,在選擇第r+1輪的種子之前要選擇每個(gè)用戶的密鑰sk u(r輪使用的)。塊提議。抽簽確保隨機(jī)選擇一小部分用戶,并通過其權(quán)重為每個(gè)所選用戶提供優(yōu)先級(jí),可以在用戶之間進(jìn)行比較。由于抽簽是隨機(jī)的,所以可能會(huì)有多個(gè)子用戶選擇提出塊,用戶通過比較子用戶優(yōu)先級(jí),采用有最高優(yōu)先級(jí)的子用戶的那個(gè)塊,子用戶的最高優(yōu)先級(jí)是塊的優(yōu)先級(jí)。 然后用戶通過網(wǎng)絡(luò)傳播這個(gè)塊,以及其優(yōu)先級(jí)和證明。其他用戶等待一定的時(shí)間來接收塊。如果用戶沒有收到塊提議,則會(huì)用空白塊初始化BA?。 拜占庭協(xié)議BA?:確保區(qū)塊鏈不會(huì)分叉。塊提議不保證所有用戶都收到相同的塊。為了在一個(gè)單獨(dú)的塊上達(dá)成共識(shí),Algorand使用BA?。每個(gè)用戶使用他們接收的最高優(yōu)先級(jí)塊初始化BA?。 BA?的執(zhí)行由兩個(gè)階段組成。第一階段,將在任意一個(gè)塊的散列上達(dá)成一致的問題轉(zhuǎn)換為在兩個(gè)值達(dá)成一致,這兩個(gè)值是特定建議的塊散列,或者是空塊的散列。 程序里是用Reduction這個(gè)函數(shù)。在第二階段,BA?就這些選擇之一達(dá)成一致:要么同意一個(gè)建議的區(qū)塊,要么同意一個(gè)空的區(qū)塊。程序里是用BinaryBA?這個(gè)函數(shù)。 首先Reduction這個(gè)函數(shù),主要分為兩步,step1,每個(gè)委員會(huì)成員對(duì)由BA? main函數(shù)傳遞給Reduction()的塊的散列進(jìn)行投票。Step2,委員會(huì)成員對(duì)第一步至少得到T·τ票的散列進(jìn)行投票,或者如果沒有散列得到足夠的票數(shù),則默認(rèn)空塊的散列。 Reduce()確保至多有一個(gè)非空塊可以被Reduce()返回給所有誠實(shí)用戶。 這里的投票是有兩個(gè)主要函數(shù)——發(fā)送選票和計(jì)票。 發(fā)送選票函數(shù),檢查在給定的輪和步驟中用戶是否被選擇為委員會(huì)成員,這一步用之前的加密抽簽函數(shù)實(shí)現(xiàn)。如果被選中,則用戶就會(huì)傳播一個(gè)包含值(要投給的塊的哈希)的簽名消息傳遞。 計(jì)票函數(shù),從這個(gè)緩沖區(qū)中讀取屬于當(dāng)前輪和步驟的消息。它通過調(diào)用每個(gè)消息的這個(gè)函數(shù)來處理投票, 這個(gè)函數(shù)是用來確保投票的有效性的,它不僅返回消息中包含的值,還返回與該值關(guān)聯(lián)的投票數(shù)。在計(jì)票函數(shù)while循環(huán)里,只要一個(gè)值超過T·τ票,就會(huì)返回該值。如果在分配的λ時(shí)間窗口內(nèi)沒有收到足夠的消息,則會(huì)產(chǎn)生超時(shí)并返回TIMEOUT。 第二階段,BinaryBA?這個(gè)函數(shù)。前面說了,是二選一。每個(gè)委員會(huì)成員都為一個(gè)值投了一票,所有的用戶都對(duì)票數(shù)進(jìn)行統(tǒng)計(jì)。在BinaryBA?()的每個(gè)步驟中,如果一個(gè)用戶看到了某個(gè)值超過了T·τ票,那么在下一步中將投票給相同的值。 然而,如果沒有任何值獲得足夠的選票,BinaryBA?()選擇下一個(gè)投票。 在一般情況下,當(dāng)網(wǎng)絡(luò)強(qiáng)同步且塊提議者是誠實(shí)時(shí),BinaryBA?()將為大多數(shù)用戶啟動(dòng)相同的block_hash,并將在第一步達(dá)成共識(shí),因?yàn)榇蠖鄶?shù)委員會(huì)成員為相同 block_hash值投票。程序里有顯示。 如果網(wǎng)絡(luò)不是強(qiáng)同步的,BinaryBA?()可能在兩個(gè)不同的塊上返回共識(shí)?!纠?,假設(shè)在BinaryBA?()的第一步中,所有的用戶投票給block_hash,但是只有一個(gè)誠實(shí)的用戶A接收這些投票。 在這種情況下,A將在block_hash上返回共識(shí),但所有其他用戶將轉(zhuǎn)到下一步。 現(xiàn)在,其他用戶再次給block_hash投票,因?yàn)镃ountVotes()返回TIMEOUT。 但是,讓我們假設(shè)網(wǎng)絡(luò)將所有這些投票放棄。 最后,用戶在第三步給投票empty_hash,網(wǎng)絡(luò)表現(xiàn)良好,所有投票都被傳遞。 因此,用戶將繼續(xù)投票給empty_hash,直到下一個(gè)迭代循環(huán),此時(shí)他們在empty_hash上達(dá)成共識(shí)?!客ㄟ^引入最終和暫定共識(shí)的概念來解決這個(gè)問題。BA?算法main函數(shù)最后是判斷建立的是最終共識(shí)還是暫定共識(shí)。 |
|
|