zoukankan      html  css  js  c++  java
  • Mimblewimble:新型的隐私保护协议

    1

    Mimblewinble 这个名字听起来很无厘头,但它是一种可以防止区块链泄露个人信息的技术。它的名字来源于《哈利波特》中一种防止人们泄露秘密的咒语。

    2

    -《哈利波特》—— 华纳兄弟出品—— 施展 Mimblewimble 咒语片段-

    (编者:我感觉者这口型不像是在使用 Mimblewimble,倒是有可能是守护神咒(Expecto Patronum),你觉得呢?)

    中本聪的比特币论文中有一个名为“隐私”的章节,其中中本聪非常清楚地阐释了比特币的隐私局限性。随着攻击者能够更好地使用比特币的数据定位或实名化比特币用户,这些不足会不断“恶化”。这使得某些认为比特币不与姓名关联因此能够保护隐私的人非常惊讶。让我们一起来看看比特币能够分析出什么数据,以及为什么 ——

    比特币通过泄露 3 个秘密来满足货币系统的两种需要

    3

    每一笔比特币交易都泄露了 3 个秘密:

    1. 发送方地址
    2. 发送比特币的数量
    3. 接收方地址

    比特币并不是因为憎恨隐私性才显示这些信息。它显示这些秘密,是因为任何货币系统(黄金、现金、易货贸易)都必须满足两个条件:

    1. 它必须能够验证接收的币的数量与发送的数量相等。如果我能够在一笔交易中从一个地址发送 1 个币,却在另一个地址收到 2 个币,那么这个加密货币系统必将崩溃。在正常的系统中,如果我将 5 欧元放到你手里,那么我少了 5 欧元,你多了 5 欧元。在这个交易过程中没有凭空产生的钱,也没有凭空消失的钱。
    2. 我只能从我自己的银行账户中进行电子转账,而不能从你的银行账户中转账。我们必须能够验证交易是从借记卡以及个人密码/网上银行密码、或加密货币中的私钥持有者发出的。

    比特币通过泄露以上 3 个秘密,从而满足了这两个条件。

    比特币交易以明文形式包含转账金额以及接收者地址。从而很容易满足货币系统的第一个条件;我们看到 5 个比特币进入交易,5 个比特币出来。

    为了验证比特币系统满足第二个条件,比特币使用具有对应私钥的公开地址。公开地址持有比特币。(交易)发送者通过使用对应私钥产生一个签名,给他的交易(即我刚才说明文包含交易金额以及接收者地址的交易)签名。每个人都可以验证这个签名是由持有比特币的地址对应的私钥产生的;这样我们就验证了交易来自有权发起交易的人。

    Mimblewimble 可以在不泄露以上 3 个秘密的情况下,满足货币系统的这两个条件。

    证明过程需要用到一些简单的数学,只要 10 岁就可以理解。在证明过程中我还会使用一些复杂的数学,大概 12 岁就可以理解。

    乘法很简单,但因式分解很难

    4

    许多人很害怕数学,每当在文章中遇到的时候都会跳过。不过,如果只是下图那么简单,你就不会害怕了吧?

    5

    如果我给你纸笔,那么你两分钟内就能解决这些问题,对吧?对于人们来说乘法非常简单。对于计算机来说,即便是一个小袖珍电脑,也能很快计算出两个百万量级的数字相乘的结果。

    但是,让我们做一点改变。让我们把问号移到另一边:

    6

    现在如果我给你纸笔,那么两分钟内你还能解决这些问题么?也许就不能了。我们仅仅只是改变了操作的方向,事情就变得更加困难了。

    (插播:在本文中,我将讨论像 83 和 23 这样的数字相乘,因为我喜欢这些数字,很熟悉也非常好理解。但计算机不会使用这些数,它们使用非常大的数。实际上,一台计算机能够求解出我是用了哪两个数字相乘得出 4221,但是,即便一台性能非常高的现代计算机,也很难求解出你使用哪些数字相乘得到一个极大的数字。)

    为了简单起见,我不想讨论椭圆曲线。在实际中,加密系统不使用任何数字,而是使用一个被称为椭圆曲线点的特殊集合。但简单的数学性质在这两种情况下是一样的:乘法很简单,但乘法的逆操作——因式分解就很困难。

    利用乘法的属性来隐藏信息,并验证所有权

    如果我问你以下缺失的数字是什么……

    7

    ……你并不能很快地告诉我,因为问号在左边,很难去找出缺失的因子。

    好吧,我来告诉你。缺失的数字是 23 和 83。现在你想验证我说的是不是真的,即缺失的是否真的是 23 和 83 ,这已经变成了一个简单的乘法问题。

    8

    你能够很快地求解出答案,23 和 83 确实是能让乘积等于 20,348,031 的因子。

    9

    如果我撒谎了,你也很容易就能发现,因为我给出的因子将不能使乘积等于右边的大数。我不能编造错误的因子,也不能猜出或计算出它们。我必须提前知道这两个因子

    (插播:注意右边的大数可以整除左边的所有用于构造它的数字;它能够被 83 整除、被 11 整除、被左边所有数字整除。我们将在之后利用这一点。)

    这仅仅是乘法。大概 10 岁的娃娃都能明白。但是,我们为加密货币完成了两件非常重要的事情——

    我们想要隐藏信息。现在我们知道该怎么做了:我们能够通过乘以未知数的形式隐藏信息。这就使得破解原始信息变得非常困难。

    我们也想证明我们持有私钥。现在我们也知道怎么做了:给出大数的因子即可。

    我们只需使用乘法的基本性质就能做到这两点。

    隐藏交易金额

    让我们使用大且秘密的数字乘以交易金额的方式来隐藏交易金额。比特币泄露的三种信息之一就是发送比特币的数量。当我通过比特币区块链发送 5 个比特币的时候,交易金额是明文显示的(即,数字 “5”)。我们用乘式把它隐藏起来。在下面这个等式中,你就不容易告诉我交易金额是多少了:

    10

    上面这个等式有点像交易金额在 Mimblewimble 中的表示形式,但不完全一样。在 Mimblewimble 中,发送方与接收方都给出了这样一个数字:

    11

    这个数字叫做 Pedersen 承诺;我也不知道为啥叫这名儿。需要注意的重要一点是,Pedersen 承诺中包含了交易金额的部分(但是通过乘以一个大数隐藏了交易金额)以及私钥的部分。

    请注意,发送方与接收方都参与到了创建交易的过程中。这跟比特币是完全不同的。这种方式避免了泄露接收方地址,但使得发送方必须以某种方式与接收方取得联系。Beam 包含一个安全的 BBS 系统(与 Beam 区块链分开),使得发送方与接收方能够安全地交换他们的 Pedersen 承诺。

    (为了简单起见,我省略了交易费。在实际实现中,当我向一个朋友或商贩打钱时,我通常也会给矿工一些交易费。原理是一样的。我还遗漏了一些关于 rangeproofs 的内容,它证明隐藏的交易金额不是一个负数,因为发送 -5,就像把 5 个免费的币塞进我的钱包。也许哈利波特有别的咒语可以实现这个 :D)

    乘法结合率

    下面的内容是我们要做的最高级的数学内容。在爱尔兰,你到 12 岁已经是一个大男孩的时候,学校才会教这些内容 ——

    12

    如果我想 2 加 4 乘以 3,我可以首先计算 2 + 4 = 6,再使用 6 乘以 3,得到 18,或者我可以先计算 2 × 3 = 6,再计算 4 × 3 = 12,最后的和也是 18。

    13

    我想让你们记住的一点是:当我们要使用两个数之和乘以第三个数时,我们既可以先求他们两个数之和再乘以第三个数,也可以先计算一个数与第三个数的乘积,再计算另一个数与第三个数乘积,最后将两个乘积相加。这两个过程是等价的。

    证明货币输入等于货币输出

    记住货币系统所需的条件之一是接收的数量减去发送的数量必须为 0。我把 5 欧元放到你手里,你得到 5 欧元。5 - 5 = 0。

    一个 Mimblewimble 交易包括两个 Pedersen 承诺:一个用于记录进入交易的货币数量,另一个记录交易结果中的货币数量:

    14

    例如,如果发送者少了 5,那么接收者获得 5:

    15

    但是我们不需要 分别 将输入交易金额乘以这个大数,然后将输出交易金额乘以这个大数,我们可以像这样把他们合并在一起:

    16

    (译者注:后文图片中的“key1 + key2 × big number2”,都应为“[key1 + key2] × big number2”)

    5 - 5 = 0。0 乘任何大数都依旧是 0。那么这个式子就剩下:

    或者说:

    交易金额部分就消失了!虽然在每一步中,交易金额都通过与大数相乘隐藏了起来,但我们无需公开这些数值,只需验证结果为零(就可以保证系统没有出错)。

    交易金额部分得已隐匿的原因是货币输入与货币输出是相等的。如果它们不相等,那么它们之和就不会是 0,然后化简的结果就会多出一些东西来……

    19

    ……如果交易金额最终结果不为 0,那么交易核(transaction kernel)就不能被 23 和 83 整除。Beam 协议将拒绝该交易,因为这个交易的格式不对。

    (你可能会注意到,在某些情况下,如果交易金额部分数值不为零,例如是 1909,那么交易核依旧能够被 23 和 83 整除。因为我在说明中使用的数字非常小,这种巧合是有可能的。但在计算机使用的非常大量级的数字域中,这种碰撞的可能性接无限近于零。)

    剩下的只是私钥部分。

    20

    私钥部分是一个非常大的数,这个数是发送者与接收者私钥之和,与另一个大数的乘积。私钥可以整除这个大数(译者注:经多方参阅,此处的“这个大数”指的应是 “bignumber2”,因此交易核也一定能被私钥整除),就像 83 和 23 是右边大数的“秘密数字”一样。

    因此,交易核能够被私钥整除的原因有两个:

    1. 因为交易金额部分为 0
    2. 因为私钥部分由一组数字相乘得到,包括我们的私钥 83 和 23。

    由此我们得以满足任意货币系统所需的两个条件!

    1. 如果交易金额部分为 0,这意味着输入金额减去输出金额等于 0。换句话说,输入金额与输出金额是相等的;没有货币消失,也没有货币产生。我们已经实现了这一点,首先通过将交易金额乘以一个未知大数来隐藏起来,然后通过乘法结合律将它们组合在一起,让他们虽有大数掩盖,和却不偏不倚刚好为 0 。
    2. 第二个要求是证明交易是由私钥持有者产生的。发送者通过证明其私钥能够整除交易核来证明,也意味着它的私钥是构造交易核的一个因子。

    22

    可以说,Mimblewimble 相较于比特币更好地实现了比特币的目标(当然,如果隐私是一个目标的话)。与一些隐私币在比特币上 做加法 不同,Mimblewimble 是通过 做减法 来实现隐私性的。我们觉得这非常令人兴奋,于是在今年早些时候开始构建一个完整的实现,并预计在 2018 年底之前发布 BEAM,真正实现 Mimblewimble 。


    链接: https://medium.com/beam-mw/mimblewimble-explained-like-youre-12-d779a5bb483d

  • 相关阅读:
    idea 出现 java.noSuchMechodFound
    IDEA maven 多项目 出现 java 程序包找不到
    Nginx中间件使用心得(一)
    IntelliJ IDEA 2017版 编译器使用学习笔记(三) (图文详尽版);IDE快捷键使用
    IntelliJ IDEA 2017版 编译器使用学习笔记(二) (图文详尽版);IDE快捷键使用
    IntelliJ IDEA 2017版 编译器使用学习笔记(一) (图文详尽版);IDE快捷键使用;IDE多行代码同时编写
    IntelliJ IDEA 2017版 导入项目项目名称为红色
    IntelliJ IDEA 2017版 spring-boot与Mybatis简单整合
    IntelliJ IDEA 2017版 spring-boot加载jsp配置详解(详细图文实例)
    IntelliJ IDEA 2017版 spring-boot修改端口号配置把端口号改为8081
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13312858.html
Copyright © 2011-2022 走看看