lincode +

完美游戏

我很早就发现自己无法擅长玩任何一种游戏,包括电子游戏,桌游,棋牌等等。很多游戏都需要投入时间练习才能成为优秀玩家。我曾经的尝试都不够持续,也不怎么成功。所以我把兴趣转向观察各种游戏的有趣之处。

在了解比特币之后,我学习到这是一个对游戏也能产生影响的技术。将比特币和游戏结合,会产生一些我们从未见过的有趣变化。简单来讲,比特币可以改进游戏过程,使得游戏更为公平。这篇文章讨论使用比特币改进游戏的各种可能。看看是否有可能利用比特币设计出完美游戏。

什么是完美游戏呢?没有地域限制,各方胜率公平,无人可以作弊,结果必然执行。

Perfect Game

游戏分类

游戏有很多种分类。这里以人在游戏中参与程度做区分,从参与程度高到低如此排列:

参与程度是指:在游戏过程中,需要要投入到游戏中的人,以及人背后的社会因素的多少。足球,不仅需要球员的全面身体参与,球赛中团队协作会起决定性作用,而且大型足球比赛都是一个社会活动。众多观众的关注都在间接影响球员和裁判;棋牌类游戏,通过棋牌抽象了游戏过程。人的参与程度其实很少。甚至可以没有智力参与,只是完全靠运气。玩家除了走上赌桌之外,无需再做任何事情,或者说胜负都不再由参与者控制。 人的参与程度越高,游戏过程越难被分析和建模。现在我们对于棋牌类游戏,特别是赌场里常见的游戏都有精确的胜率分析。而对于足球比赛,虽然也有足彩,赌球之类预测市场,但是没有精确的胜负概率分析。我们无法重复一场完全一样的足球比赛。但从抽象意义上讲,我们却可以重复每一场牌局。

说明这种游戏分类的原因是,这篇文章主要涉及人的参与程度较低的牌类游戏。也就是我们在赌场中常见的游戏。这是因为即使有比特币,现在能完成的完美游戏的仍然是一些很简单的游戏。不过,这是一个很好的起点。我们最后还会探讨,让更复杂的游戏成为完美游戏,还需要做些什么。

在讨论完美游戏之前,我们先讨论一下赌场中常见的各种游戏的形态。谈谈它们的缺点。

现场游戏

中国境内只有澳门有合法的赌场。例如,葡京,永利,威尼斯。这些大赌场都不会作弊,而是靠概率差来挣钱。赌场里的所有游戏都被设计成赌场在长期概率上一定赚钱,赌客在长期概率上一定输钱。有庄家的游戏,例如21点(Blackjack),百家乐,庄家的胜率高。在没有庄家的游戏中,例如德州扑克,赌场则抽水。

越是玩家参与度低的游戏,赌场或者庄家的胜率越高。

所以,在赌场只要长时间赌就是会输钱的。唯一赢钱的方法,是在大数定律还没有发挥效果之时,胜率仍在波动之时就收手。当然,这需要对抗贪欲,极为克制,并且无法赚大钱。

我去过几次澳门。每次,我都会换几千元筹码。然后玩几局骰子,只买大小。在赢够午饭的钱的时候,大约是一千元之后,我就收手兑换筹码。然后,我会在赌场上面的购物中心吃午饭,把赢的钱都消费掉。

现场游戏,在双方对等的情况下,是可以避免作弊,获得公平胜率的。但赌场和玩家通常是不对等的,无法达到公平胜率。大赌场保证不作弊,但那只是他们单方面的保证,而且也是因为在胜率不公平的情况下,作弊变得没有必要。

在线游戏

在线游戏,其实是把赌场的游戏搬到线上。优点是可以随时随地玩。缺点是庄和玩家的不对等更为明显了。因为在线情况下,庄家作弊或者调整胜率更为便捷。你甚至不知道和你在一个牌桌上玩德州扑克的是另外一个玩家,还是一个可以换牌作弊的程序。

在线可证明公平游戏

一些在线游戏网站设计出了一种可证明公平的游戏,著名的例子是 www.satoshidice.com。他在实现原理上和比特币的发明者中本聪(satoshi)没有太多的关系,除了这个网站使用比特币充值。 网站提供的是最简单的骰子游戏。每次都会给出一个0到100的随机数。玩家在结果出现前,选择押注大于50.4999或者小于 49.5000。网站保证游戏“公平”,并且提供证明方法。在游戏“公平”的情况下,网站收益的是落入50.4999到49.5000 之间的随机数。所以玩家的预期收益是99%,虽然仍然为负,但还是比所有的赌场的预期收益高。网站声称预期收益是 99.5%,因为它保证有0.5%概率出现大奖。但这个大奖我一直没有遇到过,所以还没理解它送大奖的形式和方法。 如何证明游戏公平呢?骰子游戏其实可以被抽象为一个随机数生成器。只要能证明,喂给随机数生成器算法的种子数确实是随机的,而且游戏过程中该种子没有被修改,就可以说游戏没有作弊。

