最后更新:2020-04-07 11:50:22 手机定位技术交流文章

免责声明:本文旨在传递更多的市场信息,不构成任何投资建议。这篇文章仅代表作者的观点,并不代表火星财经的官方立场。
边肖:记住要注意
来源:定量基马河
我不知道看过电影《非诚勿扰》的人是否记得“发散终端”的奇妙发明。两个带把手的塑料片形成一个圆柱体。两个不同手的人把手伸进桶里,同时用剪刀和纸打孔,然后取出塑料片,根据猜谜游戏的结果决定听谁的。这种东西乍看起来很荒谬,但必须说它在一定程度上保证了猜谜游戏的绝对公正性。
对于一个猜谜游戏的专家来说,即使是短短的半秒钟时间也足以让他观察对手的手势,然后采取行动击败敌人,赢得猜谜游戏。因此,在玩猜谜游戏时,双方都会尽力确保同时出拳。然而,在正常情况下,“绝对同时性”并不存在,所以“发散终端”这一奇特的发明似乎有它的位置。但现在,区块链为类似的公平问题提供了一个更好的解决方案——承诺计划。
承诺计划
承诺方案是一种加密算法,允许某人承诺某个值,同时对其他人隐藏该值,并在以后显示给其他人。承诺方案中的值具有约束力,一旦提交,任何人都不能更改。该方案有两个阶段:提交阶段,需要选择和指定一个值;另一个是显示阶段,显示和检查值。事实上,它大约相当于“发散终端”的数字可记录版本。
如何在以太网车间搭建“发散终端”?
承诺方案的功能听起来很简单,但它的应用范围很广。接下来,让我们一起教你如何用承诺方案在以太网上创建“发散终端”的数字版本。对于那些想学习区块链技术的人来说,这也是一个有趣而实用的实践性学习。
首先,从构造函数和初始化值开始。我们需要给“玩家”提供选择。以猜谜游戏为例。选择有:石头、布和剪刀。之后,确保它们的功能只在各自的阶段运行。最后,创建一个代表玩家承诺的结构,并在构造函数中设置一些初始值、状态变量和事件。
具体操作如下:
合同RockPaperScissors {枚举选择{无,岩石,纸张,剪刀}枚举阶段{第一次提交,第二次提交,第一次显示,第二次显示,分发}结构提交办公室{地址播放地址;32承诺;选择选择;}事件提交(地址播放器);事件揭示(地址播放器,选择选项);事件支出(地址玩家,单位金额);//初始化参数输入公共赌注;uint公共存款;uint public revealSpan//州议员委员会办公室[2]公共球员;uint公共revealDeadline公共舞台=舞台。首先提交;构造函数(uint _bet,uint _deposit,uint _revealSpan)公共{ bet = _ bet存款= _存款;显示范围= _显示范围;}}完成上述步骤后,需要结合检查功能构建提交功能。该功能只允许在两个提交阶段中的一个阶段运行。接下来,我们可以确保它的内在价值随交易一起发送,并且任何额外的资金都被返回。完成检查后,我们可以存储承诺,发出提交事件,然后进入下一阶段。
具体操作如下:
函数提交(字节32提交)公共应付款{ //仅在提交阶段运行uint playerIndex如果(阶段==阶段。first commit)PlayerIndex = 0;否则,如果(阶段==阶段。second commit)playerIndex = 1;否则恢复(“两个玩家都已经玩过了”);uint commitAmount = bet +存款;要求(commitAmount & gt。=下注,“溢出错误”);要求(msg.value>。= commitAmount,“值必须大于提交金额”);//如果(消息值> 1,则返回转移的额外资金。commitAmount) { (bool成功,= msg . sender . call . value(msg . value-CoMMITamount)(“”);要求(成功,“呼叫失败”);} //存储承诺玩家[玩家索引] =承诺选择(消息发送者,承诺,选择。无);//发出提交事件发出提交(消息发送者);//如果我们是在第一次提交,那么移动到第二次如果(阶段==阶段。第一次提交)阶段=阶段。第二次提交;//否则我们必须已经在第二个,移动到第一个显示其他阶段=阶段。首先揭示;}接下来,从检查步骤转到显示功能。该功能仅在一个显示阶段运行,并且只接受有效的选择。然后,找到玩家数据,以便检查他们承诺的散列值,并确定它是否有效。如果哈希值有效,则存储该值,触发显示事件并进入下一阶段。具体操作如下:
函数显示(选择选项,由32个盲因子决定)公共{ //仅在显示阶段需要时运行(阶段==阶段。第一次显示||阶段==阶段。第二次展示,“不在展示阶段”);//只接受需要的有效选择(选择==选择。摇滚||选择==选择。纸张||选择==选择。剪刀,“无效选择”)。//查找播放器索引uint播放器索引;如果(玩家[0)。player address = = msg . sender)PlayerIndex = 0;否则如果(玩家[1)。player address = = msg . sender)playerIndex = 1;//如果未知玩家恢复,则恢复(“未知玩家”);//查找玩家数据命令存储命令=玩家[玩家索引];//检查哈希以确保承诺是正确的要求(keccak 256(ABI . encodepacked(msg . sender,choice,BlindingFactor))= = = CommitChoice . commission,“无效哈希”);//如果选择正确,则更新选择。选择=选择;//发出显示事件发出显示(发件人,选择选项);如果(阶段==阶段。第一次显示){ //如果这是第一次显示,请设置第二次显示的截止日期。要求(revealDeadline >。= block.number,“溢出错误”);//移动到第二显示阶段=阶段。第二次披露;} //如果我们正在进行第二次展示,请移动到分发阶段,否则阶段=阶段。分发;你最不需要的是分配函数。获奖者确定后,我们需要向他们支付奖金。该功能与前一步相同,只能在发布阶段或披露阶段完成后运行。在检查结果之后,确定获胜方,然后计算奖励,触发支付事件,将资金发送到获胜者的地址,并为下一场游戏重置状态。
具体操作如下:
功能发布公共{ //要发布,我们需要:// a)处于发布阶段或// b)仍处于第二个展示阶段,但已超过截止日期要求(阶段==阶段。分发||(阶段==阶段。第二次披露& amp& amp计算玩家的支付值。uint player 1支出;uint winningAmount =存款+ 2 *赌注;要求(赢款/存款== 2 *注,“溢出错误”);//如果两个玩家选择了相同的选项,如果(玩家[0),则返回他们的存款和赌注。choice =玩家[1。选择){玩家0支出=存款+赌注;玩家1支出=存款+赌注;} //如果只有一个玩家做出选择,他们就赢了,如果(玩家[0)。选择。无){玩家1支出=赢玩家计数;}否则如果(玩家[1)。选择。无){播放器0支出=赢款计数;}否则如果(玩家[0)。选择。摇滚){断言(玩家[1)。选择。纸||玩家[1]。选择。剪刀);如果(玩家[1)。选择。纸){ //岩石输给纸播放器0支出=存款;玩家1支出=赢玩家计数;}否则如果(玩家[1)。选择。剪刀){ //石头打剪刀player 0支出=赢款累计;玩家1支出=存款;} }否则如果(玩家[0)。选择。论文){断言(玩家[1)。选择。摇滚||玩家[1]。选择。剪刀);如果(玩家[1)。选择。摇滚){ //纸打摇滚播放器0支出=赢游戏计数;玩家1支出=存款;}否则如果(玩家[1)。选择。剪刀){ //剪刀播放器输纸0支出=存款;玩家1支出=赢玩家计数;} }否则如果(玩家[0)。选择。剪刀){断言(玩家[1)。选择。纸||玩家[1]。选择。摇滚);如果(玩家[1)。选择。岩石){ //剪刀输给岩石玩家0支出=存款;玩家1支出=赢玩家计数;}否则如果(玩家[1)。选择。纸){ //剪刀胜过纸播放器0支出=赢款。玩家1支出=存款;} }否则还原(“无效选择”);//发送支出,如果(玩家0支出& gt0) {(布尔成功,=玩家[0]。要求(成功,“呼叫失败”);放出支出(玩家[0)。player地址,player 0支出);}否则,如果(玩家1支出> 1;0) {(布尔成功,=玩家[1]。要求(成功,“呼叫失败”);放出支出(玩家[1)。playerAddress,player 1支出);} //重新设置播放状态,再次删除播放器;revealDeadline = 0;舞台=舞台。首先提交;完整合同的内容可以在公共编号中看到。
以太网广场是一系列公共块,这可能会导致管理私有数据的困难。然而,许多应用程序,如上面提到的猜谜游戏,需要隐藏值才能正常运行。因此,承诺计划已经成为一个非凡的解决方案。
踢马河:RaTiO Fintech合伙人,曾是一家证券公司的自营交易员,在海外对冲基金和大型国内投资机构担任基金经理超过10年,资深交易建模专家,是货币圈的大玩家。
请尊重创意!请注明转载来源。
本文由 在线网速测试 整理编辑,转载请注明出处。