Лучшая практика получения эфира на несколько адресов

Скажем, я биржа, у которой много пользователей. Когда я прошу пользователя внести ETH, я даю ему уникальный адрес, чтобы я мог приписать ему ETH.

С биткойнами это легко. Программное обеспечение биткойн-кошелька справляется с этим, и я могу иметь BTC на нескольких адресах, и они рассматриваются как одна учетная запись.

Я понимаю, что с Эфириумом все по-другому.

Я нашел 2 варианта для достижения этого:

  1. Разверните смарт-контракт пересылки один раз для каждого пользователя, дайте адрес пользователю. Когда смарт-контракт получает ETH, он пересылает его на мой основной адрес ETH.
    Плюсы :

    • Пользователь оплачивает стоимость газа за пересылку ETH
    • Только нужно отслеживать одну учетную запись (1 закрытый ключ).

    Минусы :

    • Я должен оплатить стоимость газа за развертывание контракта экспедитора несколько раз
  2. Создайте учетную запись для каждого пользователя. Не давайте закрытый ключ пользователю. Периодически просматривайте все «учетные записи пользователей», которые я контролирую, и отправляйте ETH на «основную учетную запись».

    Плюсы:

    • Мне не нужно платить газ за развертывание смарт-контрактов

    Минусы:

    • Мне нужно отслеживать несколько учетных записей

Какой из этих двух подходов будет стоить мне больше газа? Интуитивно я думаю, что второй будет стоить меньше газа, потому что развертывание смарт-контрактов обходится дороже, чем отправка ETH. Но первый подход, кажется, более популярен на биржах. Это почему?

Я должен отметить, что я не ожидаю, что пользователи будут вносить ETH более одного раза. (Или, скорее, для каждого депозита я бы дал им новый адрес, чтобы было легче отслеживать их депозиты)

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

Ответы (2)

Скажем, я биржа, у которой много пользователей. Когда я прошу пользователя внести ETH, я даю ему уникальный адрес, чтобы я мог приписать ему ETH.

С биткойнами это легко. Программное обеспечение биткойн-кошелька справляется с этим, и я могу иметь BTC на нескольких адресах, и они рассматриваются как одна учетная запись.

Я понимаю, что с Эфириумом все по-другому.

Не уверен, что понимаю, чего вы пытаетесь достичь. Если вы хотите, чтобы люди вносили эфир в ваш контракт, разве вы не можете просто поддерживать сопоставление адресов с балансами? Вы получите адрес отправителя с помощью msg.sender

Позвольте мне описать это из пользовательского опыта POW. Каждому пользователю предоставляется уникальный адрес Ethereum, на который он может внести эфир. Эфир со всех этих адресов попадает в один адрес Эфириума, который я контролирую. Это делает его более ясным?
Это необычайно сложно. Вы должны предоставить любому пользователю один и тот же адрес для внесения депозита, а затем сохранить в договоре его личный адрес, считываемый при внесении депозита, привязывая к адресу текущий баланс этого пользователя. Достаточно простого сопоставления. В чем смысл предоставления разных адресов депозита разным депозиторам, когда так просто понять, кто и что депонирует?
Скажем, в системе вне сети есть пользователь, идентифицированный по его электронной почте. Я хочу попросить этого пользователя оплатить счет в ETH. Мне нужен способ определить, что этот счет был оплачен. Я не хочу спрашивать у пользователя его адрес эфириума по причинам UX. Если я дам ему уникальный адрес ETH для отправки ETH, то, как только ETH будет отправлен на адрес, я знаю, что должен кредитовать этого пользователя в моей системе вне сети. Имеет смысл? Я также не хочу просить пользователя вызвать контракт и передать свой адрес электронной почты, я хочу, чтобы он отправил обычную транзакцию ETH.

Вы бы контракт, который создает контракты. Ваш основной контракт создает новые «дочерние кошельки» для ваших пользователей.

Затем вы можете попросить детей слушать данного владельца, созданного при создании нового кошелька. Таким образом, у них есть определенный адрес, который вы контролируете. Если вы хотите просто мгновенно отправить деньги на свой собственный кошелек, у вас может быть только одна функция в новом контракте, которая является резервной функцией, которая отправляет все ETH на определенный адрес.