比特币挖矿原理
比特币挖矿原理
近十年出现的最强大的加密技术可能就是零知识的通用简洁证明,通常被称为zk-SNARKs(“零知识简洁知识论证”)。Zk-SNARK允许你生成某个计算有某个输出的证明,这样即使基本计算需要很长时间才能运行,也可以极快地验证该证明。“ZK”(“零知识”)部分增加了一个额外的功能:证明某些计算输入可以隐藏。
比如你可以证明“我知道一个秘密的数字,所以如果你用‘牛’字,请把数字加到最后,用SHA256哈希1亿次,输出以0x57d00485aa开头”。验证者可以比自己运行1亿个哈希值更快地验证证明,并且证明不会泄露什么是秘密数字。
在区块链,有两个非常强大的应用:
1.可扩展性:如果一个块需要很长时间来验证,那么一个人可以验证它并生成一个证书,而其他人可以快速验证该证书
2.隐私权:你可以证明你有权转让某些资产(你已经收到但尚未转让),而不披露收到资产的链接。这确保了安全性,而不会向公众披露与谁进行交易的信息。
但是zk-SNARK很复杂。的确,直到2014-17年,他们还经常被称为“月亮数学”。好消息是,从那以后,协议变得更简单,我们对它们的理解也更好了。本文将试图以一种中等数学水平的人应该理解的方式来解释ZK-斯纳克的工作方式。
请注意,我们将关注可伸缩性。一旦具备可扩展性,这些协议的隐私性其实就相对容易了,所以我们在最后会讨论这个话题。
为什么ZK-斯纳克的“应该”很难
让我们以最初的例子为例:我们有一个数(我们可以把“cow”编码为整数,然后把秘密输入编码为整数),我们用这个数的SHA256哈希,然后再做99,999,999次得到输出,我们检查它的起始数。这是一个巨大的计算。
一个“简洁”的证明,就是证明的大小和验证所需要的时间比要验证的计算要慢得多的证明。如果我们想要一个“简洁”的证明,就不能要求验证者在每一轮散列中做一些工作(因为验证时间会和计算成正比)。相反,验证者必须以某种方式检查整个计算,而不必查看计算的每个部分。
一种自然的技术是随机抽样:我们如何让验证者偷看500个不同地方的计算,并检查那些部分是否正确,如果所有500个检查都通过,则假设其余的计算一定很有可能是好的。还?
菲亚特-沙米尔启发式方法甚至可以把这个过程变成一个非交互式的证明:证明者计算计算的Merkle根,使用Merkle根伪随机地选择500个索引,并提供500个相应的Merkle数据分支。关键思想是证明者在数据被“提交”之前不知道散列。如果恶意证明者在得知要检查的索引后试图篡改数据,则Merkle根将被改变,这将导致一组新的随机索引,这将需要再次伪造数据.捕获恶意软件证明者的无尽循环。
但不幸的是,天真地应用随机抽样以这种方式检查计算有一个致命的缺陷:计算本身是脆弱的。如果恶意证明者在计算过程中的某个地方翻了一点,他们可以使结果给出完全不同的结果,但是随机抽样验证者几乎找不到。
只需要一个故意插入的错误,随机检查几乎捕捉不到,这样计算就可以得到完全错误的结果。
如果要解决zk-SNARK协议的问题,很多人会走到这一步,然后陷入困境,放弃。验证者怎么可能检查计算的每个部分,而不单独查看计算的每个部分?但事实证明,有一个聪明的解决办法。