比特币的蒙提霍尔问题

把钱放在嘴边

我们在比特币上建立了蒙提霍尔问题模拟。 如果您知道概率谜题的正确答案,不仅炫耀您的数学技能,还会获得金钱奖励。 它完全无需信任地在链上运行。

蒙提霍尔问题

蒙提霍尔问题(三门问题)是一个以蒙提霍尔命名的概率谜题,蒙提霍尔是电视节目《让我们做个交易》的原主持人。 这是一个著名的反直觉统计难题,其解决方案非常荒谬,即使被证明是真的,大多数人也拒绝相信。 它的工作原理如下:

假设你在参加一个游戏节目,你可以选择三扇门:一扇门后面是一辆汽车; 在其他人之后,山羊。 你选择一扇门,比如 1 号,知道门后面是什么的主持人打开另一扇门,比如 3 号,里面有一只山羊。 然后他对你说,“你想选择 2 号门吗?” 改变你的选择对你有利吗?

令人惊讶的是,赔率不是 50–50。 如果你换门,你会赢概率是 2/3 ! 有许多解释数学的文章/视频,我们不在这里深入探讨。 下面列出了一些很好的例子。

  • Monty Hall Problem - Numberphile
  • 使用 Python 模拟蒙提霍尔问题

展示位置的可能性

Stay vs. Switch 的可能场景

密码学的门

为了在比特币中模拟 Monty Hall,我们需要一种方法来隐藏汽车/山羊,这样:

  1. 玩家看不到每扇门后面的东西;
  2. 比赛开始后,主持人不能移动汽车/山羊。

承诺方案是实现这两者的标准方法。 我们使用单个位 1 表示汽车,位 0 表示山羊。 像往常一样,我们还在位前添加一个随机数,以防止暴力攻击。

实现

我们使用 scryptTS(一种 TypeScript DSL)在比特币智能合约中实施了蒙提霍尔问题。 在游戏开始之前,玩家和主机都将等量的比特币锁定到以下合约中。 部署合约后,游戏将按以下步骤进行:

  1. 玩家选择一扇门,比如 0 号门,当然希望有车
  2. 主持人打开一扇门,另外两扇门里有一只山羊
  3. 玩家决定是坚持使用 0 号门(最初的猜测)还是切换到剩余的未打开的门
  4. 主持人揭晓结果:如果玩家选中有车的门,他拿走合约中的所有比特币; 否则主持人拿走。
// this contract simulates the Monty Hall problem
class MontyHall extends SmartContract {@prop()player: PubKey@prop()host: PubKey@prop(true)step: bigint// player's choice@prop(true)choice: bigint// door opened by host@prop(true)openedDoor: bigint// number of doorsstatic readonly N: number = 3// what's behind each door@prop()doorHashes: FixedArray<Sha256, 3>constructor(player: PubKey,host: PubKey,doorHashes: FixedArray<Sha256, 3>) {super(...arguments)this.player = playerthis.host = hostthis.step = 0nthis.choice = -1nthis.openedDoor = -1nthis.doorHashes = doorHashes}// step 1: the player chooses initially a random door that s/he believes has the prize@method()public choose(choice: bigint, sig: Sig) {assert(++this.step == 1n, 'step number unexpected')this.choice = choice// game goes onassert(this.ctx.hashOutputs == hash256(this.buildStateOutput(this.ctx.utxo.value)), 'hashOutputs check failed')}// step 2: host opens a goat door@method()public open(goatDoorNum: bigint, behindDoor: ByteString, sig: Sig) {assert(++this.step == 2n, 'step number unexpected')this.openedDoor = goatDoorNumconst goatDoorHash = this.doorHashes[Number(goatDoorNum)]assert(sha256(behindDoor) == goatDoorHash)assert(!this.isCar(behindDoor), "expect goat, but got car")assert(this.ctx.hashOutputs == hash256(this.buildStateOutput(this.ctx.utxo.value)), 'hashOutputs check failed')}// step 3: player stays or switches@method()public stay(stay: boolean, sig: Sig) {assert(++this.step == 3n, 'step number unexpected')if (!stay) {// switchthis.choice = this.findUnopenedDoor()}assert(this.ctx.hashOutputs == hash256(this.buildStateOutput(this.ctx.utxo.value)), 'hashOutputs check failed')}// step 4: reveal@method()public reveal(behindDoor: ByteString) {assert(++this.step == 4n, 'step number unexpected')const doorHash = this.doorHashes[Number(this.choice)]assert(sha256(behindDoor) == doorHash)// does the play choose a door, behind which is a carconst won = this.isCar(behindDoor)const winner = won ? this.player : this.host// pay full amount to winnerconst winnerScript: ByteString = Utils.buildPublicKeyHashScript(winner)const payoutOutput: ByteString = Utils.buildOutput(winnerScript, this.ctx.utxo.value)assert(this.ctx.hashOutputs == hash256(payoutOutput))}// if last bit is set, it is a car; otherwise, a goat@method()isCar(behindDoor: ByteString): boolean {return unpack(behindDoor) % 2n == 1n}// find the remaining unopened door@method()findUnopenedDoor(): bigint {let result: bigint = -1nfor (let i = 0n; i < MontyHall.N; i++) {if (i != this.choice && i != this.openedDoor)result = i}return result}
}
Montyhall 合约

