正文

eip-eipril動畫官網(wǎng)

xinfeng335
文章最后更新時間2025年02月08日,若文章內(nèi)容或圖片失效,請留言反饋!

  在過去十年中eip,諸如Bitcoin、Namecoin和以太坊這些項(xiàng)目充分展現(xiàn)了密碼經(jīng)濟(jì)共識網(wǎng)絡(luò)對促成下一代去中心化系統(tǒng)的強(qiáng)大推力,并潛移默化的將開發(fā)視野從簡單的數(shù)據(jù)存儲和信息服務(wù)擴(kuò)展到任何狀態(tài)應(yīng)用的后臺管理。基于這個系統(tǒng),在全球范圍內(nèi)提議和執(zhí)行的應(yīng)用,涵蓋了全球低價支付系統(tǒng),金融合同,市場預(yù)測,身份注冊和現(xiàn)實(shí)世界產(chǎn)權(quán),建立更安全的證書管理系統(tǒng),甚至通過供應(yīng)鏈對制造品進(jìn)行溯源和跟蹤管理。

eip-eipril動畫官網(wǎng)
(圖片來源網(wǎng)絡(luò),侵刪)

  但是,這個系統(tǒng)的技術(shù)基礎(chǔ)仍然存在嚴(yán)重的效率問題。因?yàn)樵诰W(wǎng)絡(luò)上每個全節(jié)點(diǎn)都必須維護(hù)整個系統(tǒng)的狀態(tài)和處理每個交易,整個區(qū)塊網(wǎng)絡(luò)效率受限于單個計(jì)算節(jié)點(diǎn)?,F(xiàn)在大部分系統(tǒng)所采用的共識機(jī)制,工作量證明(POW),需要消耗大量的電力去運(yùn)營;基于POW機(jī)制的最大的工作區(qū)塊鏈Bitcoin,消耗了相當(dāng)于整個愛爾蘭的用電量。

  這篇文章為上述問題提供將POS和基于分片證明進(jìn)行合并的解決方案。POS本身并不是一個新奇的主意,2011年就已經(jīng)存在,但新的算法展現(xiàn)了實(shí)質(zhì)性的好處,不僅解決了前一系統(tǒng)的缺陷,甚至擁有POW不曾有的屬性。

  POS可以被想象成一種虛擬挖礦。然而在POW模式下,用戶需要花費(fèi)一定的金錢買一臺電腦,然后消耗真實(shí)的電力,其隨機(jī)獲得區(qū)塊鏈的成本與消耗的電力大致成比例。在POS模式下,用戶花費(fèi)金錢購買系統(tǒng)內(nèi)的虛擬代幣,然后用一個內(nèi)部協(xié)議機(jī)制將虛擬代幣轉(zhuǎn)換成虛擬電腦,系統(tǒng)模擬隨機(jī)產(chǎn)生的區(qū)塊的成本與購買成本大致成比例,達(dá)到了POW同樣的出塊效果,卻不用消耗電力。

  分片也并不新穎,在現(xiàn)行的分布式數(shù)據(jù)庫設(shè)計(jì)中有超過10年的應(yīng)用,但是到目前為止,研究將其應(yīng)用在區(qū)塊鏈上,仍有頗多限制?;镜穆窂绞墙鉀Q可擴(kuò)展的挑戰(zhàn),通過架構(gòu)中的全球驗(yàn)證程序集合中的節(jié)點(diǎn)(在我們的情況下,通過股權(quán)結(jié)合證明了)被隨機(jī)分配到特定的“碎片”,其中每個碎片并行處理全局狀態(tài)的不同部分,從而確保工作是跨節(jié)點(diǎn)分布處理,而不是每個節(jié)點(diǎn)都重復(fù)做。

  我們渴望實(shí)現(xiàn)以下目標(biāo)

  1、通過POS提升效率:共識機(jī)制不應(yīng)該由挖礦進(jìn)行保證,從而大大減少電力浪費(fèi),并且可以滿足大量和持續(xù)發(fā)行ETH的需要。

  2、快速的出塊時間:在不威脅安全的前提下,出塊速度達(dá)到最大值。

  3、經(jīng)濟(jì)一致:一旦區(qū)塊被制作,經(jīng)過一定時間和事件的處理,大部分的驗(yàn)證者將‘全提交’那個區(qū)塊,意味著eip他們將損失全部的以太幣保證金在沒有包含這個區(qū)塊的歷史記錄(想想1000萬價值的以太幣),這是非常需要的,因?yàn)橐馕吨蟛糠值呐鲎膊荒芡ㄟ^節(jié)點(diǎn)進(jìn)行傳遞或者不用破壞掉以太幣就可以51%攻擊。默認(rèn)的驗(yàn)證者戰(zhàn)略是被設(shè)計(jì)成保守的他們愿意做出高價值的承諾,誠信的驗(yàn)證者的風(fēng)險應(yīng)該很低。

  4、可擴(kuò)展性:應(yīng)該不需要跑所有節(jié)點(diǎn)就可以運(yùn)行區(qū)塊鏈,例如在這樣的情況下,所有節(jié)點(diǎn)包括驗(yàn)證節(jié)點(diǎn)只保持一小部分區(qū)塊的數(shù)據(jù)碎片,然后用輕客戶端技術(shù)訪問剩余部分的區(qū)塊。采用方式下,相對單個節(jié)點(diǎn)處理能力,區(qū)塊鏈可以達(dá)到更高的交易處理吞吐量,同時運(yùn)行區(qū)塊平臺所需的只是大量的普通個人電腦,因此也可以保證去中心化。

  5、跨碎片通信:構(gòu)建這樣一類應(yīng)用并實(shí)現(xiàn)應(yīng)用之間的互操作性在理論上是具有最大可行性的。該類應(yīng)用的資源使用達(dá)到一個臨界點(diǎn)以至超出單個節(jié)點(diǎn)的計(jì)算能力和帶寬限制,并且分別存儲在不同節(jié)點(diǎn)和處于不同狀態(tài)。

  6、抵抗計(jì)算審查:該協(xié)議設(shè)計(jì)為可抵抗大部分的惡意驗(yàn)證節(jié)點(diǎn)跨越所有碎片而發(fā)起的聯(lián)合攻擊,使得無效交易不能被打包到區(qū)塊并成為整個區(qū)塊鏈的一部分。在某種程度上,可以通過以太坊1.0的停機(jī)問題存在,但是我們可以通過引入保證調(diào)度的概念和保證交叉碎片信息使這個機(jī)制更加強(qiáng)健。

  我們從描述一個算法開始,該算法實(shí)現(xiàn)目標(biāo)1和2,然后在第二個算法實(shí)現(xiàn)了目標(biāo)3,然后在第三個算法中一定程度上實(shí)現(xiàn)目標(biāo)4,5(作為一個限制條件,對一個節(jié)點(diǎn)的計(jì)算能力的平方大致成比例,如(4)和一個24小時的延遲跨碎片信息,有可能建立更快的消息作為一個層上通過雙用途的存款,在例(5)。對目標(biāo)(4)和(5)的更強(qiáng)級別的滿意,(6)也一樣,使得重新設(shè)計(jì)2.1和3.0。

  常數(shù)

  我們設(shè)置:

  ?BLOck_TIME:4seconds(aimingonthelessambitioussidetoreduceoverhead,針對不太有野心的目標(biāo)去減少開銷)

  ?SKIP_TIME:8seconds(aimingonthelessambitioussidetoreduceoverhead針對不太有野心的目標(biāo)去減少開銷)

  ?EPOCH_LENGTH:10800(ie.12hoursundergoodcircumstances,12小時的良好狀態(tài))

  ?ASYNC_DELAY:10800(ie.12hoursundergoodcircumstances12小時的良好狀態(tài))

  ?CASPER_ADDRESS:255

  ?WITHDRAWAL_DELAY:10000000,ie.4months

  ?GENESIS_TIME:somefuturetimestampmarkingthestartoftheblockchain,say1500000000

  ?REWARD_COEFFICIENT:3/1000000000

  ?MIN_DEPOSIT_SIZE:32ether

  ?MAX_DEPOSIT_SIZE:131072ether

  ?V_LOSS_MAXGROWTH_FACTOR:32

  ?FINaliTY_REWARD_COEFFICIENT:0.6/1000000000

  ?FINaliTY_REWARD_DECAY_FACTOR:1000(ie.1.1hoursundergoodcircumstances)

  ?MIN_BET_COEFF:0.25

  ?NUM_SHARDS:80

  ?VALIDATORS_PER_SHARD:120

  最小的POS

  我們可以創(chuàng)建一個最小可行的PoS算法,沒有諸如敲定確定、額外的抗審查以及分片等特性。在地址CASPER_ADDRESS存在一個合約,其主要功能是追蹤驗(yàn)證者集合的變化。該合約沒有特殊的特權(quán),除了調(diào)用該合約是驗(yàn)證區(qū)塊標(biāo)頭過程中的一部分,而且是包括在創(chuàng)世區(qū)塊,而不是通過交易被動態(tài)添加的。驗(yàn)證者集合初始設(shè)置在創(chuàng)世區(qū)塊中,并可以通過以下函數(shù)進(jìn)行調(diào)整:

  ?deposit(bytesvalidation_code,bytes32randao,addresswithdrawal_address):保證金(字節(jié)validation_code,bytes32randao,地址withdrawal_address)

  接受一定量的以太幣作為保證金,發(fā)送者指定一段驗(yàn)證代碼(本質(zhì)為EVM字節(jié)碼,代碼主要功能是用作一種公鑰,以便后續(xù)其他的節(jié)點(diǎn)驗(yàn)證由他們進(jìn)行簽名的區(qū)塊數(shù)據(jù)以及相關(guān)的網(wǎng)絡(luò)共識消息),一個隨機(jī)提交的交易(一個32字節(jié)的哈希用于驗(yàn)證者的選擇;詳見下文)和最終提現(xiàn)地址一并發(fā)送。值得注意的是,提現(xiàn)可以在一個特定的地址發(fā)送,該地址的合約功能唯一用途就是特定的地址條件下釋放資金,如果需要還可以雙重用保證金。如果所有參數(shù)都被接受,在下一個時期將增加該驗(yàn)證者到驗(yàn)證者集合。(例如,如果保證金在第N個時期請求提取,而驗(yàn)證者在第N+2個時期被加入驗(yàn)證者集合,這個一個時期等于EPOCH_LENGTH個區(qū)塊時間周期)。驗(yàn)證代碼的哈希值(叫做vchash)可以被驗(yàn)證者用作識別號;不同驗(yàn)證者具有同樣的哈希值是被禁止的。)

  startWithdrawal(bytes32vchash,bytessig):

  開始撤回流程,要求一個簽名,該簽名需要通過驗(yàn)證者的驗(yàn)證代碼。如果簽名通過,從下一個時期開始,驗(yàn)證者被從驗(yàn)證者集撤回。注意,這個函數(shù)不退回以太幣。

  還有一個函數(shù):

  Withdraw(bytes32vchash):

  撤回驗(yàn)證者的以太幣到指定的提現(xiàn)地址,增加獎勵減少懲罰,只要驗(yàn)證者已經(jīng)從驗(yàn)證者活動集合中通過使用StartWithdrawal至少是WITHDRAWAL_DELAY幾秒前撤回。

  準(zhǔn)確的講,驗(yàn)證代碼就像是放入?yún)^(qū)塊標(biāo)頭的哈希碼,加上簽名,如果簽名有效返回1,反之,則返回0。這個機(jī)制確保了我們不會將驗(yàn)證者鎖定到任何一個特殊簽名的算法,相反允許驗(yàn)證者使用驗(yàn)證代碼從多重私鑰驗(yàn)證簽名取代單一驗(yàn)證,也允許使用Lamport簽名對抗量子計(jì)算機(jī)的攻擊。這個代碼在黑匣子環(huán)境下通過使用新的CALL_BLACKBOX操作碼執(zhí)行,以保證執(zhí)行獨(dú)立于外部狀態(tài)。這樣可以防止一些攻擊,如一個驗(yàn)證者創(chuàng)建了驗(yàn)證代碼在狀態(tài)良好的時候返回1,在狀況不好的時候(例如Dunkleinclusion)返回0.

  deposit函數(shù)中randao參數(shù)的值應(yīng)該是計(jì)算一段長鏈哈希值結(jié)果,即設(shè)置秘密隨機(jī)的X,執(zhí)行計(jì)算randao=sha3(sha3(sha3(sha3(.....(sha3(x))…))。每個驗(yàn)證者提供randao的值保存在Casper合約中的存儲空間。

  Casper合約也含有一個叫GlobalRandao的變量,初始化為0。這個合約含有一個函數(shù)getValidator(uint256skips):返回skips跳過以后的驗(yàn)證者的代碼。例如getValidator(0)返回第一個驗(yàn)證者(驗(yàn)證者一般來講可以創(chuàng)造區(qū)塊),getValidator(1)返回第二個驗(yàn)證者(如果第一個不能創(chuàng)建區(qū)塊,驗(yàn)證者可以創(chuàng)建)

  每個驗(yàn)證者都是通過偽隨機(jī)算法從目前活動的驗(yàn)證者集合進(jìn)行選擇,隨機(jī)對初始保證金規(guī)模進(jìn)行加權(quán),并以Casper合約中的globalRandao值為偽隨機(jī)種子。除了簽名外,一個有效的區(qū)塊也必須包含為那個驗(yàn)證者目前保存Randao的原像。這個原像然后替換保存Randao值,然后也通過異或運(yùn)算保存到合約的globalRandao值中。這樣,一個驗(yàn)證者生成的每一區(qū)塊都要求脫掉一個驗(yàn)證者的randa的一層。這是一種基于在這里解釋(http://vitalik.ca/files/randomness.html)的隨機(jī)算法。

  總之,一個區(qū)塊必須包含的如下的額外數(shù)據(jù):

  其中,vchash是驗(yàn)證代碼的32字節(jié)哈希值,用于快速識別驗(yàn)證者。randao含義如上所描述(也是32字節(jié)),sig是簽名,可以是任意長度(雖然我們將區(qū)塊標(biāo)頭的大小限制為2048字節(jié))。

  創(chuàng)建區(qū)塊所需要的最短時間可以簡單的定義為:GENESIS_TIME+BLOCK_TIME*+SKIP_TIME*。

  在實(shí)際過程中,這意味著,一旦發(fā)布了某個區(qū)塊,那么下一個區(qū)塊的0-skip驗(yàn)證者會在BLOCK_TIME秒之后發(fā)布,同理,1-skip驗(yàn)證者則在BLOCK_TIME+SKIP_TIME秒之后發(fā)布,以此類推。

  如果一個驗(yàn)證者發(fā)布一個區(qū)塊太早,其他的驗(yàn)證者會忽視該區(qū)塊,直到在規(guī)定的時間之后,才會處理該區(qū)塊(該中機(jī)制的進(jìn)一步描述和驗(yàn)證詳見這里(http://vitalik.ca/files/timing.html);短BLOCK_TIME和長SKIP_TIME之間的不對稱性,可以確保:在正常情況下,區(qū)塊的平均保留時間可以非常短,而在網(wǎng)絡(luò)延遲更長的情況下,也可以保證網(wǎng)絡(luò)的安全性)。

  如果一個驗(yàn)證者創(chuàng)建了一個包括在鏈內(nèi)的區(qū)塊,他們得到的區(qū)塊獎勵相當(dāng)于此周期內(nèi)活動驗(yàn)證者集合內(nèi)以太的總量乘以REWARD_COEFFICIENT*BLOCK_TIME。因此,如果驗(yàn)證者總是正確的履行職責(zé),REWARD_COEFFICIENT本質(zhì)上成為驗(yàn)證者的“預(yù)期每秒收益率”;乘以~3200萬得到近似的年化收益率。如果一個驗(yàn)證者創(chuàng)建了一個不包括在鏈內(nèi)的區(qū)塊,之后,在將來的任意時間(直到驗(yàn)證者調(diào)用withdraw函數(shù)為止)該區(qū)塊標(biāo)頭可以作為一個“dunkle”通過Casper合約的includeDunkle函數(shù),被包括在鏈內(nèi);這使得驗(yàn)證者損失了相當(dāng)于區(qū)塊獎勵的錢數(shù)(以及向包括dunkle在內(nèi)的當(dāng)事方提供一小部分罰款作為激勵)。因此,驗(yàn)證者應(yīng)當(dāng)在確定該區(qū)塊在鏈內(nèi)的可能性超過50%,才實(shí)際創(chuàng)建該區(qū)塊;該機(jī)制不鼓勵所有鏈上的驗(yàn)證。驗(yàn)證者的累計(jì)保證金,包括獎勵和罰款,存儲在Casper合約的狀態(tài)內(nèi)。

  “dunkle”機(jī)制的目的是為了解決權(quán)益證明中的“零賭注”的問題,其中,如果沒有罰款,只有獎勵,那么驗(yàn)證者將被物質(zhì)激勵,試圖在每個可能的鏈上創(chuàng)建區(qū)塊。在工作量證明場景下,創(chuàng)建區(qū)塊需要成本,并且只有在“主鏈”上創(chuàng)建區(qū)塊才有利可圖。Dunkle機(jī)制試圖復(fù)制工作量證明中的經(jīng)濟(jì)理論,針對創(chuàng)建非主鏈上區(qū)塊進(jìn)行人工罰款,來代替工作量證明中電費(fèi)用的“自然罰款”。

  假設(shè)一個固定大小的驗(yàn)證者集合,我們可以很容易的定義分叉選擇規(guī)則:計(jì)算區(qū)塊數(shù),最長鏈勝出。假設(shè)驗(yàn)證者集合可以變大和縮小,但是,該規(guī)則就不太適用了,因?yàn)樽鳛樯贁?shù)支持的分叉的速度一個時期以后將像多數(shù)支持的分叉一樣。因此,我們可以用計(jì)算的區(qū)塊數(shù)代替定義的分叉選擇規(guī)則,給每個區(qū)塊一個相當(dāng)于區(qū)塊獎勵的權(quán)重。因?yàn)閰^(qū)塊獎勵與積極驗(yàn)證的以太總量成正比,這確保了更積極驗(yàn)證以太的鏈得分增長速度更快。

  我們可以看出,這條規(guī)則可以用另一種方式很方便的理解:基于價值損失的分叉選擇模型。該原則是:我們選擇驗(yàn)證者賭最多價值的鏈,就是說,驗(yàn)證者承認(rèn)除了上述的鏈外,所有其他鏈都會損失大量的資金。我們可以等同認(rèn)為,這條鏈?zhǔn)球?yàn)證者失去資金最少的鏈。在這樣一個簡單的模式中,很容易看出這如何簡單的對應(yīng)著區(qū)塊權(quán)重為區(qū)塊獎勵的最長鏈。該算法是盡管簡單,但用于股權(quán)證明的實(shí)現(xiàn)來說也足夠高效。

  添加敲定

  下一步是增加經(jīng)濟(jì)敲定的概念。我們按照以下方式進(jìn)行。在區(qū)塊標(biāo)頭內(nèi)部,除了指向上一個區(qū)塊的哈希之外,現(xiàn)在驗(yàn)證者也對某個以前區(qū)塊FINALIZATION_TARGET敲定概率做出了一個斷言。該斷言被當(dāng)做一個賭注,如“我相信區(qū)塊0x5e81d……將被敲定,并且在所有區(qū)塊史中,如果這一斷言是錯誤的,我愿意損失V_LOSS,假設(shè)在所有區(qū)塊史中,這一斷言是正確的,我將得到V_GAIN?!彬?yàn)證者選擇odds參數(shù),而V_LOSS和V_GAIN,按照如下方式計(jì)算(令total_validating_ether為活動驗(yàn)證者集合的以太總量,MAX_REWARD是允許的區(qū)塊獎勵的最大值,bet_coeff是下文定義的系數(shù)):

  ?BASE_REWARD=FINALITY_REWARD_COEFFICIENT*BLOCK_TIME*total_validating_ether

  ?V_LOSS=BASE_REWARD*odds*bet_coeff

  ?V_GAIN=BASE_REWARD*log(odds)*bet_coeff

  ?BASE_REWARD=FINALITY_REWARD_COEFFICIENT*BLOCK_TIME*total_validating_ether

  ?V_LOSS=BASE_REWARD*odds*bet_coeff

  ?V_GAIN=BASE_REWARD*log(odds)*bet_coeff

  V_GAINandV_LOSSvaluesrelativetotheBASE_REWARD,assumingbet_coeff=1,假設(shè)bet_coeff=1,V_GAIN值和V_LOSS值與BASE_REWARD的相關(guān)性

  FINALIZATION_TARGET從null開始,但是區(qū)塊1期間,它被設(shè)置成區(qū)塊0。bet_coeff初始(開始)值被設(shè)置為1,另一個變量cached_bet_coeff設(shè)置為0。但是bet_coeff不能減少到低于MIN_BET_COEFF,在每個區(qū)塊,我們設(shè)置bet_coeff-=bet_coeff/FINALITY_REWARD_DECAY_FACTOR,cached_bet_coeff-=cached_bet_coeff/FINALITY_REWARD_DECAY_FACTOR(這確保了總有激勵驅(qū)動去打賭)。當(dāng)創(chuàng)建一個區(qū)塊,驗(yàn)證者得到BASE_REWARD*log(MAXODDS)*cached_bet_coeff,其中MAXODDS是最大的可能賠率,如MAX_DEPOSIT_SIZE/BASE_REWARD。該機(jī)制隨所實(shí)現(xiàn)的是,一旦某一區(qū)塊被確定被敲定,驗(yàn)證者從中得到獎勵,就像他們以最大odds繼續(xù)進(jìn)行驗(yàn)證一樣。這確保了,驗(yàn)證者不會受到不正當(dāng)?shù)募疃仓\通過延遲敲定某個區(qū)塊以獲得最大收益。

  當(dāng)Casper合約確定FINALIZATION_TARGET已被敲定(即已知區(qū)塊的總價值損失超過某個閾值),我們將新的FINALIZATION_TARGET設(shè)置成當(dāng)前區(qū)塊,我們設(shè)置cached_bet_coeff+=bet_coeff,并且bet_coeff重新設(shè)置為1。從下一個區(qū)塊開始,敲定過程重新開始設(shè)置新的FINALIZATION_TARGET。如果,有一個短鏈分裂,敲定過程可能同時處理多個區(qū)塊,甚至是不同高度的區(qū)塊;但是,鑒于區(qū)塊投注的默認(rèn)驗(yàn)證者策略,以及支持它的最高價值損失,我們預(yù)計(jì)收斂過程傾向于選擇他們其中的一個(此處的收斂參數(shù)基本上與最小權(quán)益證明相一致)。

  當(dāng)新的區(qū)塊敲定過程開始啟動時,我們期望最初的賠率很低,這表示驗(yàn)證者對短范圍分叉的恐懼,但是隨著時間的推移,驗(yàn)證者愿意投注的賠率會逐漸增加。特別的如果他們看到其他驗(yàn)證者對該區(qū)塊進(jìn)行高賠率投注,驗(yàn)證者的賭注也會增加??梢灶A(yù)計(jì),該區(qū)塊的價值損失將以指數(shù)倍增加,從而在對數(shù)時間內(nèi),達(dá)到最大“總保證金損失”。

  在區(qū)塊標(biāo)頭的額外數(shù)據(jù)中,我們現(xiàn)在將所需的數(shù)據(jù)格式更改為以下格式:

  其中區(qū)塊哈希是上個打賭的區(qū)塊的哈希,并且logodds為1字節(jié)值,代表對數(shù)形式的賠率(即,0對應(yīng)1,8對應(yīng)2,16對應(yīng)4等)。

  請注意,我們不能允許驗(yàn)證者完全自由地設(shè)置賠率??紤]如下場景,如果有兩個競爭關(guān)系的敲定目標(biāo),B1和B2(即存在兩個鏈,其中一個的FINALIZATION_TARGET設(shè)置為B1,另一個的的FINALIZATION_TARGET設(shè)置為B2),并且圍繞B1開始形成共識,然后一個惡意驗(yàn)證者可能會突然對B2投入一個高賠率賭注,它的價值損失足夠影響共識,從而引發(fā)短范圍分叉。因此,我們使用以下規(guī)則,通過限制V_LOSS來限制賠率:

  ?令V_LOSS_EMA為一個指數(shù)移動平均線,設(shè)置如下。V_LOSS_EMA開始相當(dāng)于區(qū)塊獎勵。對于每個區(qū)塊周期,V_LOSS_EMA設(shè)置為V_LOSS_EMA*(V_LOSS_MAXGROWTH_FACTOR-1-SKIPS)/V_LOSS_MAXGROWTH_FACTOR+V_LOSS,其中SKIPS是跳過的數(shù)量,V_LOSS是該區(qū)塊選擇的V_LOSS。

  ?設(shè)置V_LOSS_MAX為V_LOSS_EMA*1.5。限定V_LOSS的值為該值。

  該規(guī)則設(shè)計(jì)上引入了一個安全約束:當(dāng)至少(樣本)三分之二的其它驗(yàn)證者風(fēng)險為x后,當(dāng)前驗(yàn)證者的風(fēng)險僅可以為1.5x。這與拜占庭容錯共識算法的事先承諾或承諾模式類似,一個驗(yàn)證者應(yīng)等待其他三分之二的驗(yàn)證者完成給定的步驟后,才能進(jìn)行下一步,并確保一定的安全,也確保大多數(shù)共謀不能參與“惡意破壞”攻擊(如,讓其他的驗(yàn)證者講大量賭注添加在一個區(qū)塊,并且隨后推動共識到一個別的區(qū)塊),無法共謀,因?yàn)楣仓\本身需要耗費(fèi)大量資金(實(shí)際上,共謀損失金錢的速度比受害者損失金錢的速度更快,這是一個顯著的特性,因?yàn)樗_保,在大多數(shù)敵對情況下,惡意操作者會隨著時間的推移,經(jīng)常會被“淘汰”。)

  如果一個區(qū)塊作為一個dunkle被加入鏈中,賭注被處理,并且罰款和獎勵也會產(chǎn)生。例如,如果有兩個高度為5000的區(qū)塊A1和A2,互為競爭的敲定目標(biāo),并且有兩個高度為5050的區(qū)塊B1和B2(兩區(qū)塊均以A1為上一代區(qū)塊),并且驗(yàn)證者在B1上構(gòu)建區(qū)塊C,對A1下賭注,隨后,如果B2最終確定為主鏈區(qū)塊,B1和C將成為dunkle,并且C也將因B1vsB2下錯注而被懲罰,但是還是會因A1被賭對而進(jìn)行獎勵。

  然而,假設(shè)C中的V_LOSS是這樣的,如果B1包含在內(nèi),則V_LOSSV_LOSS_MAX。之后,為了保證預(yù)期的價值損失特性,我們制定了一個額外的罰款:即使驗(yàn)證者賭對了,但我們?nèi)砸訴_LOSS-V_LOSS_MAX對他們進(jìn)行處罰。因此,我們有效地將V_LOSS賭注,分解成(i)價值損失V_LOSS_MAX的賭注和(ii)V_LOSS-V_LOSS_MAX的單純價值銷毀,從而保證這種規(guī)模過大的賭注仍僅通過V_LOSS_MAX經(jīng)由分叉選擇規(guī)則變換。這意味著投注在某種意義上是不“完全的”,因?yàn)槿绻搮^(qū)塊的子代區(qū)塊中的很多都分叉了,即使該區(qū)塊已經(jīng)完成敲定確定,某個區(qū)塊的賭注仍可能引起罰款。在投注模型中的單純價值損失,被認(rèn)為是對價值損失分叉選擇規(guī)則利潤純度的一個可接受的權(quán)衡。

  計(jì)分與策略實(shí)現(xiàn)

  價值損失計(jì)分可以通過以下算法實(shí)現(xiàn):

  ?保持追蹤最新的敲定的區(qū)塊。如果有多個敲定的區(qū)塊不兼容,返回一個大的紅色的閃爍錯誤,因?yàn)檫@表明一個敲定的逆轉(zhuǎn)事件發(fā)生了,并且客戶端的用戶可能需要使用額外的鏈源確定發(fā)生了什么。

  ?保持追蹤所有敲定的候選區(qū)塊,即該區(qū)塊的子代區(qū)塊。對于每一個候選區(qū)塊,保持追蹤該候選區(qū)塊的價值損失。

  ?從最接近的敲定區(qū)塊開始,保持追蹤每個敲定候選區(qū)塊的最長鏈及其長度。

  ?鏈的“總權(quán)重”是其敲定的候選區(qū)塊祖先的價值損失加上鏈的長度乘以區(qū)塊獎勵。如果鏈中沒有敲定的候選區(qū)塊,那么就單獨(dú)使用鏈的長度乘以區(qū)塊獎勵作為其總權(quán)重。“鏈頭”是鏈中權(quán)重最大的最新區(qū)塊。

  此處用于舉例的V_LOSS;在現(xiàn)實(shí)中,他們不會被允許這樣快速的增長,并且B或C會要求A上的較高的V_LOSS成為敲定候選區(qū)塊。

  一個簡單的驗(yàn)證者策略是僅在頭部創(chuàng)建區(qū)塊,并且做出敲定賭注,此處的價值損失是所描述的最大價值損失的80%。

  輕客戶端同步

  敲定機(jī)制開啟了一個快速輕客戶端同步算法的大門。該算法包括以下幾步:

  1、令X是您已經(jīng)確認(rèn)的最新狀態(tài)(初始為創(chuàng)世狀態(tài))。

  2、在X時期或X時期后查詢網(wǎng)絡(luò)當(dāng)前最新的敲定目標(biāo)(謹(jǐn)記:當(dāng)協(xié)議認(rèn)為當(dāng)前區(qū)塊的前一區(qū)塊被敲定時,此時的敲定目標(biāo)為該區(qū)塊。)。調(diào)用最新的敲定目標(biāo)Fn和以前的敲定目標(biāo)Fp。

  3、查詢網(wǎng)絡(luò)Fn前的k個區(qū)塊。這些區(qū)塊將下注,籌碼是它們在Fp上的整個以太幣池子。

  4、通過Merkle分支查詢您已經(jīng)敲定的狀態(tài),驗(yàn)證驗(yàn)證者創(chuàng)建的這些區(qū)塊,驗(yàn)證其在驗(yàn)證者集合中的的存在性和位置,并且針對k個區(qū)塊的中第一個區(qū)塊的初始狀態(tài),驗(yàn)證他們選擇的正確性。

  5、設(shè)置X為Fp的后狀態(tài)。

  6、重復(fù)上述步驟,直到得到最新的敲定區(qū)塊。從最新的敲定區(qū)塊開始,使用上文的正常策略尋找鏈頭。

  非常值得關(guān)注的是,通過步驟1到5可以用兩個網(wǎng)絡(luò)請求和幾秒鐘計(jì)算來驗(yàn)證全天的區(qū)塊。

  分片

  現(xiàn)在,我們考慮從一個分片擴(kuò)大到多個分片。我們構(gòu)建的模型如下。取代已有的單條區(qū)塊鏈,我們現(xiàn)在擁有被我們稱為“分片”的多條相關(guān)聯(lián)的區(qū)塊鏈。NUM_SHARDS分片的編號為分片0至分片NUM_SHARDS–1,其中分片0簡單的作為常規(guī)股權(quán)證明區(qū)塊鏈進(jìn)行,其確定性如上所述,但是分片1……NUM_SHARDS–1工作機(jī)制有所不同。在每個時期的開始,為每個分片隨機(jī)挑選VALIDATORS_PER_SHARD個驗(yàn)證者,并且被分配為下一個時期的驗(yàn)證者(如,n+1時期的驗(yàn)證者在n時期時被指配)。當(dāng)調(diào)用getValidator(skip)以確定這些分片內(nèi)一個分片的驗(yàn)證者,僅僅隨機(jī)從選取的驗(yàn)證者集合中選擇一個驗(yàn)證者(平等地分配,因?yàn)樵谔暨x的時候就已經(jīng)對保證金大小進(jìn)行加權(quán))。分片1……NUM_SHARDS–1的確定性賭注并未在分片內(nèi)做出,而是在分片0內(nèi)做出。當(dāng)賭注被做出,它就被存儲,賭注僅在子代區(qū)塊周期結(jié)束后,才被處理(如,n+1時期的區(qū)塊確定斷言,將在n+3區(qū)塊周期開始時,在分片0內(nèi)進(jìn)行處理)。

  如果已經(jīng)為一個分片挑選了一個驗(yàn)證者,那么這個驗(yàn)證者將需要調(diào)用Casper合約的registerForShard(bytes32vchash,uint256shard,uint256index,bytes32randao)函數(shù),其中vchash是驗(yàn)證者的驗(yàn)證代碼哈希,shard是分片ID,index是一個數(shù)值且0<=index<VALIDATORS_PER_SHARD,其中得getShardValidator(uint256shard,uint256index)返回給定的驗(yàn)證代碼哈希,并且randao是一個randao承諾。為了引導(dǎo)驗(yàn)證者,該函數(shù)生成了一個收據(jù),該收據(jù)能夠通過利用confirmReceipt(uint256receiptId)在目標(biāo)分片上進(jìn)行確認(rèn)。

  getShardValidator依賴于一個單獨(dú)的隨機(jī)源,業(yè)務(wù)邏輯與getValidator類似。該隨機(jī)源,按照如下步驟得出:

  1、每個時期,每個k,如果k滿足0<=k<24,保持追蹤globalRandao最后第k的bit為1的次數(shù)合計(jì),減去第kbit為0的次數(shù)合計(jì)。

  2、每個時期結(jié)束,計(jì)算combinedRandao如下。每個k,如果k滿足0<=k<24,并且如果在時期內(nèi),globalRandao的最后第kbit更多次是1,combinedRandao第k最后的bit是1。如果globalRandao的最后第kbit更多次是0,combinedRandao第k的bit是0.利用sha3(combinedRandao)作為隨機(jī)源。

  使用IddoBentov的低影響函數(shù),增加了隨機(jī)源的操縱成本,因?yàn)?,這個特別的隨機(jī)源種子會產(chǎn)生實(shí)質(zhì)性的經(jīng)濟(jì)結(jié)果,因此,它比正常操縱目標(biāo)更大一些。

  跨分片敲定賭注并不在區(qū)塊標(biāo)頭上,所以不會過度的阻礙輕客戶端;相反,驗(yàn)證者將創(chuàng)建一個交易,在它們創(chuàng)建的任何區(qū)塊間,調(diào)用一個registerFinalityBets(bytes32[]hashes,byteslogodds)函數(shù),任意一個區(qū)塊中創(chuàng)建預(yù)期的NUM_SHARDS個哈希和一個長度為NUM_SHARDS的字節(jié)數(shù)組,每個字節(jié)代表相應(yīng)的區(qū)塊哈希的賠率。

  驗(yàn)證者的典型工作流程是維持分片0的一個“全節(jié)點(diǎn)”,并且保持追蹤被分配給它們的未來分片。如果一個驗(yàn)證者被分配給一個分片,他們將利用Merkle樹證明下載狀態(tài),并且確保當(dāng)他們需要開始驗(yàn)證時,他們已經(jīng)下載了相應(yīng)狀態(tài)。對于該時期,他們作為該分片的驗(yàn)證者,并且創(chuàng)建區(qū)塊,同時,他們將在所有的分片上做出敲定賭注,他們通過觀測(i)每個分片上的最長鏈,(ii)其他的驗(yàn)證者的敲定賭注,以及(iii)在片區(qū)內(nèi)試圖達(dá)到51%成功攻擊的各種二次啟發(fā)方法和機(jī)制(如,欺詐證明)。注意,分配到任何給定分片的概率與驗(yàn)證者的累計(jì)以太成比例,因此,如果驗(yàn)證者的資產(chǎn)成倍,那么需要處理的計(jì)算也會加倍。這個特性被認(rèn)為是何意的,因?yàn)樗黾恿斯叫裕⒔档土说V池激勵,同時引入了一個原則,該原則下處理交易并存儲區(qū)塊鏈本身也成為了“工作量混合證明”的一種形式。

  取樣機(jī)制的初衷是為了確保系統(tǒng)僅依靠少量驗(yàn)證者進(jìn)行實(shí)際交易驗(yàn)證,同時系統(tǒng)能夠安全應(yīng)對累積以太保證金高達(dá)~33-40%(低于50%,因?yàn)榭偫鄯e以太為33-50%的攻擊者在某些給定的分片會很“幸運(yùn)”)的攻擊者;因?yàn)槿邮请S機(jī)的,攻擊者不能夠選擇將他們的權(quán)益集中在一個分片上,許多工作量分片方案的一個致命缺陷上。即使一個分片被攻擊了,還有第二道防線:如果其他驗(yàn)證者發(fā)現(xiàn)攻擊的證據(jù),那么他們可以拒絕做出跟隨攻擊者分叉的敲定聲明,而確認(rèn)由誠實(shí)節(jié)點(diǎn)創(chuàng)建的鏈。如果一個分片上的一個攻擊者試圖從無效區(qū)塊創(chuàng)建一個鏈,其他分片的驗(yàn)證者可以檢測到,并且之后暫時完全驗(yàn)證該分片上的節(jié)點(diǎn),并且確保他們僅敲定有效的區(qū)塊。

  跨分片通信

  本方案中的跨分片通信遵循如下工作。我們創(chuàng)建一個ETHLOG操作碼(帶有兩個參數(shù):tovalue),其創(chuàng)建的一個日志記錄,其存儲內(nèi)容是空字符串(注意,該空字符串,不是32個零字節(jié),一個傳統(tǒng)的LOG只能存儲32字節(jié)的字符串),它的數(shù)據(jù)是一個64字節(jié)的字符串,包括目標(biāo)和具體值。我們創(chuàng)建的GETLOG操作碼,需要一個由區(qū)塊定義ID的單獨(dú)的參數(shù)。number*2**64+txindex*2**32+logindex(其中txindex是交易的index,包括區(qū)塊的log,logindex是交易receipt中的logindex)試圖獲取指定的存儲內(nèi)容,存儲在狀態(tài)中的日志表明,該日志已被消耗,并且將日志數(shù)據(jù)放在目標(biāo)數(shù)組內(nèi)。如果日志值為空串,這也將傳輸以太給收件人。為了成功得到日志內(nèi)容,調(diào)用操作碼的交易必須攜帶日志ID參數(shù)。如果v=0,我們允許簽名中的r值重新用于此目的(注意:這意味著此處僅可以使用EIP86交易;我們希望到現(xiàn)在為止,EIP86交易將是交易的主要形式)。

  現(xiàn)在抽象共識再也不是一個單鏈,而是一個鏈的集合,c[0]…c[NUM_SHARDS-1]。狀態(tài)轉(zhuǎn)移函數(shù)不再是stf(state,block)->state',而是stf(state_k,block,r_c[0]…r_c[NUM_SHARDS-1]))->state_k,其中r_c[i]是來自過去的超過ASYNC_DELAY區(qū)塊的i鏈的receipt集合。

  請注意,有幾種方法可以“滿足”這種抽象。一種方法是“每個節(jié)點(diǎn)都是全功能節(jié)點(diǎn)”的方法:所有節(jié)點(diǎn)存儲所有分片的狀態(tài),更新所有分片的鏈,因此擁有足夠的信息,可以計(jì)算所有的通道交易函數(shù)。然而,這是令人乏味的,因?yàn)樗遣豢蓴U(kuò)展的。

  更有趣的策略是“中型節(jié)點(diǎn)”方法:大多數(shù)節(jié)點(diǎn)選擇一些分片,保持更新到最新(盡可能包括分片0),并作為所有其他分片的輕客戶端。當(dāng)計(jì)算通道交易函數(shù)時,他們需要舊交易收據(jù),然而,他們并沒有存儲舊交易收據(jù),為此,我們增加了一個網(wǎng)絡(luò)協(xié)議規(guī)則,要求交易伴隨著任何交易靜態(tài)參考的收據(jù)的Merkle證明(這里為什么需要靜態(tài)參考就很清楚了:否則,在運(yùn)行時間創(chuàng)建的任意一個GETLOG操作,因?yàn)榫W(wǎng)絡(luò)延遲,日志讀取數(shù)據(jù)將變成一個緩慢的過程,將耗費(fèi)數(shù)倍時間,并且客戶存儲本地的所有歷史日志的負(fù)擔(dān)太重)。最終,在主網(wǎng)絡(luò)內(nèi)部署的策略將有可能是帶有初始強(qiáng)制receiptMerkle證明的全節(jié)點(diǎn)策略,隨著時間的推移,松散支持越來越多的中型節(jié)點(diǎn)。

  注意,不需要將Merkle證明作為一個數(shù)據(jù)包,從一個分片直接導(dǎo)入另一個分片,反而是,所有的證明傳輸邏輯均在驗(yàn)證者和客戶端層面處完成,并且在協(xié)議層面實(shí)現(xiàn)了一個接口,通過該接口可以訪問Merkle。長時間ASYNC_DELAY減少了一個分片內(nèi)改組的可能性,這將需要整個通道的集中改組。

  如果需要短時間延遲,可以在協(xié)議之上實(shí)施的一種機(jī)制是分片內(nèi)投注市場,例如,在分片j內(nèi),A可以和B打一個賭,比如說“如果在分片i內(nèi),區(qū)塊X被敲定,B同意向A發(fā)送0.001ETH,反之,如果在分片i內(nèi),區(qū)塊X未被敲定,則A同意向B發(fā)送1000ETH”。針對此目的,Casper保證金可以有雙重用途-即使在分片j內(nèi)進(jìn)行打賭,A賭輸?shù)男畔⑼ㄟ^receipt傳輸給分片0,隨后一旦A提取,分片0將轉(zhuǎn)移1000以太給B。B將因此獲信:A足夠確信其他分片的區(qū)塊將被敲定并據(jù)此而做出投注,同時B也獲得了防止A判斷失敗的一種保險(即使運(yùn)用了雙重用途方案,該保險還是有缺陷的,如果A是惡意的,那么他們將輸?shù)羲麄內(nèi)康馁€注,這樣B將什么也得不到)。該方案存在的一個可擴(kuò)展限制,與一個節(jié)點(diǎn)計(jì)算能力的平方成比例。原因有二,首先,與分片數(shù)量成比例的計(jì)算能力總數(shù)必須在分片0上計(jì)算獎勵。其次,所有客戶端必須為所有分片的輕客戶端。因此,假設(shè)節(jié)點(diǎn)的計(jì)算能力為N,則應(yīng)該存在O(N)個分片并且每個分片的處理能力均為O(N),其網(wǎng)絡(luò)總處理能力為O(N2)。超過這個最大值,將需要一種更加復(fù)雜的分片協(xié)議以構(gòu)成某種樹結(jié)構(gòu)的聲明驗(yàn)證,這超出了本文的范圍。

-- 展開閱讀全文 --