Как сделать смарт-контракт исполняемым только при вызове по определенным проверенным адресам?

#ethereum #solidity #decentralized-applications

#ethereum #надежность #децентрализованные приложения

Вопрос:

Я пытаюсь создать децентрализованное веб-приложение, в котором при выполнении условия контракт будет выполнен и сможет отправлять eth на адрес. например, если на моем веб-сайте должен быть список пользователей, у которых есть зарегистрированные учетные записи, и у каждого пользователя есть адрес ethereum, связанный с их учетной записью, как я мог бы сделать так, чтобы мой смарт-контракт мог выполняться только определенными адресами, которые зарегистрировали учетную запись на моем веб-сайте?

Когда пользователь нажимает кнопку на моем веб-сайте, например (get eth), которая вызывает функцию смарт-контракта, как я могу сделать так, чтобы только зарегистрированные пользователи могли использовать мой смарт-контракт?

Я изучал подписание сообщений и восстановление, а также внесен в белый список вне сети. Мой мыслительный процесс для решения этой проблемы заключался в том, чтобы использовать их каким-либо образом, чтобы проверить, действителен ли адрес для выполнения контракта. Я бы подумал об этой проблеме как о создании базового смарт-контракта faucet, но ограничении адресов, которые могут его использовать, несколькими избранными.

Ответ №1:

Я думаю, мы просто добавим пользователей в наш smartcontract. Затем мы проверяем это следующим образом:

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

Комментарии:

1. Да, я видел это, но на практике это крайне неэффективно из-за стоимости газа, связанной с выполнением белого списка в цепочке.