在第 25 行,主持人提交汽车的位置。 他通过打开 SHA256 承诺“打开”了一扇门。 在每个公共方法的开始,我们确保按顺序执行正确的步骤。 第 51 行使用有状态合约技术。

如果游戏重复多次,一个玩家选择一直留下会赢大约 1/3 的时间,而如果他总是切换,他的获胜几率可以提高到 2/3

主持人作弊怎么办?

主持人作弊有两种可能的方式:

  1. 如果玩家在步骤 4 中正确选择了汽车,他拒绝开门;

  2. 他把三只山羊放在门后,但没有车。

为防止(1),我们可以使用定时承诺方案,如果主持人在截止日期前未打开承诺,则没收主持人的押金。

(2) 同样可以预防。 主持人最终必须打开所有三扇门,如果它们都是山羊,他将失去押金。 或者他可以使用零知识证明让玩家相信门后确实有一辆车,但没有透露它在哪扇门后面。


[1] 为了便于说明,我们忽略了交易费用,这可以很容易地在合同中说明,例如,通过使用 ANYONECANPAY。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/140106.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣-234.回文链表

Idea 用一个数组或者字符串将链表中的值依次存入&#xff0c;然后利用数组遍历方法比较双端元素 AC Code class Solution { public:bool isPalindrome(ListNode* head) {string s "";ListNode* p head;while(p ! nullptr){s.append(to_string(p->val));p p-&g…

SQL 如何提取多级分类目录

前言 POI数据处理&#xff0c;原始数据为csv格式&#xff0c;整理入库至PostGreSQL&#xff0c;本例使用PostGreSQL13版本。 一、POI POI&#xff08;一般作为Point of Interest的缩写&#xff0c;也有Point of Information的说法&#xff09;&#xff0c;通常称作兴趣点&am…

程序运行时增加语音提示

目录 前言 一、认识SAPI 二、使用方法 三、测试效果​编辑 总结 前言 在测试过程中为了更高效的提示操作者&#xff0c;在程序执行时增加语音提醒会方便很多&#xff0c;利用微软的SAPI可以很方便的在程序有问题时提示操作者。 一、认识SAPI SpVoice类是支持语音合成(TTS)的核…

ARP协议-介于数据链路层和网络层之间的协议

通过上一篇 IP协议 我们知道 目标IP目标网络 目标主机 &#x1f64b;‍ 也就是说 必须知道 接收方的接收方的 MAC地址 > 没有MAC地址无法封装 MAC帧 在网络层&#xff0c;我们可以知道目标主机的 IP 地址&#xff0c; 但是 我们不知道对方的MAC地址 。 在同一个网段&…

Tessy 5.0.4

Tessy 5.0.4 Linux 2692407267qq.com&#xff0c;更多内容请见http://user.qzone.qq.com/2692407267/

【Vue+Element-UI】实现登陆注册界面及axios之get、post请求登录功能实现、跨域问题的解决

目录 一、实现登陆注册界面 1、前期准备 2、登录静态页实现 2.1、创建Vue组件 2.2、静态页面实现 2.3、配置路由 2.4、更改App.vue样式 2.5、效果 3、注册静态页实现 3.1、静态页面实现 3.2、配置路由 3.3、效果 二、axios 1、前期准备 1.1、准备项目 1.2、安装…

H.264编码

1.为什么要对视频进行编码 视频是连续的图像序列&#xff0c;由连续的帧构成&#xff0c;一帧即为一幅图像&#xff0c;由于人眼的视觉暂留效应&#xff0c;当帧序列以一定的速率播放时&#xff0c;我们看到的就是动作连续的视频&#xff0c;这么多连续的图像数据如果不经过编码…

正则表达式:整数

正则表达式&#xff1a;整数 校验字符串&#xff0c;为有效的整数。 校验规则 只能为&#xff1a;整数&#xff08;包括&#xff1a;正整数、负整数、零&#xff09; 不能为&#xff1a;非数值型的字符串 不能为&#xff1a;小数 不能为&#xff1a;一连串的0&#xff08;比…

算法通关村第16关【青铜】| 滑动窗口思想

