Скажем, есть что-то вроде лотереи. И в смарт-контракте есть функция, которая позволяет ЛЮБОМ пользователю из users проверить, выиграл он что-то или нет. Если да, монеты будут распределены внутри по его адресу, а затем разрешено отправить ему.

Как будет работать такая функция?

Я придумал что-то вроде этого:

constrct C1 {

  //.........
  struct User { /*..skipped..*/ };

  mapping(address => User) users;


  function checkIfAnythingToGrab(address payable _to) public payable {
    if (/* some checks if a user won */) {
      //.............

      // and then, if he's won ...
      bool res = _to.send(wonAmount);
      require(res, "Failed to send Ether");
  }

Как я могу гарантировать, что только пользователь, у которого есть закрытый ключ адреса _to и который, конечно же, существует в сопоставлении users, сможет вызывать эту функцию?

Потому что, если этот адрес что-то выиграл, на него будут отправлены монеты.

Или не было бы проблем, если бы злоумышленник вызвал функцию и использовал свой собственный адрес? Если он действительно выиграет, ему будут отправлены монеты, что является правильным поведением. И если бы он использовал адрес другого пользователя, монеты все равно были бы отправлены другому пользователю. Правильно?


Обратите внимание, что речь идет не о владельце или администраторе смарт-контракта.

-1
arumichi 8 Янв 2022 в 01:54
 – 
GraphicalDot
8 Янв 2022 в 01:09
Ownable не имеет ничего общего с моим вопросом
 – 
arumichi
8 Янв 2022 в 01:53

1 ответ

Это можно сделать с помощью подписи. В общем, идея с закрытыми и открытыми ключами заключается в том, что никто не знает закрытый ключ, но все знают открытый ключ (дух: P). В Ethereum адрес учетной записи получается из открытого ключа. Таким образом, вы можете потребовать от пользователя предоставить подпись некоторых данных и восстановить из них адрес (см. ecrecover), чтобы выполнить проверку.

При этом, вероятно, проще сказать, что msg.sender (учетная запись, которая запустила функцию) должна быть победителем. Таким образом, вы не полагаетесь на подписи и даже поддерживаете кошельки на основе контрактов.

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

Чтобы сделать окончательное суждение по этому поводу, потребуется увидеть более окончательное состояние контракта, поскольку безопасность смарт-контрактов зависит от многих деталей;)

0
Richard 8 Янв 2022 в 02:53