所以我需要一个函数来检查一个键是否符合该键的散列。这就是我所拥有的:
function checkKey(bytes32 hash, bytes32 privateKey) public returns (bool success) {
require(keccak256(privateKey) == hash);
return true;
}我收到以下警告:
我想做一个游戏,用户找到私钥,并基本上得到奖励。所以我几乎可以选择我要散列的字符串。我在这里需要记住什么才能让这件事成功?
发布于 2018-11-03 13:49:05
bytes32 result = keccak256(abi.encodePacked(privateKey));这会将privateKey转换为字节,然后keccak256函数返回一个byte32结果,该结果可以根据您的问题与哈希(bytes32)进行比较。
发布于 2018-11-03 17:06:34
克里斯是对的。这是一个小PSA -公认的切线你的问题,但可能有用的其他人谁碰巧这一点。
一些可能有用的风格注释。
-
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()不是view或pure,因为我认为它做了一些有用的事情,这将以事务的形式出现。因此,“私有”密钥实际上将被传输到整个网络,并且将永远在区块链历史中被清晰地看到。这显然是坏消息,如果关键是一个秘密。
对区块链上的秘密要小心。我们必须行动起来,好像每个人都能看到一切,因为他们可以。如果你透露更多关于你想要完成的事情,可能会有人加入到一个更好的模式中。
希望能帮上忙。
https://ethereum.stackexchange.com/questions/61678
复制相似问题