1. 滑动窗口的基本思想 一句话概括就是两个快慢指针维护的一个会移动的区间 固定大小窗口&#xff1a;求哪个窗口元素最大、最小、平均值、和最大、和最小 可变大小窗口&#xff1a;求一个序列里最大、最小窗口是什么 2. 两个入门题 &#xff08;1&#xff09;子数组最大平…

使用 Elasticsearch、OpenAI 和 LangChain 进行语义搜索

在本教程中&#xff0c;我将引导您使用 Elasticsearch、OpenAI、LangChain 和 FastAPI 构建语义搜索服务。 LangChain 是这个领域的新酷孩子。 它是一个旨在帮助你与大型语言模型 (LLM) 交互的库。 LangChain 简化了与 LLMs 相关的许多日常任务&#xff0c;例如从文档中提取文本…

vue3 - Element Plus暗黑模式适配、切换及自定义颜色

GitHub Demo 地址 在线预览 Element Plus 2.2.0 版本开始支持暗黑模式&#xff0c;启用方式参考 Element Plus 官方文档 - 暗黑模式 demo通过Element Plus和VueUse 的 useDark 方法实现具有自动数据持久性的响应式暗黑模式。 安装 npm install element-plus --save npm in…

一个关于 i++ 和 ++i 的面试题打趴了所有人

前言 都说大城市现在不好找工作&#xff0c;可小城市却也不好招人。 我们公司招了挺久都没招到&#xff0c;主管感到有些心累。 我提了点建议&#xff0c;是不是面试问的太深了&#xff0c;在这种小城市&#xff0c;能干活就行。 他说自己问的面试题都很浅显&#xff0c;如果答…

HUAWEI华为荣耀猎人游戏本V700 i7独显2060(FRD-WFD9)原装出厂Windows10系统工厂模式(含F10还原)

华为HONOR荣耀笔记本原厂系统镜像包&#xff0c;安装恢复时自动创建F10一键智能还原功能 链接&#xff1a;https://pan.baidu.com/s/1_px_3Fr9qEE6jExz1eKKKg?pwdk6uc 提取码&#xff1a;k6uc 系统自带所有驱动、出厂主题壁纸LOGO、Office办公软件、华为电脑管家等预装程序…

ChatGLM GPT原理介绍

图解GPT 除了BERT以外,另一个预训练模型GPT也给NLP领域带来了不少轰动,本节也对GPT做一个详细的讲解。 OpenAI提出的GPT-2模型(https://openai.com/blog/better-language-models/) 能够写出连贯并且高质量的文章,比之前语言模型效果好很多。GPT-2是基于Transformer搭建的,相…

SQL Server数据库中了360后缀勒索病毒怎么办,勒索病毒解密数据恢复

随着互联网的发展&#xff0c;网络安全问题日益凸显&#xff0c;勒索病毒已经成为当今数字威胁中的一大主要犯罪行为之一。其中&#xff0c;360后缀勒索病毒作为一种常见的数据库攻击形式&#xff0c;对数据库的安全性提出了极大挑战。近期我们收到很多企业的求助&#xff0c;企…

QT:使用行编辑器、文本编辑器、单选按钮、水平布局、垂直布局做一个小项目

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QLineEdit> //行编辑器 #include <QTextEdit> //文本编辑器 #include <QRadioButton> //单选按钮class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *pare…

项目进度网络图

概念 项目网络图是项目所有活动及其之间逻辑关系&#xff08;依赖关系&#xff09;的一个图解表示&#xff0c;并从左到右来表示项目的时间顺序。 可手工编制也可用计算机实现。可包括整个项目的全部细节&#xff0c;也可包含一个或多个概括性活动&#xff0c;还相应伴有一个…

uniapp中vue3使用uni.createSelectorQuery().in(this)报错

因为VUE3中使用setup没有this作用域&#xff0c;所以报错 解决办法&#xff1a;使用getCurrentInstance()方法获取组件实例 import { getCurrentInstance } from vue;const instance getCurrentInstance(); // 获取组件实例 const DOMArr uni.createSelectorQuery().in(ins…

智荟康午休课桌椅成为第十届中国慈善展览会公益亮点产品

第十届中国慈善展览会&#xff08;以下简称“慈展会”&#xff09;于9月15日至17日在深圳会展中心隆重举办&#xff0c;此次展会为期3天&#xff0c;主要围绕“共建现代化慈善&#xff0c;聚力高质量发展”的主题&#xff0c;重点聚焦聚力民生福祉&#xff0c;将打造“一展多元…

asrpro 天问BLOCK 总结

ASRPRO芯片信息 主频240MHz 640KByte SRAM 2-4M FLASH (https://haohaodada.com/jpeguploadfile/twen/ASRPRO/asr_pro_core.pdf) 下载 &#xff08;注意最好用好点的USB转TTL或是网方的下载器&#xff0c;否则会怀疑人生&#xff09; 下载程序步骤 安装VSCODE 在字符模式下&a…