首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问不可预测的数字

访问不可预测的数字
EN

Ethereum用户
提问于 2018-02-27 19:02:56
回答 2查看 93关注 0票数 1

我看到,这是一个广泛讨论的话题在过去,但我仍然不明白为什么未来的块哈希不应该被用于彩票类型的游戏。只要一个矿工不发布一个特定的区块(为了改变游戏的结果)的动机是小于叔叔与主要区块奖励的差异,这应该是可行的。给定的情况下,在游戏中失败时,矿工可以选择以叔父的身份发布,这样块哈希就不会决定游戏的结果。

诚然,这款游戏不会完全不受矿商的影响,但考虑到区块链一般都是基于激励让每个人诚实的,这似乎是一个不错的解决方案。我遗漏了什么吗?

EN

回答 2

Ethereum用户

发布于 2018-02-27 19:10:48

这解释得很好:https://hackernoon.com/building-a-raffle-contract-using-oraclize-e746e5edff6b?gi=8ca2440bbace

基本上,在Ethereum网络上的所有计算都必须是确定性的,这样它们就可以由网络上的不同节点进行验证,如果它们都得到不同的数字,就不起作用。

您的声明considering that blockchains, in general, are based on incentives to keep everyone honest是不正确的-块链是不可信的-它不需要依赖于任何人诚实,这就是为什么每个事务都要在网络中的所有节点上进行验证,这也是为什么您需要对每个事务进行确认。

票数 0
EN

Ethereum用户

发布于 2019-08-11 23:49:21

无法猜测未来块哈希的概念忽略了攻击者可能是一个目的构建的智能契约,该契约将调用受害者契约。攻击者不需要知道“未来”块哈希或任何可能是变量的内容,因为它可以知道当前块哈希。

考虑一下我为一个关于“随机(Ish)”数字的不同问题创建的小例子。

代码语言:javascript
复制
pragma solidity 0.5.1;

contract Guess {
  function guessMe(uint guess) public returns(bool success) {
    return uint(blockhash(block.number)) == guess;
  }
}

因此,看起来某人必须发送一个guess,而他们能够正确猜测的唯一方法(返回true)是他们是否知道未来。

认真考虑如何利用对未来的神奇知识来处理这个小小的合同,也许是有启发意义的。这样做的方法如下。

扰流板警报

现在,如果攻击者是调用此函数的契约(或人工攻击者控制下的契约),那么知道当前块的块哈希(无论何时被挖掘)是非常简单的。它是:

uint(blockhash(block.number))

可以从合同复制到攻击。微不足道。

请记住,契约链调用始终与单个原子事务在同一个块中完成。因此,攻击者知道它将在与受害者完全相同的上下文中执行,并且可以访问相同的变量。所以..。它可以执行相同的计算。

代码语言:javascript
复制
contract Attack {
    Guess g;
    event LogSuccess(address sender, bool success);
    constructor(address guessIt) public {
        g = Guess(guessIt);
    }
    function nostrodamus() public {
        if(g.guessMe(uint(blockhash(block.number)))) {
            emit LogSuccess(msg.sender, true);
        }
    }
}

攻击者每次都能够生成正确的猜测。作者只需从它要攻击的契约中复制/粘贴一个表达式即可。

TL;DR;

聪明的契约是确定性的,产生其他人无法确认的东西,从定义上来说,比看上去更难。对这些假设采取极端谨慎的态度,寻求同行评审和正式审计,以避免悲伤。

我认为依赖块散列是不够的,依赖它可能导致悲伤,除非你知道你在做什么,但这不是那种不相容的事情。换句话说,不要在表达式中注意到它,并假设过程自动出错。

探索的一种方法是提交/显示过程,其中竞争者必须在一个块中做出选择,然后添加更多的随机性(附加块经过)。在许多情况下,真正的随机数并不是严格的要求。无法猜测的数字(包括矿工合谋)可能就足够了。

无论如何,不要低估难度。

希望能帮上忙。

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/41116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档