游戏之前,服务器会向玩家的浏览器下发一串字符串。这串字符是服务器生成的随机数种子的哈希值。然后,玩家的浏览器会上传一个随机数。服务器使用固定规则将自己的随机数和玩家上传的随机数组合,投入到随机数生成器,为一组筛子游戏提供随机数。如何证明服务器没有在得到玩家的上传的随机数之后更改自己的随机数,使得游戏有利于庄家而不利于玩家呢?可以使用服务器最开始提供的哈希值。玩家计算服务器提供的随机数的哈希值,就可以证实服务器是否更改了自己的随机数。

这利用到了哈希函数的单向性。服务器最开始提供的哈希值,其实是为了在不暴露自己的随机数的情况下,提供一种证明自己不会修改随机数的方法。

这其实只是证明游戏没有作弊。由于网站仍然还是一家赌场,游戏被设计成向庄家倾斜了1%的胜率。玩家还是没有和庄家达成完全平等的胜率。所以,这并不完全公平。而且,我们需要向网站充值,玩家仍然需要承担网站卷走所有充值的比特币的风险。

完美游戏

去中心化

可以看到,如果游戏中存在中心化机构,就难以达到公平。因为中心机构承担着某些职责,让中心机构长期免费承担责任并不合理,也无法持续。即使存在善意中心机构,它们不盈利,为了持续,玩家仍然需要支付费用维持中心机构的工作。在现实生活中的中心机构就是赌场,在线赌博网站,庄家,显然他们都不太善意。它们利用中心机构地位,制造对于玩家显著的不公平,从而获取非常高的利润。

所以,完美游戏应该是像比特币那样是去中心化的。去中心化一般会是网络结构。所以去中心化的游戏会是一个在线游戏。这就没有了地域限制。这自然符合了完美游戏的第一条。

下面让我们看看如何使用比特币设计一个像 www.satoshidice.com 一样的骰子游戏,但却是”完美的”。

比特币脚本

首先,需要理解每笔比特币交易其实并不只是简单地将比特币发送至一个比特币地址(或者说公钥地址)。而是以一个解锁脚本解锁区块链上一个未消费的交易输出(UTXO,Unspent Transaction Output)的锁定脚本,然后将从 UTXO 提取出来的比特币支付到另一个交易输出,这个交易输出仍然带有一段锁定脚本。只有可以解锁这个锁定脚本的人才可以使用支付给锁定脚本的比特币。如此循环下去。只不过比特币网络中,大部分交易(99.9%)都使用了最简单的锁定脚本:支付到一个比特币公钥地址。对应的解锁脚本也是最简单的:使用自己的私钥对之后的交易签名,证明拥有该公钥地址,从而提取锁定脚本中的比特币。

无人作弊,胜率公平

完美骰子游戏的执行过程如下:

步骤一和 www.satoshidice.com 一样,使用哈希函数保证玩家不会更改自己的随机数。在网络环境下,这是必须的。因为聪明的乔治也许会这样作弊:假装自己有网络延迟,在获知su27的随机数之后,算出一个必胜的非随机数,冒充随机数提交。

步骤二和三使用了比特币脚本编写了骰子游戏,并确保赌资只能支付给胜者。

确保支付

但这时这个游戏仍不完美。聪明的乔治也许又会想出另一个作弊方法:假装自己有网络延迟,在看到su27的随机数之后,算出自己必输之后,就不给出自己的随机数,而是落跑了。在不知道乔治的随机数x的情况下,su27其实是无法编制出解锁脚本提取比特币的。当然乔治也无法提取这笔只能支付给su27的比特币。这笔比特币会就此沉默,再也无人可以提取,除非乔治亮出自己的x

那么如何迫使乔治一定会亮出x呢?我们可以要求每个玩家在游戏之前,支付一笔等于或者大于赌资的保证金。以乔治的保证金为例:这笔保证金需要创建两笔特别的比特币交易。第一笔交易,乔治向一段锁定脚本支付保证金。这段锁定脚本可以在

以下两种情况中任何一种被解锁提取:

这笔交易的脚本可能如下:

    scriptPubKey:
        OP_IF
            <GeorgePubKey> OP_CHECKSIG <su27PubKey> OP_CHECKSIG
        OP_ELSE
            <GeorgePubKey> OP_CHECKSIG OP_HASH <H(x)> OP_EQUAL
        OP_END

    scriptSig for Case 1:
        <su27Signature> <GeorgeSignature> 0
    scriptSig for case 2:
        x <GeorgeSignature> 1    

