除了抛币协议,加密领域还有一个很有趣的课题和游戏的去中心化直接相关,就是Mental Poker协议,中文一般翻译成“智力扑克”,但我认为这个翻译并不准确,“Mental Poker”一词来源于1979年的一篇论文《Mental Poker》,作者是Shamir,Rivest和Adleman(就是发明RSA算法的三位大牛),里面这么描述这个场景:

        Mental这个词在这里应该是意念或者思维的意思,和盲棋是对应的,但中文中并没有“意念扑克”这样的词,所以翻译成“盲牌协议”其实更贴切一些。和象棋围棋这样的信息公开游戏不同,扑克游戏大部分都有发牌环节,玩家手中的牌是保密的,所以两位象棋大师完全可以在电话里通过“炮二平五、马八进七”来一局象棋,但扑克牌就不行了,你说手里有一对Ace,我怎么知道你没撒谎呢?
        所以Mental Poker协议最关键的就是洗牌和发牌这个流程,这个过程既要保证是随机和公平的,又要保证玩家的手牌的私密性,在这篇论文里给了一个巧妙的方法,先举个形象的例子:

Alice想把一件珍宝通过信使送给Bob,但信使非常不可靠,没有锁进箱子的东西他一定会偷的,并且如果让信使拿到钥匙他也一定会去打开锁的,那在这种情况下Alice和Bob有什么办法安全的把宝物送给对方呢?答案是:Alice用箱子把宝物装进去,然后用自己的锁把箱子锁起来送给Bob,Bob收到箱子后再加上一把自己的锁,把箱子再送回给Alice,Alice收到后打开自己的锁送回给Bob,最后Bob收到箱子之后再打开自己的所,就可以拿到宝物了。

        按这个思路换成扑克牌游戏,假设Alice和Bob要玩一局扑克牌游戏,开局的时候他们都要一副牌(52张)中各抽取5张,那么过程就是这样:
        1. Alice负责洗牌,她首先生成一个长度为52的数组,数组的每个元素表示一张牌,然后用她的加密算法\(E_A\)对这些元素进行加密,再把数组顺序打乱(洗牌)之后\(E_A(M)\)发送给下Bob
        2. Bob收到这些牌之后并不认识,因为上面都有Alice的锁,所以他只能随机挑出5张牌,用自己的加密算法之后生成\(E_B(E_A(M)))\)送给Alice
        3. Alice收到这5张牌之后用自己的解密函数解密,生成\(D_A(E_B(E_A(M))))=E_B(M)\)送还给Bob
        4. Bob收到后进行解密,得到\(D_B(E_B(M))=M\)作为自己的牌
        5. 最后Bob从剩下的47张牌中随机挑出5张送给Alice,Alice直接解密得到\(D_A(E_A(M))=M\)作为她的牌
        6. 发牌结束后双方交换密钥以验证此过程没有作弊


        这个协议中的加密函数需要满足“可交换性”,也就是对一份数据进行多次加密,加密的次序不影响最后的结果:
$$
\displaylines{E_A(E_B(M))=E_B(E_A(M))}
$$
        这样在第3步过程中$$
D_A(E_B(E_A(M)))=D_A(E_A(E_B(M)))=E_B(M)
$$
        一般的加密算法并不满足这个特性,但同模的RSA算法可以。正如前面文章介绍的那样,RSA算法其实是生成一对密钥\(\{e,d\}\),使其满足\(ed\equiv1\pmod {\phi(n)}\),其中\(n\)是两个大质数的乘积。那么一个\(n\)其实可以生成多个密钥对,那么这些同模的RSA算法就满足上面所说的交换律。比如使用同模的两对密钥\(\{e_1,d_1\}, \{e_2,d_2\}\)两次对\(M\)进行加密$$
