从构思到实现:将现有的椭圆曲线签名方案修改为确定性的,并在其上提供功能以在区块链伪随机数内获得可验证的。

主意
在2018年秋天,当第一批智能合约在Waves区块链上被激活时,以可信赖的方式获取伪随机数的话题自然就出现了。
考虑到这一点,我得出的结论是,任何区块链都是笼子,不可能在封闭系统中获得可靠的熵源。
但是,我喜欢一个主意。 如果随机预言机使用确定性算法对用户数据进行签名,则用户将始终能够通过公钥验证此类签名,以确保获得的值是唯一的。 甲骨文将无法进行任何更改,因为该算法带有单值结果。 基本上,用户会修复结果,但直到Oracle将结果发布后才知道。 因此,您可能根本不信任oracle,但仍然能够验证其操作结果。 然后,在成功验证的情况下,这样的签名可能是伪随机数的熵的来源。
在Waves 区块链上,使用了签名方案EdDSA变体Ed25519 。 在该方案中,签名由值R和S组成。R依赖于随机值,并且S是根据签名消息,私钥和与R相同的随机数来计算的。并且对于同一用户消息,存在几个有效的签名。
显然,这种签名本身不能用作伪随机数的来源,因为它是不确定的,因此很容易被oracle操纵。
然而,事实证明,实际上有可能使它具有确定性。
我对可验证的随机函数(VRF)寄予了很高的期望,但是在研究了它的细节之后,我不得不拒绝该选项。 尽管VRF提供了签名及其证明的确定版本,但是该算法的位置很奇怪,为oracle的操作开了一个黑洞(此语句是错误的,请参见Update )。 具体地,为了计算k的值( 5.1节 ),使用了私钥,该私钥对于用户仍然是未知的,因此用户不能验证计算k的正确性。 结果,oracle可以使用它需要的k的任何值,并同时运行一个数据库以用于k和有符号数据之间的相关性,从而能够始终为VRF重新计算正确的结果。 如果您看到基于VRF的抽奖活动而没有公开私钥,则可以炫耀并指出需要公开密钥或将其从计算k中删除,这样它将在第一个签名后自动显示其自身。 总体而言,如上所述,这对于随机预言机来说是一个奇怪的方案。
经过一番反思,并在当地分析家的支持下,VECRO运作方案诞生了。
VECRO代表可验证椭圆曲线随机Oracle。 事实证明这很简单。 为了实现确定性,我们需要在出现要签名的消息之前固定R的值。 如果R是固定的,并且R是消息的一部分,则可以另外保证R在消息之前是固定的。 S的值完全由用户消息确定,因此可以用作伪随机数的来源。
在这种方案中,R的确切固定方式无关紧要,而是保留在预言家的职责范围内。 重要的是S完全由用户确定,但是直到Oracle发布它的值才显示出来。 这正是我们想要的!
说到固定R,请注意, 重新使用R来签名各种消息完全揭示了EdDSA方案中的私钥。 对于Oracle的所有者,至关重要的是要排除R的重新使用以签署各种用户消息。 也就是说,在任何操纵或串通中,oracle总是会冒丢失其私钥的风险。
因此,oracle将为用户提供两个功能:初始化(用于固定R的值)和签名(返回S的值)。同时,R,S对是包含固定字符的用户消息的常规可验证签名。 R的值和用户的随机数据。
有人可以说,对于区块链来说,这只是一个常规的提交揭示计划 。 基本上就是这样。 但是有一些细微差别。 首先,oracle在所有事务中都使用相同的密钥,例如,对于合同而言很方便。 其次,由于性能不正确,oracle可能会丢失私钥。 例如,如果oracle方便了对结果的测试,则只需两个测试就足以找出私钥并访问钱包。 第三,在区块链上经过本地验证的签名非常漂亮。
在大约六个月的时间里,这个想法就发芽了,直到通过Waves Labs的赠款形式来实现它的动机为止。 巨大的资助伴随着巨大的责任,这意味着要成为项目!
实作
VECRO是在Waves 区块链上以请求/回复模式使用用户与Oracle之间的转移交易实现的。 在Oracle的帐户上,设置了一个脚本,该脚本严格按照上述逻辑来控制操作。 通过重新创建整个用户交互链来验证oracle的事务。 所有四笔交易都涉及验证最终价值。 智能合约将所有这些添加到严格的验证线程中,逐步检查值,并且不留任何操作余地。
让我们尝试简单地说。 甲骨文不仅在建议的方案下工作。 它的操作由严格的智能合约在区块链级别上完全控制。 任何微小的转移都会导致交易被拒绝。 因此,如果交易在区块链上,则用户无需验证任何内容,因为所有验证已由数百个区块链节点完成。
目前,一个VECRO可在Waves的主网上运行。 您实际上可以启动它:很简单,只需看一下配置示例 。 当前代码可在PHP上运行 (在我之前讨论的 WavesKit上 )。
要使用oracle,您需要:
- 固定R
- 发送至少0.005 WAVES到Oracle的别名init @ vecr;
- 从甲骨文到用户的1个R-vecr令牌传输中的附件字段中接收R代码;
- 获得签名;
- 向Oracle的别名random @ vecr发送至少0.005 WAVES。 您还需要在附件字段中输入收到的R代码和其他用户数据;
- 在从Oracle到用户的1 S-vecr令牌传输中的附件字段中接收S代码;
- 使用S代码作为伪随机数的来源。
当前实施的细微之处:
- 发送到oracle的WAVES用作向用户进行退货交易的费用,最多1 WAVES;
- R代码是base58编码中“ R”符号字节和32字节R值的串联;
- 附件中的R代码必须位于用户数据之前;
- S代码是base58编码中'S'符号字节和32字节S值的串联;
- S是模数除法的结果,不能用作适当的256位伪随机数(最多可以认为是252位伪随机数);
- 最简单的选择是使用S代码的哈希作为伪随机数的来源。
接收S代码的示例:
从技术角度来看,oracle是完全可操作的,您可以安全地使用它。 从普通用户的角度来看,没有足够的用户友好型GUI,因此必须等待。
我很乐意回答问题并接受评论,谢谢。
更新(2019年5月8日)
我在VRF上错了。 是的,确实可以将ECVRF签名用作伪随机数的来源,但不能将其用于此目的。 需要签名来证明Gamma值的唯一性( 第5.3节 ,第6步)。 验证后的Gamma值将用作伪随机数的来源( 第5.2节 ,第5步)。 感谢Oleg Taraskin Crittografo在这一刻的指点,我承认自己的错误。 ECVRF拥有完整的生存权。
不幸的是,由于在智能合约中缺少必要的数学功能,因此仍无法在Waves区块链级别使用ECVRF。
当此功能或RSA支持可用时,可以创建新的Oracle。 至于VECRO方案,它在任何情况下都占据着优势,并且使您无需任何其他功能即可工作。