grin(Mimblewimble)转账交易流程深入分析

Grin is an exciting new cryptocurrency leveraging the MimbleWimble protocol. But tutorials on Grin are notoriously nondescript.

这篇文章旨在确切的分享grin的交易过程。

grin(Mimblewimble)转账交易流程深入分析_第1张图片
image.png


grin中,一个输出就是一个Pedersen Commitment,任何输出都呈现下面的形式:

grin(Mimblewimble)转账交易流程深入分析_第2张图片
A Grin output, which is a Pedersen Commitment.

Pedersen Commitment(Pedersen 承诺)用一种和聪明的方式隐藏了信息。如果你是刚听说commitments(承诺), 那看到它把它理解成shielded value(屏蔽值)就可以了。

下面的内容来Grin wiki,对理解这篇文章来说是很好的入门。

• 如果选择一个很大的数k作为私钥,k*H就是对应的公钥。即使一个人知道公钥k*H值,想推导出k几乎不可能

r是被用作致盲因子的私钥,G是椭圆曲线上的固定点,它们的乘积r*Gr在曲线上的公钥。

v 是输入或输出的金额,H是椭圆曲线上的另一个固定点。

(k+j)*H = k*H + j*Hkj都是私钥。等式表明从两个私钥的和获取公钥(k + j)* H,等价于每个私钥的对应公钥的和 (k * H + j * H)

更深入的密码学研究可以在这里ECC primer找到。但简而言之,要花费Grin的输出,你必须知道致盲因子(r)和Grin(v)的数量。要解构承诺来推断这些值是不可能的。你必须提前知道它们。

致盲因素的存在是因为有人支付给你这些grin,他也会知道v的值(他给你发送了多少grin)。但只有你(甚至都不是Grin的发送者)将会知道这个输出的致盲因子,因此只有你能够花掉这个输出。

假设此输出使用致盲因子20,此输出包含40 Grin。(注意: Grin的数量实际上是以原子单位1 NanoGrin的倍数发送的。在这里直接使用grin简化了):

grin(Mimblewimble)转账交易流程深入分析_第3张图片
In this output, the blinding factor is 20, and the amount of Grin is 40.

如果我们看Grin 区块链浏览器,输出不会像上面那样优雅的分解。就像我们所说的,这才是Grin真正输出的样子,

What a Grin output looks like (under the Commit column).

再重复一次,从这个输出中推导出20(致盲因子)或者40(grin 数量)是不可能的。

花费输出

假设刚才展示的输出属于Alice。现在,Alice希望将40个Grin中的25个发送给Bob。为简单起见,我们会忽略挖矿费。

假如您有5美元,购买3美元的东西,您将获得2美元的找零。比特币交易是这样的,Grin也不例外。如果Alice想要从她40个未花费的Grin输出中向Bob发送25个Grin,她也会在同一笔交易中创建一个输出,把剩余的15个 Grin(她的零钱)返还自己。

grin(Mimblewimble)转账交易流程深入分析_第4张图片
Alice identifies how much Grin she wants to send to Bob, and also her change.

这15个Grin将会返还Alice,这意味着只有她能够控制它并再次花费它。换句话说,Bob不应该花费Alice的找零。为此,Alice必须为她的找零输出创建一个新的致盲因子。假设Alice选择34。

Alice知道r(为她找零输出的致盲因子)和 v(她找零的grin的数量),她拥有创建找零输出(co)所需的一切。这将作为一个输出记录在区块链上,就像Alice创建的将25个Grin发送给Bob的输出一样。

grin(Mimblewimble)转账交易流程深入分析_第5张图片
Alice’s change output.

正如我之前提到的,要花费任何输出,您必须知道该输出中使用的致盲因子。Alice知道她想要花费的输出中所使用的致盲因素(20),但她需要一种方法向所有人证明她知道。

这就是为什么她需要创建一个完全独立的计算,就是致盲因子的和。这涉及到Alice刚才为她的找零输出采用的致盲因子(34),并从中减去她想要花费的输出的致盲因子(20)。

grin(Mimblewimble)转账交易流程深入分析_第6张图片
Alice’s sum of her blinding factors.

rs(s表示发送者,现在是Alice)是Alice所有致盲因子的总和,现在的情况下它是14。(Note: I am intentionally leaving out kernel offsets)。

Alice做的就是创建一个随机的nonce ks(再次说明,s表示发送者)。她将使用这个随机的nonce来帮助她对这笔交易签名,我们稍后将会展示。Alice不会将实际的nonce发送给Bob。相反,她发送ks•G,这是对该nonce 的承诺。如前所述,通过将nonce乘以生成点G,Alice屏蔽了她实际的nonce值。

Alice将以下信息发送给Bob。实际上,Grin数据不会区分“Metadata”和“Data”字段,这里只是为了清楚的显示。