然后,乔治和su27共同签署第二笔比特币交易,将保证金支付给su27。也就是执行了保证金锁定脚本情况一。但是这笔交易会有一个特别的参数nLockTime。有这个参数的交易会延迟到锁定时间之后再被装入区块链,成为确定的交易。 对乔治而言,阻止保证金被支付给su27的唯一方法是:在锁定时间到来之前,亮出自己的随机数x。即执行情况二,提取保证金,将其支付到自己控制的比特币地址。这样会使得乔治和su27共同签署的将保证金支付给su27的交易成为一个非法的重复消费(double spend)。矿工会忽略这笔非法交易。保证金实际上被设计为故意制造了一组重复消费。然后,让比特币机制保证只有一种情况会被执行。

su27也需要做相同事情。来保证su27在输的情况下也会支付赌资。

所以,为了使这个游戏最终成为完美游戏,我们需要添加在游戏最开始添加`步骤零:每位玩家创建两个比特币交易,支付保证金。

简单分析

在这个完美游戏中,我们利用哈希函数的单向性,保证玩家无法作弊;我们在比特币脚本中编写了这个简单的骰子游戏;我们利用比特币的特性(无重复消费,交易锁定时间)设计了保证金制度,确保了输家必然会支付,赢家必然可以拿到钱。整个过程,除了比特币之外,我们没有用到任何其他工具。由于比特币是去中心化的,这个完美游戏也是去中心化的。

更复杂的完美游戏

我们肯定会问,除了骰子这样的简单游戏,复杂一些的游戏例如,德州扑克,百家乐,甚至魔兽争霸是否可以被设计为完美游戏呢?

Data Feeds

首先,比特币脚本不可能实现上述仍然一种复杂游戏。这容易理解。比特币被设计成一种数字货币。出于安全考虑,比特币脚本被设计为一个简单的功能受限的非图灵完备语言。只能执行有限的步数,使用有限的存储空间。 设计复杂完美游戏时,比特币只能用于保证结果被执行:输家会支付赌资,赢家能得到奖励。我们需要考虑如何将游戏结果和比特币网络连接即可。这可以使用一种名为Data Feeds的机制。Data Feeds根据游戏结果,提供比特币网络可以理解的输出。

这个Data Feeds实际上是一个裁判。他读取游戏系统的结果,将其翻译成比特币网络可以理解的信息格式。例如,乔治和su27在玩德州扑克。他们需要将赌资支付到一个由 Data Feeds 提供的锁定脚本。在 Data Feeds 注册游戏事件后,Data Feeds 对游戏的结果创建两对私钥公钥对,假设乔治胜为“Yes”;su27胜为“No”。公钥在注册时即被发布。游戏结束时,Data Feeds 根据结果发布对应的私钥。锁定脚本被设计为按照是“Yes”还是“No”被验证而将解锁权给乔治,或者su27。根据结果,胜利者拿着 Data Feeds 提供的私钥,并使用自己的私钥就可以解锁最开始发送给 Data Feeds 提供的锁定脚本,签署可以提取赌资的交易。

这看起来是可行,但有一个问题:Data Feeds实际上是一个中心点。任何中心点都牵涉到信任问题。我们凭什么信任这个中心机构呢?如何相信它不会更改游戏的胜负结果?这个问题难以回答。 但是这个中心节点参与度并不大。他只是将各种现实世界的事件转化一种格式。维护这个系统的成本不高。也很容易监督它是否作弊。我们是有办法使用少量的社会学方法保证其中立的。

公平的游戏系统

我们还需要一个游戏系统平台。现在的在线游戏系统都是中心化的。例如,浩方电竞平台,和QQ游戏室。我们之前多次讨论过中心化平台的问题。中心化系统需要收取佣金,佣金存放在中心化系统总是存在丢失的风险的,中心化系统也更容易作弊。 那么,是否可以设计一个去中心化的游戏系统呢?理论上是可以的,虽然有一些技术上的难度。回合制双人对战游戏,例如,围棋,象棋是比较容易使用P2P的方式实现。而在多人非回合制游戏,例如魔兽争霸对战中,多方交换数据,快速达成共识,并不是一件容易解决的事情。

简单总结

在拥有公平游戏系统情况下,利用 Data Feeds 机制,可以将游戏结果和比特币网络连接。这看起来接近完美游戏了,但是我们仍然有以下问题:

所以,如果我们只考虑纯技术问题,认为提高 Data Feeds 的可信度是一个社会技术问题。我们可以认为:在技术上,复杂的完美游戏是能够实现的。

参考

点击查看评论

Blog

Opinion

Project