前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分布式隐私保护可审计的账本zkLedger

分布式隐私保护可审计的账本zkLedger

原创
作者头像
Daffy
修改2020-12-21 11:23:04
1.8K0
修改2020-12-21 11:23:04
举报
文章被收录于专栏:密码学和区块链

密码学承诺

一般而言,密码学承诺的应用涉及承诺方验证方两个参与方,以及以下两个使用阶段。

第一阶段为承诺生成(Commit)阶段,承诺方选择一个敏感数据v,计算出对应的承诺c,然后将承诺c发送给验证方。通过承诺c,验证方确定承诺方对于还未解密的敏感数据v只能有唯一的解读方式,无法违约。

第二阶段为承诺披露(Reveal)阶段,学术界通常也称之为承诺打开-验证(Open-Verify)阶段。承诺方公布敏感数据v的明文和盲化因子(相当于秘钥),验证方重复承诺生成的计算过程,比较新生成的承诺与之前接收到的承诺c是否一致,一致则表示验证成功,否则失败。

一个设计良好的密码学承诺具备如下特性:

  • 隐匿性:在打开关于v的承诺c之前,验证方不知道承诺方选择的敏感数据v。
  • 绑定性:在关于v的承诺c生成之后,承诺方难以将已承诺的敏感数据解释成另一个不同的数据v'。

所以,密码学承诺可以起到与日常生活中的承诺行为类似的效果,一旦做出承诺,就必须在披露阶段使用之前已经承诺的敏感数据。对应地,在业务系统中,承诺生成阶段通常被用来生成密文形式的业务数据,而承诺披露阶段则多被用于在特定业务流程中进行数据校验。除了直接公布敏感数据明文之外,承诺披露阶段所需的数据校验,也可以在不公布敏感数据明文的前提下,构造零知识证明来完成。

Pedersen承诺(Pedersen commitment)

Pedersen承诺是一个满足完美隐藏、计算绑定的同态承诺协议,其完美隐藏性不依赖与任何困难性假设,计算绑定依赖于离散对数假设(DLA),其构造分为3个阶段:

  1. 初始化阶段setup:选择阶为大素数q的乘法群G、生成元,G=<g>=<h>,公开元祖(g,h,q);
  2. 承诺阶段comm:承诺方选择随机数r作为盲因子,计算承诺值,然后发送comm给接收者;
  3. 打开阶段open:承诺方发送(v,r)给接收者,接收者验证comm是否等于 g^vh^r\ mod\ q ,如果相等则接受,否则拒绝承诺。

Pedersen承诺的同态性是指,如果comm1,comm2分别是使用盲因子r1,r2的对v1,v2的承诺,则comm (comm=comm1*comm2)是使用盲因子 r1+r2 对 v1+v2 的承诺,即 comm=comm(v1,r1)*comm(v2,r2)=(g^{v_1}h^{r_1})*(g^{v_2}h^{r_2})=g^{v_1+v_2}h^{r_1+r_2}

设v1+v2=v3,向验证者提供证明v1,v2,v3的关系,但是又不能让验证者知道v1,v2,v3的明文值,因此可以使用Pedersen承诺的同态性来解决这个问题,即只需要验证其盲因子r1+r2 ?= r3

comm(v_3,r_3)==comm(v_1,r_1)*comm(v_2,r_2)\\ \Longrightarrow (g^{v_3}h^{r_3})==(g^{v_1}h^{r_1})*(g^{v_2}h^{r_1})=g^{v_1+v_2}h^{r_1+r_2}\\ \Longrightarrow v_3==v_1+v_2\ \ and \ \ r_3==r_1+r_2

如果证明方知道验证方的验证方式是验证 r1+r2=?r3,故意构造一个r3==r1+r2,验证方如何防止证明方作弊呢?由于元祖(g,h,q)是公开的,验证方可以根据盲因子r1来构造一个承诺 comm'(v1,r1) ,验证与接收到的comm(v1,r1)是否是相等。

公钥加密

每个银行 i 还会生成一个Schnorr签名密钥对,该密钥对由秘密密钥 sk_i 和公共密钥 pk_i=h^{sk_i} 组成,并将公共密钥 pk_i 分发给所有其他系统参与者。

总体设计

图1显示了zkLedger的总体设计。 有些银行可以确定交易范围,然后通过将交易追加到分布式账本来进行结算。分布式帐本确保所有银行和任何审计员都看到新交易。 每个银行和审计师都维护一个承诺缓存。 每个银行还具有纯文本交易数据的专用存储。

图1
图1

总共有三个主体对象,分别是银行,账本和审计员。前两者有自己的本地数据库,存储自己的私密信息。三者通过分布式账本连在一起。

审计一个银行当前的资产?考虑查询被审计银行所在列中的值的总和。

方法一:根据 Pedersen Commitment, 可以构造这样的等式 comm(v_1,r_1)*comm(v_2,r_2)...*comm(v_m,r_m)=(g^{v_1}h^{r_1})*(g^{v_2}h^{r_2})*...*(g^{v_m}h^{r_m})=g^{v_1+v_2+...+v_m}h^{r_1+r_2+...+r_m}=g^{\sum^m_{i=1} v_i}h^{\sum^m_{i=1} r_i}

m表示从开始到当前某个银行的所有交易数量,vi表示第i交易的数额,ri表示第i交易的致盲因子(或者说密钥)。

所以首先银行 Bank_k 提供 \sum v_k,\sum r_k 。 然后,审核员将简单地检查这些原始值是否与同态计算值是否一致? \prod cm_k ?= g^{\sum v_k} h^{\sum r_k} 如果等式成立,表示该银行的账单没问题。

