Ethereum 如何使智能合约仅在由特定验证地址调用时可执行?

Ethereum 如何使智能合约仅在由特定验证地址调用时可执行?,ethereum,solidity,decentralized-applications,Ethereum,Solidity,Decentralized Applications,我正在尝试制作一个分散的web应用程序,如果满足一个条件,将执行一个合同,并可以将eth发送到一个地址。例如,如果我的网站有一个已注册帐户的用户列表,并且每个用户都有一个与其帐户相关联的以太坊地址,我如何才能使我的智能合约只能由在我的网站上注册帐户的特定地址执行 当用户在我的网站上单击一个按钮(如get eth)调用智能合约功能时,我如何使其仅允许注册用户使用我的智能合约 我一直在研究消息签名和电子证书以及链外白名单。我解决这个问题的思想过程是以某种方式使用它们来验证地址是否有效以执行合同。我认

我正在尝试制作一个分散的web应用程序,如果满足一个条件,将执行一个合同,并可以将eth发送到一个地址。例如,如果我的网站有一个已注册帐户的用户列表,并且每个用户都有一个与其帐户相关联的以太坊地址,我如何才能使我的智能合约只能由在我的网站上注册帐户的特定地址执行

当用户在我的网站上单击一个按钮(如get eth)调用智能合约功能时,我如何使其仅允许注册用户使用我的智能合约


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

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

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);
    }
}

是的,我已经看到了,但实际上它的效率极低,因为在连锁店白名单上做相关的天然气成本。