【译】The missing explanation of Proof of Stake Version 3

在每一个加密货币中,都必须有一些共识机制来保持整个分布式网络的同步。 当比特币首次推出时,它推出了工作证明(PoW)系统。 PoW是通过反复加密散列一块数据(块头)来完成的。 由于单向哈希如何工作。 数据中的一个微小变化可能会导致非常不同的散列。 网络中的参与者通过判断最终的散列是否满足某个条件(称为难度)来确定该PoW是否有效。 难度是哈希必须达到或超过的不断变化的“目标”。 每当网络创建的块数比预定的多时,网络就会自动更改这个目标,这样目标变得越来越难以满足。 因此,需要越来越多的计算能力来在10分钟的目标时间内找到与目标相匹配的散列。

定义

一些基本的定义对于一些不熟悉区块链代码的人可能并不熟悉,它们是:

  • 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的主要缺点是:

  1. 电力浪费了大量的电力,损害了环境。
  2. PoW从规模经济中受益匪浅,所以它往往最有利于大型企业,而不是网络中的小型参与者。
  3. PoW不提供使用或保留令牌的动机。
  4. 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有这些目标:

  1. 不可能伪造一个区块
  2. 大牌玩家不会获得不成比例的更大奖励
  3. 更多的计算能力对创建块没有用处
  4. 没有一个网络成员可以控制整个区块链

PoS的核心概念与彩票非常相似。 然而,最大的区别在于,通过简单地更改块中的某些数据就不可能“获得更多彩票”。 PoS发明了“内核散列”的概念,而不是“块散列”作为判断目标的彩票。

内核哈希由多个在当前块中不易修改的数据组成。 因此,由于矿工没有简单的方法来修改内核哈希,他们不能简单地迭代像PoW那样的大量哈希。

为了实现目标,利益冲突块的证明增加了许多额外的共识规则。 首先,与PoW不同的是,coinbase交易(该区块中的第一笔交易)必须为空,并奖励0令牌。 相反,为了奖励工作人员,有一个特殊的“利益交易”,它必须是该区块的第二笔交易。 利益交易被定义为以下任何交易

  1. 至少有1个有效的vin
  2. 首先, vout必须是空白的脚本
  3. 这是第二个vout不能是空的

此外,放样交易必须遵守这些规则才能在块中有效:

  1. 第二个vout必须是一个pubkey(不是pubkeyhash!)脚本,或者一个OP_RETURN脚本,它是不可支持的(仅用于数据),但存储公钥的数据
  2. 事务中的时间戳必须等于块时间戳
  3. 利益交易的总产值必须小于或等于总投入加上PoS区块奖励加区块的总交易费用。 output <= (input + block_reward + tx_fees)
  4. 第一个花费的输出必须至少500块(换句话说,花费的硬币必须至少500块)
  5. 虽然更多的酒可用于和用于放样交易,但第一个酒是唯一用于共识参数的酒。

这些规则确保了利益交易易于识别,并确保它提供足够的信息来验证区块。 空洞的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包含用于签署块的公钥而不需要完整的付费至公钥密码脚本。

参考文献:

  1. https://peercoin.net/assets/paper/peercoin-paper.pdf
  2. https://blackcoin.co/blackcoin-pos-protocol-v2-whitepaper.pdf
  3. https://www.reddcoin.com/papers/PoSV.pdf
  4. https://blog.ethereum.org/2015/08/01/introducing-casper-friendly-ghost/
  5. https://github.com/JohnDolittle/blackcoin-old/blob/master/src/kernel.h#L11
  6. https://github.com/JohnDolittle/blackcoin-old/blob/master/src/main.cpp#L2032
  7. https://github.com/JohnDolittle/blackcoin-old/blob/master/src/main.h#L279
  8. http://earlz.net/view/2017/07/27/1820/what-is-a-utxo-and-how-does-it
  9. https://en.bitcoin.it/wiki/Script#Obsolete_pay-to-pubkey_transaction
  10. https://en.bitcoin.it/wiki/Script#Standard_Transaction_to_Bitcoin_address_.28pay-to-pubkey-hash.29
  11. https://en.bitcoin.it/wiki/Script#Provably_Unspendable.2FPrunable_Outputs


http://earlz.net/view/2017/07/27/1904/the-missing-explanation-of-proof-of-stake-version

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值