EOS合约内查询其他表

背景

最近在准备在一款游戏…

需要发牌…(涉及到发牌这种游戏,如果需要公平性做的很好的话,需要考虑下面几个问题

  1. 生成牌的随机数不能被预测
  2. 只有玩家自己才能看到自己的牌
  3. 庄家玩法看到其他人的牌

随机数生成

随机数还是使用2段延时+用户账号来随机出来的

只有玩家能看到自己的牌

使用用户的公钥加密用户的牌就可以了…(EOS目前没有现成的代码,需要自己写…)

庄家看不到其他人的牌

首先,如果没有公共牌的话,则庄家只需要在玩家打出牌的时候,验证下他是否有这张牌就可以了…

怎么验证呢?

  • 零知识证明 感觉可以,但是好像代码会比较复杂…而且密码也学的不好…

  • 把他的牌存在某个表里面…(然后他打的时候,验证下…)

但是这样就有一个问题,那就是别人也可以直接查这个表,就能拿到每个人的牌了…

也就可以作弊了…(当然,开发者肯定更容易作弊…)

然后和朋友聊天的时候,了解其实可以让某个表不生成abi,这样的话,外部就会无法访问到这个表了…

吧abi这行删掉,发现确实外部无法访问到这个表…

但是通过合约调用呢?

定义了同样的数据结构,然后可以发现,在合约内就可以调用了…

测试 改变数据位置

发现拿到的数据就错了…(所以如果要拿到正确的数据的话,需要和 原来的数据定义一模一样)

测试 删除一个字段

发现拿到的数据错了…但是还是可以查到数据

测试 删除主键

会编译无法通过

测试 随便定义一个主键

发现拿到的数据错了…但是还是可以查到数据

测试 拿到的字段 比原来的多

编译可以过,但是查询会报错…

结论

所以使用去掉abi的方法是可以的…

前提是那段存数据的表 不开源,并且可以定义差不多的几个字段,然后每个字段都加密。。。

让那些想拿你数据的人有机会会拿错,并且每次存在哪个字段都不随机的…

当然这种方式还是防止不了大神。。。毕竟有人直接看wasm的代码。。。

最好的方式还是使用 零知识证明 等等…(学密码学去了…

推荐文章