据 IMEOS 报道,EOSBet 电报消息称, EOSBet 再次遭到黑客攻击,资金被盗近14万,目前已被交易所锁定,从今日下午两点开始,EOSBet 合约服务暂停。攻击者利用EOSBet 合约在检验收款方时存在的漏洞,伪造转账通知,给自己的智能合约账号(eosbethack)转真EOS。总计从EOSBet 获利约14万个EOS。黑客曾使用 whoiswinner1 账号进行攻击尝试。
EOSBet 是运用区块链技术基于EOS 公链开发的一款菠菜游戏。
上线仅两个月,盈利近百万的 EOSBet 昨日又因营销活动推向了一个小高潮,日活突破千人, 稳坐 EOS DAPP 当日榜首。
不过好日子才兴奋了一天, EOSBet却因代码漏洞,再次被黑客攻击了。
这是 EOSBet 上线以来第三次被攻击了!
EOSBet是投机客的天堂,却更是黑客的温床。我们来看看EOSBet存在的问题。
EOSBet工作流程图
ABI
"actions": [{
"name":"initcontract",
"type":"initcontract",
"ricardian_contract": ""
},{
"name":"newrandkey",
"type":"newrandkey",
"ricardian_contract": ""
},{
"name":"suspendbet",
"type":"suspendbet",
"ricardian_contract": ""
},{
"name":"resolvebet",
"type":"resolvebet",
"ricardian_contract": ""
},{
"name":"betreceipt",
"type":"betreceipt",
"ricardian_contract": ""
},{
"name":"refundbet",
"type":"refundbet",
"ricardian_contract": ""
}
]
流程与代码的解释
用户发送EOS Token到合约eosbetdice11
eosbetcasino@random调用合约函数 resolvebet 触发合约决定输赢,
绕了一圈, 最终输赢完全由庄家后台程序用账户eosbetcasino@random决定.
混淆耳目的技术:
以上为官网的故弄玄虚, 事实上, eos与ethereum一样, 并不能在链上产生不可预知的随机数合约代码量不大(见下面命令行工具), 即便不开源, 也不难看懂, 为何还要装神弄鬼, 糊弄用户?
命令行工具
#获取合约ABI和wast
cleos get code -a dice.abi -cdice.wast eosbetdice11
正确且唯一的对赌方式
https://developers.eos.io/eosio-cpp/docs/random-number-generation
必须经过以下步骤:
双方使用各自的<秘钥>将 <原始数据> 加密后发送到区块链.
双方数据都送达, 则锁定数据, 并进入决定阶段.
决定阶段, 双方各发送自己的 <秘钥>到区块链
区块链使用双方的<秘钥>, 解密出各自<原始数据>, 决定最终结果, 并执行结果
BM在这里讨论过:
https://eosio.stackexchange.com/questions/41/how-can-i-generate-random-numbers-inside-a-smart-contract
关于随机数
我们程序员往往把区块链上随机数的产生看作技术问题, 其实能否产生它, 是个数学问题:
y=f(x) 不管方程f多复杂, 给定一个x都最多只有一个确定的y. 所以y=random(seed),你必须让seed具有不可预见性. 而我们知道计算机世界是没有随机数的(通常用系统时钟作seed), 对于区块链, 在没有任何输入参数的情况下, 链上一切都是注定的, 你若想自己不被预知, 在条件固定之前,必须至少保留一项只有你知道的参数
而对于赌博方程, 用户的seed在开牌之前, 只能用户自己知道.
如果你不想思考数学问题
试想, 如果有那么简单优雅的方法(像EOSBet声称的并且也是这么做的, 不需要用户两次参与的), 那么像github/EOSIO/dice这样做, 是多么的丑陋和多此一举!
最后
无论你用什么技术, 都改变不了简单的数学逻辑, 即: 你必须让用户在开点之前, 保留seed(或seed的参数: 秘钥), 然后锁定后再提交.
以上逻辑说明,EOSBet 是玩家们的绞肉机,黑客的温床