首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keccak256校验键

Keccak256校验键
EN

Ethereum用户
提问于 2018-11-03 13:18:22
回答 2查看 980关注 0票数 0

所以我需要一个函数来检查一个键是否符合该键的散列。这就是我所拥有的:

代码语言:javascript
复制
function checkKey(bytes32 hash, bytes32 privateKey) public returns (bool success) {
    require(keccak256(privateKey) == hash);
    return true;
}

我收到以下警告:

  1. 警告:这个函数只接受一个“字节”参数。请使用abi.encodePacked(.)或者类似的函数来对数据进行编码。
  2. 警告: bytes32类型提供的参数不能隐式转换为预期类型字节内存。

我想做一个游戏,用户找到私钥,并基本上得到奖励。所以我几乎可以选择我要散列的字符串。我在这里需要记住什么才能让这件事成功?

EN

回答 2

Ethereum用户

发布于 2018-11-03 13:49:05

代码语言:javascript
复制
    bytes32 result = keccak256(abi.encodePacked(privateKey));

这会将privateKey转换为字节,然后keccak256函数返回一个byte32结果,该结果可以根据您的问题与哈希(bytes32)进行比较。

票数 1
EN

Ethereum用户

发布于 2018-11-03 17:06:34

克里斯是对的。这是一个小PSA -公认的切线你的问题,但可能有用的其他人谁碰巧这一点。

一些可能有用的风格注释。

  1. 创建一个安全的检查函数是有帮助的。“安全”的意思是安全使用,因为如果响应是“否”,它将不会恢复。
  2. 您可以使用修饰符严格要求任何状态更改函数都有此条件,因此可以得到如下内容:

-

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

contract CheckKey {

    modifier onlyIfKeyMatches(bytes32 hash, bytes32 key) {
        require(isKey(hash, key));
        _;
    }

    function isKey(bytes32 hash, bytes32 privateKey) public pure returns (bool success) {
        return keccak256(abi.encodePacked(privateKey)) == hash;
    }

    function protected(bytes32 hash, bytes32 privateKey) 
        public 
        onlyIfKeyMatches(hash, privateKey) 
    {
        // carry on 
        // WARN: privateKey is compromised
    }
}

您希望使用pure (或view)进行检查,因为它不会更改状态。这有许多效果,其中之一是本地执行。它不会破坏密钥,因为密钥不会被广播到网络。

另一方面,privateKey存在一个不明显但可能严重的安全问题.protectedFunction()不是viewpure,因为我认为它做了一些有用的事情,这将以事务的形式出现。因此,“私有”密钥实际上将被传输到整个网络,并且将永远在区块链历史中被清晰地看到。这显然是坏消息,如果关键是一个秘密。

对区块链上的秘密要小心。我们必须行动起来,好像每个人都能看到一切,因为他们可以。如果你透露更多关于你想要完成的事情,可能会有人加入到一个更好的模式中。

希望能帮上忙。

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

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

复制
相关文章

相似问题

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