大家好,我正在努力实现的游戏,中国语作为一个聪明的合同。它按预期工作,但我有两个问题。我将快速解释契约的概念:因此WalletA可以通过在changeOwner函数中设置低语来向WalletB发送消息。我有一个isOwner修饰符,它检查用户是否是所有者,并且只允许那个人读取WalletA之前设置的当前耳语。以下是合同目前的状况:
contract ChineseWhisper {
address private owner;
string whisper;
// event for logging
event OwnerSet(address indexed oldOwner, address indexed newOwner);
// modifier to check if caller is owner
modifier isOwner() {
require(msg.sender == owner, "Caller is not owner");
_;
}
/**
* @dev Set contract deployer as owner and set whisper to default value
*/
constructor() {
owner = msg.sender;
whisper = "Let the game begin";
emit OwnerSet(address(0), owner);
}
/**
* @dev Changes owner and sets sent message as new whisper
* @param newOwner address of new owner
* @param message message for setting the whisper
*/
function changeOwner(address newOwner, string memory message) public isOwner {
emit OwnerSet(owner, newOwner);
whisper = message;
owner = newOwner;
}
/**
* @dev Return current whisper
* @return whisper of last owner
*/
function getWhisper() public isOwner returns (string memory) {
return whisper;
}
/**
* @dev Return owner address
* @return address of owner
*/
function getOwner() external view returns (address) {
return owner;
}
}但有两个问题!
第一种是在切换所有者时,可以在以太扫描上看到输入(包括耳语)(这里的示例只需单击输入作为UTF-8:https://rinkeby.etherscan.io/tx/0x7b5b9114d55bed65eb6ded536973846674cb6d5a46ff09282516451045cb78c3)。
第二个问题是,当使用web3js查询当前的耳语时,它绕过了isOwner函数。
const runGetWhisper = async (contract, walletAdress) => {
contract.methods
.getWhisper()
.call({ from: walletAdress })
.then((res) => {
console.log(res);
})
.catch((err) => {
console.log(err.message);
});
};理论上,我只需更改"from“值,以便任何通过调用currentOwner ()了解getOwner()的人都可以使用该walletAdress来查询当前值。
对于如何解决这两个问题,有什么想法吗?
发布于 2022-03-15 04:42:22
我同意Meriadoc的观点,你不能先在Ethereum.Your上保密,如果你的合同在以太扫描上被确认,那么它总是在以太扫描中被解码。你的第二个问题解决了简单的,如果其他条件。
查看更新的getWhisper函数。
function getWhisper() public view returns (string memory) {
if (msg.sender == owner){
return whisper;
}
else{
return "You are not allowed";
}
}发布于 2022-03-16 13:37:06
在“中国语”(美国人称之为“电话”)中,错误的根源主要是语音本身的模拟传输。在这里没有这样的机制。任何人都能完美地看到最后一件事--我想,没有一种机制可以等同于“低语”--除非你的前端故意交换了一些字符的百分比,或者类似的部分。
但如果重点是有人故意歪曲信息而你真的想继续这个想法.
块链上的
你可以在区块链上存储秘密,你只需要加密它们。你会怎么做?
pub_key_next)。pub_key_next并使用它加密起始秘密。当一个新用户提交他们的公钥并说他们想成为新的下一个用户时,当前用户可以加密他们想要的任何东西(或者是他们看到的相同的消息,或者它上的一个变体,或者完全不同的东西),然后提交加密的它,这样只有NEXT才能查看它。
诸若此类。
技术部分听起来很复杂,但实际上GUI可以很好地处理它--棘手的部分是,在下一个用户出现之前,您不能真正提交新消息(除非您希望在混合中包含一个离链数据库)。
基本上,前端应该对用户进行加密和解密,并将其隐藏起来。流看起来是这样的:
当您采用这个新设置时,这个问题就变得无关紧要了。如果他们愿意的话,他们可以看到加密的窃窃私语,这将是一派胡言。
发布于 2022-03-14 23:12:29
不可能在区块链上保留任何秘密--以太扫描总是可以访问合同中的任何存储槽。使其真正保密的唯一方法是对只有消息接收者知道的消息使用某种加密算法。
https://ethereum.stackexchange.com/questions/123675
复制相似问题