背景
在线博彩一直是一个蓬勃发展,屡禁不止的行业(在很多国家属于合法行业)。然而,对于赌徒来说,除了可能受到可能的监管限制以外,“庄家”作弊或者跑路也是其可能遭受损失的一大原因。区块链集去中心化,不可篡改,可追溯等特性于一身,是解决类似信任问题的天然方法。
优势
在线博彩主要涉及到的重要数据包括,游戏结果,输赢判定,支付结算等。区块链的优势主要在于:
1. 透明度和信任。
中心化的应用的数据完全是黑盒,用户权益很难保证。而基于区块链的智能合约技术,由于不可篡改和公开透明性,任意用户均可审计合约代码和查看交易数据。
2. 减少诈骗。
对于基于多节点共同维护的区块链账本而言,任何人无法单方面篡改数据,而通过图灵完备的智能合约添加相关限制,去除兑付风险。
3. 加密货币支付。
加密货币是区块链的血液,所有结算可直接通过合约代币直接结算。
4. 匿名性。
基于公私钥技术,任何人可以随意生成钱包地址,来作为用户身份标识,不需要受到任何监管以及KYC验证。通过掌控钱包的私钥,用户可以完全控制这个账户的行为。当然,也正是这种便捷的特性,一旦用户丢失私钥将彻底失去账户控制权,丢失钱包数字资产。此外,由于监管机构无法进行有效监管,加密货币在很多国家被禁止流通。
5. 增加可访问性。
中心化的博彩网站可直接通过封锁IP、域名等进行查封,此外,用户很多时候需要通过中间代理商来进行投注。区块链的多中心特性,使整个区块链网络始终具有可用性,用户可直接向智能合约发起交易,不受任何第三方约束。
公平性证明
区块链技术的核心在于密码学上的可证明性,在应用到博彩行业时,最重要的数据就是开奖结果。因此,如何证明这个开奖结果是基于一个绝对公平的随机源,不管是庄家还是玩家都无法作弊呢?
笔者研究了bustabit和satoshidice等多个botcoin gambling项目,其原理都大同小异。
流程设计
- 生成服务器种子序列{
$serverSeed_i$
}。假设一个游戏有N
局,那么服务器先生成一个$serverSeed_0$
, 然后连续使用hash
函数N
次,得到$serverSeed_0$
,$serverSeed_1$
,...,$serverSeed_N$
,此时公布$serverSeed_N$
出去,使用$serverSeed_{N-1}$
作为第一局的服务器种子 - 选定一个未发生的随机源作为
clientSeed
- 基于1,2生成的两个种子数据,通过
hash
运算,计算游戏结果。这里以bustabit为例:
function getResult(serverSeed, clientSeed) {
var hash = crypto.createHmac('sha256', serverSeed).update(clientSeed).digest('hex');
// In 1 of 101 games the game crashes instantly.
if (divisible(hash, 101))
return 0;
// Use the most significant 52-bit from the hash to calculate the crash point
var h = parseInt(hash.slice(0,52/4),16);
var e = Math.pow(2,52);
return Math.floor((100 * e - h) / (e - h));
};
- 公布游戏结果以及本轮使用的
serverSeed
,并使用serverSeed
链的前一个种子来作为新的一局的serverseed
补充说明:这里
serverSeed
一般可选择某个比特币钱包的私钥来作为初始值计算hash
链。而对于确定clientSeed
所需的未发生的公共可信的随机源的选取,可选取未来某个比特币区块的blockHeight
,亦或者未到达的某一天的股市点数的hash
值,等等。
公平性分析
基于上述的流程分析不难看出,“庄家”在确定了serverSeed
的hash
链之后,此时由于clientSeed
尚未确定,因此他无法通过筛选合适的{$serverSeed_i$
}序列来使得开奖结果更符合自己的利益。
而一旦clientSeed
的值确定下来,由于“庄家”一早就公布了$serverSeed_N$
,已无法更改或重置整个{$serverSeed_i$
}序列(基于hash
函数的不可碰撞性)。
当游戏结束时,服务器公布了本轮用到的serverSeed
, 用户可验证:
- 基于该
serverSeed
和clientSeed
,计算出来的游戏结果是否和开奖结果相符; - 由于上一轮游戏公布的
$serverSeed_{i+1}$
正是本轮的服务器种子的hash
值,因此用户可验证以下公式是否成立
hash(serverSeed_{i})==serverSeed_{i+1}
风险控制
我们不妨分析下流程设计中提到的getResult
函数的逻辑。首先基于本轮的serverSeed
和clientSeed
经过hash
运算得到一个名为hash
的变量,取其16进制表示的前13位(即2进制的前52位),因此它的值在0到$2^{52}$
之间。而返回值是100到$2^{52}$
之间的一个双曲函数:

通过定积分计算,其均值在36左右,而且当生成的h
值越接近$2^{52}$
时,取值接近无穷大。因此,庄家添加了以下风控逻辑:
Under some circumstances, the server will force people to cash out.
The most common reason is that the game multiplier has gotten so large that we are risking too much of our bankroll (1.125%). If a player has won more than 0.75% of the bankroll, that player is also forced to cash out his winnings.
Another possible reason is unexpected server problems. The server attempts to cash everyone out and then pause once it encounters an unexpected issue.
考虑到双曲函数的特性,在绝大部分取值区域得到的计算结果比较平均,添加以上风控逻辑,对单局用户整体收益阀值和单用户收益阀值做控制,一旦超出就强制结束,极大的降低了赔付成本。而用户在单局盈利较大的情况下对此也不会有明显的反感。
总结
区块链的透明化,代币支付能有效解决博彩行业的诸多痛点,目前博彩应用也是dapp应用的一大方向。对于bustabit这种半中心化的博彩项目来说,如何自证公平性是最重要的问题。本文分析了其公平性设计,从理论上保证了“庄家”无作弊的可能。随机源的选取,哈希链种子序列的设计,以及开奖结果的设计,风控逻辑等,都有其精妙之处,值得学习。
参考文献
bustabit1.0 seeding event topic
网友评论