存在的问题:但是,银行不一定知道所有的承诺随机数rk(特别是对于银行不参与的任何交易,这些值都是未知的),账单表格中的每一行数据是由该交易的发起者构建生成的,其它银行是不知情的,也就是每一个单元格中的致盲因子 r_k 只有该行交易的发起者知道。这就有问题了,因为根据上面所述的方法,在审计员审计一个银行的时候,需要该银行提供给审计员 \sum v_k

方法二:在每一个单元格中增加一个Token,计算方法为 Token_k=(pk_k)^{r_k} , 其中 pk_k 是椭圆曲线上一个点,也是银行 Bank_k的公钥,r_k 表示致盲因子(椭圆曲线算法)。

银行不需要 \sum r_k 计算 h^{\sum r_k}即可证明 \sum v_k 是正确的。银行向审计员提供的 \sum v_k

审计员计算s=\prod cm_k, s'=s/g^{\sum v_k}t=\prod_k Token_k=h^{{sk}_k\sum r_k}。 审计员判断 log_{s'}\ t?=log_h \ pk

证明:如果相等的话,则 s=g^{\sum v_k}h^{\sum r_k} ,s'=h^{\sum r_k} ,则 log_{s'}\ t=log_h \ pk \Longrightarrow log_{h^{\sum r_k}}\ h^{sk_k\sum r_k}=log_h\ h^{sk_k}\Longrightarrow \frac{sk_k\sum r_k}{\sum r_k}=sk_k 。证明结束。

这里,审计令牌(audit token)仅对银行履行承诺有用。 尽管是公开的,但恶意银行无法使用其他银行的令牌成功打开错误的结果或了解有关其他银行交易的信息。

一条交易的构造

对于行 m 中的一条转帐交易,每个条目 i 包含以下项目:

  • Commitment (cm_i) : (g^{v_i}h^{r_i}) 一个转账值的 Pedersen 承诺。
  • Audit Token (Token_i) : (pk_i)^{r_i} 在无需了解承诺中使用的 r_i 下进行审计。
  • Proof of Balance (\pi ^B) :零知识证明,声称承诺的值满足 \sum _{k=1}^n v_k=0
  • Proof of Assets (\pi^A) :一个新的承诺 cm'_i ,对应的令牌 Token'_i ,以及一个零知识证明,断言 cm'_i 是对 cm_i 的值的重新承诺或对值总和 \prod_{j=0}^m cm_j的重新承诺且 cm'_i[0,2^{40}) 范围内。 如果以 cm_i 表示的承诺值为负,则证据证明银行 i 同意转账。
  • ′i(\pi^C) :两个零知识证明,证明 cm_iToken_i 中使用的随机数相同,并且 cm'_iToken_i' 中使用的随机数相同。 这是为了防止恶意银行将数据添加到账本中,从而阻止另一家银行向审计员开放承诺,进行审计。

事务中是否可以包含其他纯文本格式的元数据。 例如,银行可能希望包括加密的帐号,地址或代表客户的识别信息,以满足1970年《银行保密法》中指定的规则。 zkLedger也支持对事务中的元数据进行审计,但是它没有公开验证其他元数据的方法。

银行的添加和删除

zkLedger可以支持动态添加或删除银行。 参与者(或其他机构)将已签名的交易追加到分布式账本,以指示应添加或删除的银行,以及对应列。 例如,要将新的银行添加到图2所示的分类帐中,涉及的银行将向交易记录追加一笔交易,指示有意添加 Bank_{n+1}。 从那时起,所有交易应包含 n + 1 个条目。 每个交易中 Bank{n+1} 条目的资产证明将从添加 Bank{n+1} 的行开始。 同样,如果银行被移走,以后的交易不应包括该银行的分录。 由于所有参与者都可以看到添加或删除了哪些银行,因此他们可以相应地调整其证明和验证。

优化

1.缓存 2.提前计算交易值0。

审计

Map/reduce

考虑一个审计师想要知道给定银行和资产的平均交易规模。 审计员不能简单地通过合计银行列的承诺总值除以行数来验证银行的答案,因为这样的计算会有不正确的分母。 即,当银行不参与交易时,交易所在行中的承诺列值将为0。为了确定正确的分母,审计员和银行执行以下协议:

  1. Filter. 银行将按照资产过滤行。
  2. Produce new commitments. 对于每一行,银行将根据其是否参与交易来对b的值做出承诺,b为1或0,并创建证明该银行已正确完成重新承诺的证明。 至关重要的是,审计师无法区分这些承诺,因此不会透露银行的交易。 我们称这种产生新承诺的行为为 mapmap 还需要提供新值是被正确计算的证明。对于每次交易,当且仅当交易值不等于0时,银行才会产生b = 1的NIZK证明。
  3. Compute number of non-zero transactions.银行计算新承诺 \vec{b} 的同态总和,并显示有多少交易非零。 这是 reduce 步骤。这是计算平均交易规模的正确分母。 审计师并不能从总和中判断任何 \vec{b} 的确定值。
  4. Respond to auditor. 然后,银行向审计员发送其列中值的总和,位承诺和相应的NIZK证明的向量,其非零交易的数量n以及承诺中 r 值的总和。
  5. Verifification. 审核员通过验证承诺是否正确完成来验证 map 步骤,并通过确认位承诺的矢量的乘积 g^nh^{\sum_{k=1}^N r_k}来验证 reduce 步骤和非零交易数。
  6. Compute answer.审核员根据银行列值的总和和非零交易数计算平均值。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 密码学承诺
    • Pedersen承诺(Pedersen commitment)
      • 公钥加密
      • 总体设计
        • 一条交易的构造
          • 银行的添加和删除
            • 优化
            • 审计
              • Map/reduce
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档