加载中 ...

区块链研究实验室 | zk-pork(zk-扑克)共识算法巡回赛模式

2019-02-03 11:35 编辑:btc268.com 来源:区块链资讯

  零知识证明是区块链共识的重要工具。当我们的平台存储全球透明的数据时,我们如何保持隐私?如何扩展“脱链”工作的解决方案,然后需要通过链上证据进行确认?零知识证明在解决这些问题方面发挥了作用。

  ZK扑克

  ZK Poker的规则比其他类型更简单。

  每个玩家可获得5张牌。

  不允许换牌。

  手牌只能有对子,顺子,同花,俘虏(三张相同)等,其他忽略。

  在回合期间的玩家可以选择弃牌、看牌或加注。

  当手牌不包含一对时,玩家不得出价。

  最后一条规则 - 不能诈唬 - 这是由ZK证明强制执行的规则。叫牌人可以不披露他自己的牌,同时仍然可以向其他玩家证明他们遵守无诈唬规则。我们将忽略游戏的机制(评估获胜者,评估出价等),并专注于创建ZKP的巡回赛。

  巡回赛

  巡回赛的大致轮廓如下:

  
收集输入:手牌和玩家的出价选项;

  至少要有一对在手;

  评估的出价范围(弃牌或打牌);

  设置一个约束条件,以检查对手是否已经做出选择;

  设置一个约束条件,以检查给定对的存在或其他情况下选择是否有效;

  接下来我们来写几行巡回赛的代码,看我们能从中学习到什么:

  首先include 一些规范先:

  include “../node_modules/circomlib/circuits/gates.circom”;
include “../node_modules/circomlib/circuits/comparators.circom”;

  我的文件夹结构是:

  <project root> \ poker

  所以我指定的包含路径仅适用于此结构。 您需要安装circomlib,这是介绍circom / snarkjs教程的附加要求。 从项目根文件夹使用此命令:

npm install --save circomlib

  巡回赛样式

  template Poker() {
   ... circuit body ...
}
component main = Poker();

  此结构与入门教程中的结构非常相似。 它是一个单独的类,并且声明了入口点。

  声明输入,输出和中间结果

  

  signal private input cards[5]; // Each 2..14
 signal input isSee; // 1 or 0
 signal input isFold; // 1 or 0
 signal input raise; // int
 signal output out; // 1 or 0

 // Intermediate results
 signal isBid;
 signal isRaise;
 signal hasChosen;

  

  手牌被声明为一个阵列:card[5]。 手牌仅由其面值表示,忽略花色。 Ace = 14;king=13;quuen= 12;jack= 11; 等等,直到2。手牌是私密输入,表明它必须保密。

  当然,出价选择是公开的,因为它将公开声明给其他参与者。 弃牌和看牌的选择表示为布尔值。 请注意,这不是显式声明。 Circom基于javascript,因此从数据中推断出变量类型。 加注输入将是一个整数,即实际的加注量。

  唯一的输出是out,并且值为1表示有效,0表示无效。一些中间值被声明为信号。 我们稍后会看到它们在行动。

  计算对子

  此代码块确定手牌是否包含一对。请注意,代码是很普通的javascript。它不包含任何约束声明,也不包含任何信号处理。

  就目前而言,预处理步骤产生单个变量numPAIrs。这将在后续步骤中使用。

  这里的逻辑是一个嵌套循环,依次考虑每张牌,并比较每个后续的牌,看看我们是否有一对。一旦找到一对,我们就添加到numPairs并退出。我们实际对于是对3还是对4并不感兴趣,或者还存在第二对牌。所有这些可能性都算作一对用于我们将要评估的约束的目的。另请注意,在这个精简版的javascript中似乎没有实现break。此代码只是通过强制迭代器高来触发退出。

   // Count pairs
 var numPairs = 0;
 for (var i=0; i<4; i ) {
    for (var j=i 1; j<5; j ) {
       if (cards[i] == cards[j]) {
          numPairs ;
          // break doesn’t work. Just force j and i to exit
          j = 5;
          i = 5;
       }
    }
 }

  约束条件

  介绍教程涵盖了信号操作:< - , - >,<==,==>和===。 这段代码中的新功能是组件。 组件是一次导入的类的实例,在本例中是从circomlib库导入的。 请注意调用它们的方式。 组件的输入信号(名为a,b,in等)使用信号运算符分配。 可以类似地使用组件的输出信号(通常命名为)。

  在这里,我们使用布尔运算符的组件。 查看circomlib代码以查看可用的代码。 有一个全面的函数库,例如散列操作,椭圆曲线操作等。

  因此,我们的约束被定义。 检查是否已做出选择(弃牌,看牌或加注)存在约束。 还有另一个要检查是否存在一对或已选择弃牌。 最后输出信号设置为1。

    // isRaise = (raise != 0)
 isRaise <-- (raise > 0);
 isBid <-- (isRaise || isSee);
 // Constraint: Must be either bid or fold: isBid XOR isFold = 1
 hasChosen <-- isBid   isFold — 2*isBid*isFold;
 hasChosen === 1;
 // Constraint: numPairs must be > 0 if isBid = 1
 var hasPairs = (numPairs > 0);
 component not3 = NOT();
 not3.in <-- isBid;
 component or2 = OR();
 or2.a <-- hasPairs;
 or2.b <-- not3.out;
 or2.out === 1;
 out <-- or2.out;

  运行证明

  步骤将在介绍教程中学习:

  

  circom poker.circom -o poker.json