\displaystyle{E_2(E_1(M))=({M^{e_1}\mod n})^{e_2}\mod n=M^{e_1\times e_2}\mod n}
$$        可见加密顺序并不影响结果,这个协议可以很容易扩展到多人扑克游戏,多人之后,第一个玩家\(\mathcal{P}_1\)比较特殊,他承担洗牌的任务,然后加密后发给下一个玩家\(\mathcal{P}_2\),执行协议中第2到第4步,从收到的牌中随机挑出自己要的牌,加密后送给\(\mathcal{P}_1\)解密,然后把剩下的牌发给下一个玩家\(\mathcal{P}_3\),\(\mathcal{P}_3\)同样执行第2到4步,以此类推,最后\(\mathcal{P}_1\)所需要的牌由最后一个玩家负责抽取。
        这个算法公开后,很快就有人发现其中的漏洞,就是RSA算法很可能会泄露扑克牌的信息!如果牌面数字\(M\)是\(n\)的二次剩余,那么加密后的信息\(C=M^e\mod n\)也是\(n\)的二次剩余,尽管这种泄露微乎其微(可能只有一个bit),但在某些关键场合也是致命的,所以后来有很多种其他Mental Poker协议出现,有兴趣的朋友可以参考这篇文章


        有意思的是,尽管目前已经有多种严密的算法来解决扑克牌的去中心化问题,但我们仍然没有看到真的有产品在实际中使用这些协议。这是由于如果想实现真正的去中心化游戏平台,除了刚才说的这些安全协议之外,还需要有一大堆辅助的服务,比如P2P网络基础,玩家匹配,积分,支付等系统,这些系统的复杂度还很难实现去中心化。但区块链和比特币出现之后情况就不同了,2012年,一个使用比特币进行赌博的游戏平台中本聪筛子出现了,玩法很简单,玩家给系统提供的比特币钱包转账一定金额的比特币,这笔交易会在区块链网络里会产生一条公开的记录,系统根据这条交易记录的ID计算出一个0到65535之间的幸运数字,系统根据这个数字按照一定的赔率付给玩家比特币,或者收走玩家的比特币。
        不难看出,中本聪筛子其实是基于它的中心系统运行的,而以太坊和智能合约出现之后我们距离去中心化又前进了一步,以太坊同样也是以区块链作为基础的去中心化网络,不同的是,它可以支持一种叫做智能合约的特殊数据在链上运行,一份智能合约可以看作是一段代码,比如两个人要打一个赌,那么双方可以把赌金和获胜的判断条件写到智能合约代码中,发布到以太坊上,由系统来判断哪方获胜并自动把赌金转给获胜的一方,由于这个判断的运行是放在整个区块链上运行的,所以可以视作是去中心化的。
        比如etheroll这个平台就是一个利用以太坊智能合约进行赌博的平台,它的玩法和中本聪筛子很类似,也是挑选一个赔率,向指定钱包发送一定数量的以太币开始游戏,然后这个系统会调用发送一份智能合约到以太坊上,合约里会产生一个0到100的随机数,只要你的随机数小于赔率对应的数值,那么系统就会按照赔率付给你对应得以太币。但是,这个随机数如何产生呢?这就要用到以太坊中的“预言机”机制,简单来说,预言机其实就是区块链和显示网络的“连接器”,在普通的智能合约代码里,是不能调用网络函数的,这是由于区块链数据一旦生成,就不能再做任何修改,但预言机提供了一些特殊的合约,其他合约可以通过调用其代码来获取互联网数据,比如随机数、股票数据、天气甚至欧洲杯的结果,在Etheroll的智能合约代码里,就是通过调用www.oraclize.it提供的智能合约,从random.org获取的随机数,而这两个机构都是大家公信的机构。

        但智能合约是有高昂的代价的,根据智能合约的复杂程序,编写者需要支付一定数量的费用(称为Gas)才能提交合约,而且以目前以太坊的机制,即使像扔筛子这样的一次性简单操作,所需要编写的智能合约已经非常复杂了。如果想完成一个去中心化的德州扑克几乎是完全不可能的,就看有没有新的技术平台能够实现这一点了。

1 thought on “从抛币协议到智能合约(二)

发表评论

邮箱地址不会被公开。

This site uses Akismet to reduce spam. Learn how your comment data is processed.