抛硬币
Keybase 聊天中的 /flip 命令实现了一种 承诺方案 协议,允许频道成员参与安全的抛硬币活动。利用聊天中所有消息均由发送者签名的特性,在聊天系统之上构建此类协议十分自然且合适。除抛硬币外,共享随机性还可用于呈现不同形式的抛掷;例如洗牌项目列表、选取随机数,甚至分发扑克牌手牌。
抛掷类型
目前支持的抛掷类型包括:
/flip- 抛硬币。/flip 6- 掷一个 k 面骰子。/flip -10..10- 在范围内选取随机数。/flip apple, orange, pear- 洗牌项目列表。/flip cards- 发一副牌。/flip cards 5 mike, chris, max, patrick- 向指定人员列表分发 5 张手牌。/flip @here- 对频道成员进行洗牌(随机排序)。/flip cards 5 @here- 向频道成员分发 5 张手牌。
协议
以下是聊天客户端用于实现承诺方案的协议描述。
- 发起者 通过发布 /flip 命令开始抛掷。
- 频道所有成员通过向包含与宿主频道相同成员的特殊隐藏“开发者”频道发送聊天消息,来提交一个秘密。
- 发起者在设定时间间隔内收集所有承诺,并发送一条包含所有及时响应参与者的消息。这些即为抛掷结果的参与者。
- 收到此消息后,客户端发送聊天消息以揭示其秘密,并确认他人的秘密与其承诺相符。
- 一旦所有秘密被揭示,最终结果将显示在聊天频道中。
只要参与者在抛掷中信任至少一人(若其本人参与,则包括其本人),抛掷结果即为公平。
此协议的一个限制在于参与者可能会在提交抛掷后消失。在此情况下,聊天客户端将针对该抛掷渲染错误,因为消失的参与者可能仅是试图强制重新进行抛掷(尽管更常见的情况是用户仅是断开了连接)。
UI 显示
UI 的一项特殊功能是在抛掷进行时对其进行渲染。这表现为抛掷过程中动画显示的橙色和紫色方块。这些方块是聊天客户端接收到的承诺和秘密字节的可视化呈现。每个单元格的颜色将承诺或秘密的一个字节映射至调色板。