grin(Mimblewimble)转账交易流程深入分析_第7张图片
Everything Alice sends Bob in the first step of this Grin transaction.

Metadata中的数据:

  • Amount to send: Alice想要发送给Bob的grin数量(现在是25)。
  • TX UUID: Alice和Bob用于在来回发送数据时,标识此交易的唯一标识符。
  • TX fee: 交易费(这篇文章先不讨论)。
  • lock_height: 区块数,在此之后交易将有效。

Data中的数据

  • TX Inputs: Alice为她给Bob的交易的使用的未花费输入。
  • co: Alice的找零输出
  • ks • G: Alice的nonce变成对应的承诺通过乘以生成点G.
  • rs • G*: Alice致盲因子的和对应的承诺通过乘以生成点G.

Alice将所有这些发送给Bob,Bob继续下一步。

Bob的回合

一旦从Alice接收到该数据后,Bob将TX feelock_height连接起来以创建M,称为交易的“Message”。

grin(Mimblewimble)转账交易流程深入分析_第8张图片
The “message” of the transaction.

Bob为他希望从Alice哪里收到的25个grin选择一个致盲因子rr(r表示接受者,在这里是Bob)。假设他选择 11。他还选择了他自己的随机的nonce kr(r表示接受者)。

就像Alice一样,Bob通过将每个值乘以生成点G来创建对这两个值的承诺。使用这些值,Bob 为此交易生成 Schnorr challenge,由变量e表示:

grin(Mimblewimble)转账交易流程深入分析_第9张图片
The Schnorr challenge for the transaction.

Schnorr challenge由以下值的 SHA256 hash组成:

  • 交易的message。
  • Alice和Bob使用的nonce对应承诺的和。
  • Bob的致盲因子(为他25个grin的输出)对应的承诺 + Alice致盲因子和对应的承诺。

Bob使用e为此交易生成他的Schnorr signature ,简称sr(r为收件人)。虽然它是Bob签名的全部,但我们称之为Bob方签名,因为它最终将被添加到Alice方签名中来创建整个交易的签名。

grin(Mimblewimble)转账交易流程深入分析_第10张图片
The Schnorr challenge for the transaction.

当Alice最终收到sr时,她将无法从中推断出krrr的值。

Bob将以下内容发送回Alice

grin(Mimblewimble)转账交易流程深入分析_第11张图片
Bob sends his partial signature, commitment to his nonce, and commitment to his blinding factor for his output back to Alice.

包括:

  • sr: Bob方的签名
  • kr • G: Bob的nonce对应的承诺
  • rr • G: Bob为他期望收到的25个grin选择的致盲因子对应的承诺。

最后一步:返回给Alice

Alice现在有所需的一切,她也需要计算e(这笔交易的Schnorr challenge)。在本地计算e之后,Alice就可以验证Bob方的签名
回顾一下Bob方的签名sr,由一下组成:

grin(Mimblewimble)转账交易流程深入分析_第12张图片
Bob’s partial signature for this transaction.

基于我们前面描述的椭圆曲线的性质,Alice可以将生成点G 引入等式的两边,等式任然成立。

grin(Mimblewimble)转账交易流程深入分析_第13张图片
Alice multiples each side of the equation by generator point G.

由于Alice收到了Bob的kr • G(Bob的nonce对应的承诺)和rr•G(Bob为他期望收到的25个Grin选择的致盲因子对应的承诺),并且因为她已经在本地计算了e,所以Alice验证Bob方签名sr,通过简单地将它乘以生成器G并确保等式的右边等于该值。
通过这样做,Alice证明:

  1. Bob知道他将收到多少grin
  2. Bob知道他的nonce
  3. Bob知道他期望收到的25grin的致盲因子

Alice并不知道Bob的nonce和他选择的致盲因子。

然后Alice生成自己方的签名:

Alice generates her partial signature for the transaction.

Alice现在可以生成整个交易的签名,该签名包括她和Bob的签名:


image.png

签名包括

  • Alice和Bob方签名的和
  • Alice和Bob的nonces对应的承诺(他们都不知道对方真正的nonce)

再简明一点,它可以是这样:

The signature for the transaction.

其中 s = ss + srk = ks + kr.

记住这个签名,它马上会很有意义。

完成交易

数字货币需要一个"memory" , 也就是说,当你向一个人转账后,你不能将同样的钱再发给别人。在Grin中,我们隐藏了发送的Grin数和接受者。那么我们怎么能证明没有钱被双花或者凭空产生呢?

在Grin交易中,当您从输入中减去所有输出时,剩余的Grin数应该等于0。回到刚才的5美元的比喻,有下面的公式:

3 dollars to cashier (output) + 2 dollars in change back to me (output) - 5 dollar bill (input) = 0

