背景
最近在准备在一款游戏…
需要发牌…(涉及到发牌这种游戏,如果需要公平性做的很好的话,需要考虑下面几个问题
- 生成牌的随机数不能被预测
- 只有玩家自己才能看到自己的牌
- 庄家玩法看到其他人的牌
随机数生成
随机数还是使用2段延时+用户账号来随机出来的
只有玩家能看到自己的牌
使用用户的公钥加密用户的牌就可以了…(EOS目前没有现成的代码,需要自己写…)
庄家看不到其他人的牌
首先,如果没有公共牌的话,则庄家只需要在玩家打出牌的时候,验证下他是否有这张牌就可以了…
怎么验证呢?
零知识证明 感觉可以,但是好像代码会比较复杂…而且密码也学的不好…
把他的牌存在某个表里面…(然后他打的时候,验证下…)
但是这样就有一个问题,那就是别人也可以直接查这个表,就能拿到每个人的牌了…
也就可以作弊了…(当然,开发者肯定更容易作弊…)
然后和朋友聊天的时候,了解其实可以让某个表不生成abi,这样的话,外部就会无法访问到这个表了…
吧abi这行删掉,发现确实外部无法访问到这个表…
但是通过合约调用呢?
定义了同样的数据结构,然后可以发现,在合约内就可以调用了…
测试 改变数据位置
发现拿到的数据就错了…(所以如果要拿到正确的数据的话,需要和 原来的数据定义一模一样)
测试 删除一个字段
发现拿到的数据错了…但是还是可以查到数据
测试 删除主键
会编译无法通过
测试 随便定义一个主键
发现拿到的数据错了…但是还是可以查到数据
测试 拿到的字段 比原来的多
编译可以过,但是查询会报错…
结论
所以使用去掉abi的方法是可以的…
前提是那段存数据的表 不开源,并且可以定义差不多的几个字段,然后每个字段都加密。。。
让那些想拿你数据的人有机会会拿错,并且每次存在哪个字段都不随机的…
当然这种方式还是防止不了大神。。。毕竟有人直接看wasm的代码。。。
最好的方式还是使用 零知识证明 等等…(学密码学去了…
本文作者:高金
本文地址: https://igaojin.me/2018/12/15/EOS合约内查询其他表/
版权声明:转载请注明出处!