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