首页 > 解决方案 > 如何使智能合约仅在被特定验证地址调用时才可执行?

问题描述

我正在尝试制作一个去中心化的 Web 应用程序,如果满足条件,将执行合同并将 eth 发送到一个地址。例如,如果我的网站有一个已注册帐户的用户列表,并且每个用户都有一个与其帐户关联的以太坊地址,我该如何做到这一点,以便我的智能合约只能由已注册的特定地址执行我网站上的帐户?

当用户单击我网站上的按钮(例如(get eth))会调用智能合约功能时,我怎样才能做到只有注册用户才能使用我的智能合约?

我一直在研究消息签名和 ecrecover 以及链下白名单。我解决这个问题的思考过程是以某种方式使用这些来验证地址是否有效以执行合同。我认为这个问题本质上是创建一个基本的水龙头智能合约,但将可以使用它的地址限制在少数几个。

标签: ethereumsoliditydecentralized-applications

解决方案


我认为我们只是简单地将用户添加到我们的智能合约中。然后我们像这样验证它:

contract MyContract {
    mapping(address=>bool) public registerUsers;
    address owner;

    modifier onlyOwner(){
        require(msg.sender==owner);
        _;
    }
    modifier onlyUser(){
        require(registerUsers[msg.sender] == true);
        _;
    }

    function() external payable { }
    constructor() public{
        owner = msg.sender;
    }

    function  addUser(address userAddr) onlyOwner() public{
        registerUsers[userAddr] = true;
    }
    // User calls this function to claim some eth
    function claimEth(uint amount) onlyUser() public{
        msg.sender.transfer(amount);
    }
}

推荐阅读