首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使我在智能合同中的价值只有所有者才能获得?

使我在智能合同中的价值只有所有者才能获得?
EN

Ethereum用户
提问于 2022-03-12 18:48:33
回答 3查看 259关注 0票数 1

大家好,我正在努力实现的游戏,中国语作为一个聪明的合同。它按预期工作,但我有两个问题。我将快速解释契约的概念:因此WalletA可以通过在changeOwner函数中设置低语来向WalletB发送消息。我有一个isOwner修饰符,它检查用户是否是所有者,并且只允许那个人读取WalletA之前设置的当前耳语。以下是合同目前的状况:

代码语言:javascript
复制
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函数。

代码语言:javascript
复制
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来查询当前值。

对于如何解决这两个问题,有什么想法吗?

EN

回答 3

Ethereum用户

回答已采纳

发布于 2022-03-15 04:42:22

我同意Meriadoc的观点,你不能先在Ethereum.Your上保密,如果你的合同在以太扫描上被确认,那么它总是在以太扫描中被解码。你的第二个问题解决了简单的,如果其他条件。

查看更新的getWhisper函数。

代码语言:javascript
复制
    function getWhisper() public view returns (string memory) {
        if (msg.sender == owner){
        return whisper;
        }
        else{
            return "You are not allowed";
        }
    }
票数 1
EN

Ethereum用户

发布于 2022-03-16 13:37:06

数字通信与模拟通信?

在“中国语”(美国人称之为“电话”)中,错误的根源主要是语音本身的模拟传输。在这里没有这样的机制。任何人都能完美地看到最后一件事--我想,没有一种机制可以等同于“低语”--除非你的前端故意交换了一些字符的百分比,或者类似的部分。

但如果重点是有人故意歪曲信息而你真的想继续这个想法.

块链上的

秘密

你可以在区块链上存储秘密,你只需要加密它们。你会怎么做?

  1. 下一个用户发布他们的公钥(让我们称之为pub_key_next)。
  2. 当前用户获取pub_key_next并使用它加密起始秘密。
  3. 下一个用户现在成为当前用户。他(以及其他任何人)不仅可以查看当前的秘密消息,而且还可以解密和读取它。

当一个新用户提交他们的公钥并说他们想成为新的下一个用户时,当前用户可以加密他们想要的任何东西(或者是他们看到的相同的消息,或者它上的一个变体,或者完全不同的东西),然后提交加密的它,这样只有NEXT才能查看它。

诸若此类。

技术部分听起来很复杂,但实际上GUI可以很好地处理它--棘手的部分是,在下一个用户出现之前,您不能真正提交新消息(除非您希望在混合中包含一个离链数据库)。

基本上,前端应该对用户进行加密和解密,并将其隐藏起来。流看起来是这样的:

  1. 用户表示,他们希望成为下一个队列。(后台的前端向块链提交公钥,可能代表它们生成一个公钥/私钥对。)
  2. 然后,必须通知CURRENT,或者检查并随机通知有下一个可用的用户。然后,他提交了他的信息。(后台前端用链上下一个用户的公钥加密消息,并将加密消息存储在链上。)
  3. 下一个用户,现在成为当前用户,被通知消息现在在那里,并去查看它。(后台前端解密并显示消息。)
  4. 新的当前用户等待新的下一个用户,循环重复。

您的最后一期(isOwner旁路)

当您采用这个新设置时,这个问题就变得无关紧要了。如果他们愿意的话,他们可以看到加密的窃窃私语,这将是一派胡言。

票数 2
EN

Ethereum用户

发布于 2022-03-14 23:12:29

不可能在区块链上保留任何秘密--以太扫描总是可以访问合同中的任何存储槽。使其真正保密的唯一方法是对只有消息接收者知道的消息使用某种加密算法。

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

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

复制
相关文章

相似问题

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