【译】The missing explanation of Proof of Stake Version 3
定義
一些基本的定義對于一些不熟悉區(qū)塊鏈代碼的人可能并不熟悉,它們是:
- UTXO - 未使用的交易輸出
- vin - 在一次交易中,'vin'是一個UTXO,它被用作“輸入”
- vout - 在一次交易中,'vout'是被創(chuàng)建為“輸出”的新UTXO。 'vouts'實際上是交易完成后發(fā)送的所有硬幣
- 散列 - 創(chuàng)建散列的過程。 這需要大量的數(shù)據(jù)作為輸入,并輸出不可逆轉(zhuǎn)的固定大小的“摘要”。 此外,如果您更改輸入數(shù)據(jù)的任何內(nèi)容,它會徹底更改輸出摘要。
- 哈希 - 哈希算法的結(jié)果。
- 腳本 - 確定如何使用vout / UTXO的計算機程序。
- pay-to-pubkeyhash腳本 - 用于在比特幣和其他加密貨幣中匯款的最常用腳本。 為了發(fā)錢,你需要知道的只是他們公鑰的散列(通常表示為base58地址),為了花費收到的錢,所有需要的都是來自公鑰的簽名,而公眾關(guān)鍵本身。
- 付費發(fā)布腳本 - 一個非常簡單的腳本,它具有與pubkeyhash腳本非常相似的功能。 然而,錢不是將錢發(fā)送到公鑰的哈希,而是將錢發(fā)送到公鑰本身。 所有需要花費的是一個證明公鑰所有權(quán)的加密簽名。
- prevout - 在交易中花費的(作為vin)的vout
- OP_RETURN腳本 - OP_RETURN是一個在腳本中使用的操作,它有效地使得輸出可證實不可靠。 它通常用于在區(qū)塊鏈上保存少量數(shù)據(jù)而不污染UTXO集。
工作證明和區(qū)塊鏈共識系統(tǒng)
工作證明是一個久經(jīng)考驗的共識機制,已經(jīng)使比特幣安全可靠8年。 然而,這不是沒有公平的問題。 PoW的主要缺點是:
通過允許參與者創(chuàng)建和挖掘新的街區(qū)(從而獲得街區(qū)獎勵),簡單地通過握住錢包中的硬幣并允許他們的錢包進行自動“放樣”,發(fā)明了賭注證明來解決其中的許多問題。 證明權(quán)益最初由Sunny King發(fā)明并在Peercoin中實施。 它已經(jīng)被許多其他人改進和改編。 其中包括Pavel Vasin的 “ Stake Version 2”, Larry Ren的“Proof of Stake Velocity” ,以及Vlad Zamfir最近的CASPER ,以及其他無數(shù)次實驗和眾所周知的項目。
對于Qtum,我們決定建立在“版本3的證明”上,這是對Pavel Vasin制作并在Blackcoin項目中實施的版本2的改進。 在Blackcoin中實現(xiàn)的這個版本的PoS就是我們將要在這里描述的。 在Qtum中已經(jīng)修改了一些小的細節(jié),但核心一致模型是相同的。
對于許多社區(qū)成員和開發(fā)者來說,證明利害關(guān)系是一個難題,因為關(guān)于如何通過網(wǎng)絡(luò)上的令牌所有權(quán)證明完成保證網(wǎng)絡(luò)安全的管理很少。 這篇博文將詳細介紹關(guān)于證明版本3的證明,以及它是如何創(chuàng)建,驗證以及最終如何確保純利益區(qū)塊鏈證明。 這將承擔(dān)一些技術(shù)知識,但我會嘗試解釋一些事情,以便可以從上下文中收集大部分知識。 您至少應(yīng)該熟悉基于UTXO的區(qū)塊鏈概念。
在我們談?wù)揚oS之前,它有助于理解更簡單的PoW共識機制是如何工作的。 它的挖掘過程可以用幾行偽代碼來描述:
while(blockhash > difficulty) { block.nonce = block.nonce + 1 blockhash = sha256(sha256(block)) }散列是一種加密算法,它需要大量的輸入數(shù)據(jù),對其進行大量處理,并輸出該數(shù)據(jù)的固定大小的“摘要”。 只用摘要來計算輸入數(shù)據(jù)是不可能的。 所以,PoW的功能就像一個彩票,你可以通過創(chuàng)建哈希來檢查它是否勝過目標(biāo),然后通過更改塊中的某些數(shù)據(jù)來創(chuàng)建另一張票。 在比特幣的情況下,nonce用于此以及其他一些字段(通常稱為“extraNonce”)。 一旦找到一個小于難度目標(biāo)的塊沖突,塊就是有效的,并且可以被廣播到分布式網(wǎng)絡(luò)的其余部分。 礦工們會看到它并開始在這個區(qū)塊的頂部建造下一個街區(qū)。
證券的議定書結(jié)構(gòu)和規(guī)則的證明
現(xiàn)在輸入證券的證明。 我們對PoS有這些目標(biāo):
PoS的核心概念與彩票非常相似。 然而,最大的區(qū)別在于,通過簡單地更改塊中的某些數(shù)據(jù)就不可能“獲得更多彩票”。 PoS發(fā)明了“內(nèi)核散列”的概念,而不是“塊散列”作為判斷目標(biāo)的彩票。
內(nèi)核哈希由多個在當(dāng)前塊中不易修改的數(shù)據(jù)組成。 因此,由于礦工沒有簡單的方法來修改內(nèi)核哈希,他們不能簡單地迭代像PoW那樣的大量哈希。
為了實現(xiàn)目標(biāo),利益沖突塊的證明增加了許多額外的共識規(guī)則。 首先,與PoW不同的是,coinbase交易(該區(qū)塊中的第一筆交易)必須為空,并獎勵0令牌。 相反,為了獎勵工作人員,有一個特殊的“利益交易”,它必須是該區(qū)塊的第二筆交易。 利益交易被定義為以下任何交易 :
此外,放樣交易必須遵守這些規(guī)則才能在塊中有效:
這些規(guī)則確保了利益交易易于識別,并確保它提供足夠的信息來驗證區(qū)塊。 空洞的vout方法并不是確定交易的唯一方法,但這是Sunny King的原始設(shè)計,并且運行良好。
現(xiàn)在我們已經(jīng)了解了交易的規(guī)模,以及他們必須遵守的規(guī)則,接下來的內(nèi)容是涵蓋PoS塊的規(guī)則:
- 必須有1個標(biāo)準(zhǔn)交易
- 放樣交易必須是該塊中的第二筆交易
- coinbase交易必須有0個輸出值和一個空的vout
- 塊時間戳必須將其最低4位設(shè)置為0 (在源代碼中稱為“掩碼”) 。 這實際上意味著阻塞時間只能以16秒為間隔來表示,從而降低了粒度
- 塊的版本必須是7
- 塊的“內(nèi)核哈希”必須滿足PoS的加權(quán)難度
- 塊哈希必須由放樣事務(wù)的第二個vout中的公鑰簽名。 簽名數(shù)據(jù)放置在塊中(但不包含在正式塊散列中)
- 存儲在塊中的簽名必須是“LowS”,這意味著只包含一段數(shù)據(jù),并且必須盡可能壓縮(數(shù)據(jù)中沒有額外的前導(dǎo)0或其他操作碼)
- 適用于標(biāo)準(zhǔn)PoW塊的大多數(shù)其他規(guī)則(有效的merkle散列,有效交易,時間戳在時間漂移限額內(nèi)等)
這里有很多細節(jié),我們會稍微介紹一下。 真正使PoS有效的最重要的部分在于“內(nèi)核散列”。 內(nèi)核哈希類似于PoW(如果哈希遇到困難,則塊有效)。 但是,內(nèi)核散列在當(dāng)前塊的上下文中不可直接修改。 我們首先將涵蓋這些結(jié)構(gòu)和機制的具體內(nèi)容,然后解釋為什么這種設(shè)計正是這種方式,并且可能由于對其進行微小改變而產(chǎn)生意想不到的后果。
利益核心散列的證明
內(nèi)核哈希具體包含以下精確的數(shù)據(jù)片段(按順序):
- 上一個塊的“加樣修飾符”(稍后會有更詳細的介紹)
- 來自“prevout”事務(wù)的時間戳(放樣事務(wù)的第一個vin所花費的事務(wù)輸出)
- prevout交易的散列
- prevout的輸出數(shù)量(即事務(wù)的哪個輸出被放樣事務(wù)花費)
- 當(dāng)前塊時間,底部4位設(shè)置為0以減小粒度。 這是放樣過程中唯一發(fā)生變化的事情
一個塊的加入修飾符恰好是一個哈希值:
- PoS塊中的prevout事務(wù)的散列,或PoW塊中的塊散列。
- 前一個模塊的放樣修改器(起始模塊的放樣修改器為0)
改變當(dāng)前內(nèi)核散列(為了挖掘一個塊)的唯一方法就是改變你的“prevout”,或者改變當(dāng)前的塊時間。
一個錢包通常包含許多UTXO。 錢包的余額基本上是錢包可以使用的所有UTXO的總數(shù)。 這在PoS錢包中當(dāng)然是一樣的。 這很重要,因為任何輸出都可以用于放樣。 其中一個輸出是什么可以成為一個大型交易中的“prevout”,以形成一個有效的PoS塊。
最后,還有一個方面在PoS塊的挖掘過程中發(fā)生了變化。 這個難度是根據(jù)放樣交易中的硬幣數(shù)量加權(quán)的。 當(dāng)投注2個硬幣時,PoS難度最終達到兩倍,而僅投1個硬幣。 如果情況并非如此,那么它會鼓勵創(chuàng)建許多微型UTXO來放樣,這會膨脹區(qū)塊鏈的大小,并最終導(dǎo)致整個網(wǎng)絡(luò)需要更多資源來維護,并且可能會破壞區(qū)塊鏈的整體安全性。
所以,如果我們現(xiàn)在要顯示一些用于查找有效內(nèi)核哈希的偽代碼,它將如下所示:
while(true){ foreach(utxo in wallet){ blockTime = currentTime - currentTime % 16 posDifficulty = difficulty * utxo.value hash = hash(previousStakeModifier << utxo.time << utxo.hash << utxo.n << blockTime) if(hash < posDifficulty){ done } } wait 16s -- wait 16 seconds, until the block time can be changed }這個代碼不像我們的PoW例子那么容易理解,所以我會試著用簡單的英文來解釋它:
Do the following over and over for infinity: Calculate the blockTime to be the current time minus itself modulus 16 (modulus is like dividing by 16, but then only instead of taking the result, taking the remainder) Calculate the posDifficulty as the network difficulty, multiplied by the number of coins held by the UTXO. Cycle through each UTXO in the wallet. With each UTXO, calculate a SHA256 hash using the previous block's stake modifier, as well as some data from the the UTXO, and finally the blockTime. Compare this hash to the posDifficulty. If the hash is less than the posDifficulty, then the kernel hash is valid and you can create a new block. After going through all UTXOs, if no hash produced is less than the posDifficulty, then wait 16 seconds and do it all over again.現(xiàn)在我們已經(jīng)使用其中一個可以使用的UTXO找到了有效的內(nèi)核哈希值,我們可以創(chuàng)建一個放樣事務(wù)。 這個放樣的事務(wù)將有1個vin,這花費了UTXO,我們發(fā)現(xiàn)它有一個有效的內(nèi)核哈希。 它會有(至少)2個vouts。 第一個vout將是空的,標(biāo)識區(qū)塊鏈,這是一筆交易。 第二個OP_RETURN將包含一個OP_RETURN數(shù)據(jù)事務(wù),該事務(wù)包含一個公鑰,或者它將包含一個付費至公鑰的腳本。 后者通常用于簡化,但為此使用數(shù)據(jù)事務(wù)允許一些高級用例(如單獨的塊簽名機),而不會不必要地混淆UTXO集。
最后,來自mempool的任何事務(wù)都被添加到塊中。 現(xiàn)在唯一要做的就是創(chuàng)建一個簽名,證明我們已經(jīng)批準(zhǔn)了另外有效的PoS塊。 簽名必須使用在放樣事務(wù)的第二個vout中進行編碼的公鑰(作為pay-pubkey腳本或作為數(shù)據(jù)OP_RETURN腳本)。 塊散列中簽署的實際數(shù)據(jù)。 簽名應(yīng)用后,該塊可以廣播到網(wǎng)絡(luò)。 網(wǎng)絡(luò)中的節(jié)點將驗證塊,如果它發(fā)現(xiàn)它有效并且沒有更好的區(qū)塊鏈,那么它將接受它到它自己的區(qū)塊鏈,并將區(qū)塊廣播到它連接到的所有節(jié)點。
現(xiàn)在我們有一個功能齊全且安全的PoSv3區(qū)塊鏈。 PoSv3是我們確定的最能抵抗攻擊,同時保持純粹的分散式共識系統(tǒng)(即沒有主節(jié)點或限制器)的因素。 要理解我們?yōu)槭裁匆咏@個結(jié)論,我們必須了解它的歷史。
PoSv3的歷史
股權(quán)證明的歷史相當(dāng)悠久。 我不會涵蓋每一個細節(jié),而是廣泛地涵蓋每個版本之間為了歷史目的而到達PoSv3的變化:
PoSv1 - 此版本在Peercoin中實施。 它非常依賴“投幣時代”的概念,或者UTXO沒有花在區(qū)塊鏈上的時間。 它的實施基本上可以使得硬幣時代越高,難度就越大。 然而,這有一個不好的副作用,那就是鼓勵人們每個月或更長時間打開自己的錢包進行放款。 假設(shè)這些硬幣都比較舊,他們幾乎可以立即產(chǎn)生新的墊塊。 然而,這使得雙擊攻擊非常容易執(zhí)行。 Peercoin本身并不受此影響,因為它是一個混合PoW和PoS區(qū)塊鏈,所以PoW區(qū)塊可以緩解這種影響。
PoSv2 - 此版本完全從共識中去除了硬幣的年齡,并且使用了v1中完全不同的利益調(diào)整機制。 更改數(shù)量太多,無法在此處列出。 所有這些都是為了從共識中去除投幣時代,并使其成為安全的共識機制,而無需PoW / PoS混合區(qū)塊鏈來緩解各種攻擊。
PoSv3 - PoSv3實際上是對PoSv2的更多改進。 在PoSv2中,比賽修改器還包括上一個阻止時間。 為了防止發(fā)生“短程”攻擊,可以通過迭代先前的塊時間來迭代挖掘替代區(qū)塊鏈。 PoSv2使用塊和交易時間來確定UTXO的年齡; 這與硬幣年齡并不相同,而是UTXO可用于放樣前的“最低確認要求”。 這變成了一個非常簡單的機制,其中UTXO的年齡取決于區(qū)塊鏈中的深度。 因此,這不會激勵在區(qū)塊鏈上使用不準(zhǔn)確的時間戳,并且對“時間扭曲”攻擊也更加免疫。 PoSv3還增加了對OP_RETURN協(xié)議的支持,允許vout包含用于簽署塊的公鑰而不需要完整的付費至公鑰密碼腳本。
參考文獻:
http://earlz.net/view/2017/07/27/1904/the-missing-explanation-of-proof-of-stake-version
總結(jié)
以上是生活随笔為你收集整理的【译】The missing explanation of Proof of Stake Version 3的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【译】The Faults and Sh
- 下一篇: 【译】What is a UTXO, a