在Grin中,当交易合法时,相同的求和使v值总和为零。但是,我们如何在不知道value的情况下证明这一点?让我们看一下从Alice到Bob的交易中使用的输入和输出:

(34•G)+(15•H)+(11•G)+(25•H) - (20•G) - (40•H)=(25•G)+(0•H)

这里比较巧妙的属性是,当Grin金额抵消时(因为没有钱是凭空创造的),从输入中减去输出所剩下的全部是“the excess blinding factor” 的承诺,或者“kernel excess”。这个“the excess blinding factor”的承诺,现在是25•G,就是椭圆曲线上的公钥。

如果Grin交易的输出总和减去输入的总和会在曲线上产生有效的公钥,你便知道v值肯定已经抵消了。如果等式的右边不是n•G + 0•H的形式 【for some known value of n】 ,你便知道该交易无效。这意味着花费的金额大于输入金额(例如,您提供5美元的账单,向收银员支付3美元,并在找零中获得10美元),或者输入大于输出(例如,您提供5美元的账单,向收银员支付3美元,并且没有找零)。

记得之前的签名吗?


The signature from the transaction.

这个签名实际上已经签署了我刚刚提到的excess blinding factor对应的承诺。这是如何做的?

如果你还记得,当你用生成器G乘以等式的两边时,这就是Bob方签名。

Bob’s partial signature when you multiply both sides by generator G.

类似地,当你用生成器G乘以等式两边时,Alice方签名就是这样:

Bob’s partial signature when you multiply both sides by generator G.

如果将两个方程式加在一起会发生什么?你会得到:

sr•G + ss•G =(kr•G)+(ks•G)+(e•(rr•G + rs•G))

请记住,rr是Bob的致盲因子,rs是Alice的盲目因子之和。还需要记住rr•G + rs•G(rr + rs)•G是等价的。

Bob的致盲因子对应的承诺是11•G。Alice所有致盲因子的和对应的承诺是14•G。将它们加在一起得到25•G,这是交易的** excess blinding factor对应的承诺。因此,添加srss( Bob和Alice各自的部分签名)证明了整个交易的有效性,因为它们加起来是 excess blinding factor**对应的承诺。
Further simplifying that equation, we get:
进一步简化该等式,我们得到:

sr•G + ss•G = (k•G) + (e • (r•G))

或者

sr•G + ss•G = (k•G) + (e • (25•G))

剩下要做的就是检查等式左侧等于右侧。

请记住,这个等式中的所有内容(双方签名的和,e中的所有内容,** excess blinding factor**对应的承诺,nonce和对应的承诺)都是公开可见的,因此任何人都可以进行此验证。我们不需要Alice和Bob的致盲因子来验证交易。By adding their partial signatures and verifying that they summed to the commitment to the excess blinding factor,我们证明:

  1. 再花费Alice之前的输入时,没有钱凭空产生。
  2. Alice and Bob both knew the blinding factors for their outputs when they created this transaction. This means the new outputs are spendable by them, and not lost to the abyss.Alice和Bob都知道他们的输出对应的致盲因子。这意味着他们可以花费新的输出,而不是丢失【这里翻译不好】

我们用来验证交易的信息放在所谓的transaction kernel中了。

交易核

除了输出之外,transaction kernel(交易核)是从Grin交易中产生的另一块信息。每个交易都会产生一个transaction kernel(交易核),但是没有办法通过Grin区块链将输出和交易核关联起来。每个Grin交易都存在一个,它包含没有钱凭空产生的证明。

下面的信息存储来交易核中:

  • 交易的签名(s, k • G)
  • 和“excess blinding factor” 相关联的公钥(这里指25•G),如上所述,它可以用来验证s
  • 交易的交易费锁定高度(注意:如果这是Coinbase交易,那么这些交易都不存在).

总结

After all this is said and done, the only things broadcast to the network from the transaction are:
完成所有这些之后,只把交易的以下内容向网络广播:

  • 所用的输入
  • 新的输出
  • 交易核
  • 核偏移 (这篇文章没有讲到).

None of the transaction metadata from earlier are relayed. Even better, some of this information may get discarded, too — but we will save that for another post.

希望这篇文章能够说明Grin交易是如何运作的。我遗漏了范围证明,内核偏移和交易费用。请留意更多关于Grin如何实现切入工作的帖子,多参与者交易的外观以及一些实验性功能。Look out for more posts on how cut-through works in Grin, what multi-participant transactions look like, and some experimental features.


原文链接: https://medium.com/@brandonarvanaghi/grin-transactions-explained-step-by-step-fdceb905a853
作者: Brandon Arvanaghi

翻译&校对: 徐晓峰

你可能感兴趣的:(grin(Mimblewimble)转账交易流程深入分析)