snarkjs setup -o poker.json

  下一步需要提供输入。 我们来看一个示例输入文件(input.json):

{“cards”: [8, 7, 4, 7, 13], “isFold”: 0, “isSee”: 0, “raise”: 10 }

  手牌有一对,因此所有出价选项都可用。 玩家选择加注10.我们希望此输入有效。 手牌仍然是保密的,而其他投注是公开的。 我已经掩饰了玩家进入假手牌的可能性。 也许它可以通过散列手牌来处理,使哈希公开,从而允许在手牌的末尾进行确认。 在现实生活中的零知识证明中,程序的所有这些方面,包括巡回赛代码和设置,都需要由证明者和验证者事先商定。 验证者将坚持消除任何可能使证明者伪造他们的手牌的可能性。

  让我们通过接下来的步骤来生成证明:

  snarkjs calculatewitness -c poker.json
snarkjs proof

  证明生成性能将在O(n)时间内运行,其中n =约束数。 我们在这个例子中的限制太少,看不到这种情况。 有关更多约束的测试,请参见此处。

  现在由验证者运行验证:

  PS C:\dev\snarks\poker> snarkjs verify
OK

  凭借精心设计的ZK-SNARK,信任链可以追溯到设置。 证明者只能做一件事就是从验证步骤中获得“OK”结果,这就是创建一个满足所有约束的见证。

  希望这个对你有帮助。

  完整巡回赛代码

  include “../node_modules/circomlib/circuits/gates.circom”;
include “../node_modules/circomlib/circuits/comparators.circom”;
template Poker() {
 signal private input cards[5]; // Each 2..14
 signal input isSee; // 1 or 0
 signal input raise; // int
 signal input isFold; // 1 or 0
 signal output out; // 1 or 0
 // Intermediate results
 signal isBid;
 signal isRaise;
 signal hasChosen;
 // Count pairs
 var numPairs = 0;
 for (var i=0; i<4; i ) {
    for (var j=i 1; j<5; j ) {
       if (cards[i] == cards[j]) {
          numPairs ;
          // break doesn’t work. Just force j and i to exit
          j = 5;
          i = 5;
       }
    }
 }
 // isRaise = (raise != 0)
 isRaise <--(raise > 0);
 isBid <--(isRaise || isSee);
// Constraint: Must be either bid or fold: isBid XOR isFold = 1
 hasChosen <--isBid   isFold — 2*isBid*isFold;
 hasChosen === 1;
 // Constraint: numPairs must be > 0 if isBid = 1
 var hasPairs = (numPairs > 0);
 component not3 = NOT();
 not3.in <-- isBid;
 component or2 = OR();
 or2.a <-- hasPairs;
 or2.b <-- not3.out;
 or2.out === 1;
 out <-- or2.out;
}
component main = Poker();

作者:Geoff Lamperd

来源:medium

  同时欢迎进入我们知识星球社区;

  

  扫描下放二维码添加我,拉您进入技术交流群

  



关键词:比特币新闻 币牛牛

转载自比特币新闻网(www.btc268.com),提供比特币行情走势分析与数字货币投资炒币最新消息。

原文标题:区块链研究实验室 | zk-pork(zk-扑克)共识算法巡回赛模式

原文地址:http://www.btc268.com/qkl/js/6429.html

本文来源:区块链资讯编辑:btc268.com

本文仅代表作者个人观点,与本网站立场无关。

本网站转载信息目的在于传递更多信息。请读者仅作参考,投资有风险,入市须谨慎!

'); })();