区块链中基于数字签名的随机预言机

从想法到实现:我们修改现有的椭圆曲线数字签名方案,使其具有确定性,并在此基础上提供获取区块链内可验证的伪随机数的函数。

区块链中基于数字签名的随机预言机

想法

2018 年秋季,Waves 区块链包括 第一个智能合约激活,立即出现了关于获得的可能性的问题 伪随机数你可以信任。

困惑这个问题,我最终得出结论:任何区块链都是一个细胞,在封闭的系统中不可能获得可信的熵源。

但我仍然喜欢一个想法:如果 随机预言 将使用确定性算法对用户数据进行签名,然后用户将始终能够使用公钥验证此类签名,并确保结果值是唯一的。 预言机无论多么努力,都无法改变任何事情;算法会产生明确的结果。 本质上,用户记录了结果,但在预言机发布之前并不知道。 事实证明,你根本不能信任预言机,而是检查其工作结果。 然后,如果验证成功,这样的签名可以被视为伪随机数的熵源。

Waves区块链平台使用签名方案 EDDSA 选项 Ed25519。 在该方案中,签名由值R和S组成,其中R取决于随机值,S是根据被签名的消息、私钥和与R相同的随机数计算出来的。事实证明对于同一用户消息,没有唯一的依赖关系。用户消息有许多有效签名。

显然,以其纯粹的形式,这样的签名不能用作伪随机数的来源,因为它是不确定的,因此很容易被预言机操纵。

但是,事实证明,实际上可以使其具有确定性。

我曾抱有很大的希望 可验证随机函数 (VRF),但是在研究了硬件之后,我不得不放弃这个选择。 尽管 VRF 提供了签名及其证明的确定性版本,但算法中有一个奇怪的地方,为操纵预言打开了一个黑洞。 即,在计算k值时(5.1部分)使用私钥,用户不知道该私钥,这意味着用户无法验证 k 计算的正确性,这意味着 oracle 可以使用它需要的任何 k 值,同时维护一个对应关系的数据库k 和签名数据,以便始终能够从 VRF 的角度重新计算正确的结果。 如果您看到基于 VRF 的绘图而没有公开私钥,那么您可以很聪明:指示需要公开密钥,或者将其排除在 k 的计算之外,那么当第一个签名出现时,私钥将自动显示自己。 一般来说,正如已经提到的,这是一个奇怪的随机预言方案。

经过一番思考并争取当地分析师的支持后,VECRO 工作方案诞生了。

VECRO 是可验证椭圆曲线随机预言机的缩写,俄语意思是椭圆曲线上可验证的随机预言机。

一切都变得非常简单;为了实现确定性,您需要在要签名的消息出现之前固定 R 的值。 如果 R 已提交并且是正在签名的消息的一部分,这进一步确保 R 在正在签名的消息中提交,则 S 的值由用户的消息唯一确定,因此可以用作伪随机数的源。

在这样的方案中,R 如何固定并不重要;这仍然是预言机的责任。 重要的是,S 由用户唯一确定,但其值在预言机发布之前是未知的。 我们想要的一切!

说到固定 R,请注意 重复使用的R 在签署各种消息时,它唯一地揭示了 EdDSA 方案中的私钥。 对于预言机所有者来说,消除重复使用 R 来签署不同用户消息的可能性变得极其重要。 也就是说,如果有任何操纵或串通,预言机将始终面临丢失私钥的风险。

总的来说,预言机必须为用户提供两个功能:初始化(固定值 R)和签名(返回值 S)。在这种情况下,R、S 对是包含固定值的用户消息的通常可验证签名。值 R 和任意用户数据。

可以说,区块链的这个方案只不过是普通的方案 提交-扩展方案。 本质上,是的,就是她。 但有几个细微差别。 首先,预言机在所有操作中始终使用相同的密钥,例如,这在合约中使用起来很方便。 其次,如果预言机行为不当,就有丢失私钥的风险,比如预言机允许你对结果进行采样,那么只需要进行两次测试就可以找出私钥并获得完整的结果。访问钱包。 第三,在区块链上可本地验证并且是随机性来源的签名是美丽的。

六个月来,实施的想法在我的脑海中酝酿,直到最终动力以形式出现 Waves 实验室资助。 大笔资助意味着重大责任,所以该项目将会在那里!

履行

那么,在这个项目中 实施VECRO 在 Waves 区块链上以请求-响应模式使用用户和预言机之间的传输交易。 同时,在oracle账户上安装了一个脚本,严格按照上述逻辑控制工作。 Oracle 事务得到验证并恢复整个用户交互链。 所有四笔交易都涉及验证最终值;智能合约将它们用严格的验证线程串在一起,一步步检查所有值,不留任何操纵的空间。

再次,把它放在一边并使其更清晰。 预言机不仅仅按照提议的方案工作。 其工作完全由已建立的区块链级别控制 与智能合约紧密结合。 向左迈一步,交易根本无法完成。 因此,如果一笔交易包含在区块链中,用户甚至不需要检查任何内容;数百个网络节点已经为他检查了所有内容。

目前,Waves 主网上有一个 VECRO 运行(你可以运行自己的,并不难,只是 看一下配置示例)。 当前代码在 PHP 中运行(在 波浪工具包, 关于 我之前告诉过你).

为了使用预言机服务,您必须:

  • 修复R;
    • 向 oracle alias init@vecr 发送至少 0.005 Waves;
    • 在从预言机向用户传输 1 个 R-vecr 代币时,接收附件字段中的 R 代码;
  • 获得签名;
    • 发送至少 0.005 Waves 到 oracle 别名 random@vecr,并且还必须在附件字段中指示之前收到的 R 代码和附加用户数据;
    • 在从预言机向用户传输 1 个 S-vecr 代币时,接收附件字段中的 S 代码;
  • 使用S代码作为伪随机数的来源。

当前实施的细微差别:

  • 发送到预言机的Wave作为向用户返回交易的佣金,最多1个Wave;
  • R 代码是“R”字符字节和 32 字节 base58 编码的 R 值的串联;
  • 附件中的R代码在前,用户数据在R代码之后;
  • S 代码是字符“S”的一个字节和 S 的 32 字节 Base58 编码值的串联;
  • S是模除的结果,因此不能将S用作完整的256位伪随机数(这个数可以认为是最大的252位伪随机数);
  • 最简单的选择是使用 S 代码哈希作为伪随机数。

接收S代码示例:

从技术角度来看,预言机已经完全准备好工作,您可以放心使用它。 从一般用户使用的角度来看,缺乏方便的图形界面,这个还得等待。

我很乐意回答问题并接受评论,谢谢。

来源: habr.com

添加评论