Генерация нескольких депозитных адресов для одной учетной записи

Я хочу создать что-то вроде криптобиржи, в которой мне нужно генерировать разные уникальные адреса депозита для каждого пользователя, чтобы они могли отправлять средства на свои счета, а я мог бы отслеживать, сколько внес депозит каждый пользователь. Это довольно легко сделать в других криптовалютах, таких как биткойн. Однако кажется, что это невозможно в Ethereum (или, может быть, я ошибаюсь).

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

Поэтому мне было интересно, могу ли я создать несколько депозитных адресов, соответствующих одной учетной записи в Ethereum, чтобы каждый пользователь мог отправлять средства на другой адрес, поэтому я могу отслеживать, какой пользователь отправил, сколько и когда я хочу потратить эти средства, я могу подписать транзакцию с одним закрытым ключом и оплатить комиссию за транзакцию только один раз (потратить все эфиры вместе)? И если совершенно невозможно иметь несколько депозитных адресов, соответствующих одной учетной записи, то что я могу сделать?


PS: я видел несколько подобных вопросов в этом StackExchange, но ни один из ответов на самом деле не ответил на мой вопрос. Поэтому, пожалуйста, помедлите, прежде чем отмечать это как дубликат.

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

Ответы (1)

Вы пытаетесь применить модель, подходящую для Биткойна, в основном из-за его ограничений. Это будет неудобная стратегия для Ethereum, которая упускает из виду его сильные стороны.

Биткойн: Не особо программируемый, но легко вывести средства с нескольких счетов. Ethereum: особенно программируемый, но не так просто вывести средства с нескольких счетов.

Ethereum также имеет уникальные соображения безопасности, и важно подтвердить, что у вашего клиента есть все возможности, которые предполагает ваш контракт, такие как возможность формировать транзакцию и подписывать запрос на снятие средств. Это НЕ тот случай, если они отправляются с другого обмена, поэтому вам нужно предотвратить это. Вам, вероятно, в любом случае потребуется регистрация / KYC, поэтому подтвердите, что они имеют полный контроль над счетами, которые они будут использовать, а затем сообщите в контракте, что они «одобрены» для отправки денег.

  1. Вы можете использовать единый депозитный счет — все деньги вместе, поэтому нет необходимости подметать.
  2. Вы можете знать, кто его отправил, и генерировать события, записывать его и т. д. - все требования к учету.
  3. Это программируется - что бы ни случилось дальше.

Вы должны подтвердить, что ваши пользователи могут подписывать транзакцию. Это гарантирует, что они смогут работать с любым интерфейсом контракта, который вы им покажете в будущем .

  1. Попросите их подписать сообщение и отправить его вам вне сети (бесплатно). Подтвердите их адрес с помощью ecrecover.
  2. Теперь вы знаете, кто есть кто. Не откуда пришли деньги. Откуда взялось. Нет причин, по которым пользователь не может подтвердить несколько учетных записей (шаг 1), но неразумно принимать средства от неизвестных отправителей.

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

Это представлено не как готовый к бою производственный контракт, а скорее как простой пример, демонстрирующий подход.

pragma solidity 0.5.16;

contract Deposit {

    address payable public wallet;

    mapping(address => bool) public approved;

    event LogApproved(address approver, address approved);
    event LogDeposit(address sender, uint amount);

    function authorize(address allowed) public {
        require(msg.sender == wallet, "Only the owner can do this, e.g. from their admin server.");
        emit LogApproved(msg.sender, allowed);
        approved[allowed] = true;
    }

    function deposit() public payable {
        require(approved[msg.sender], "Unauthorized sender. Please register.");
        emit LogDeposit(msg.sender, msg.value);  // <=== there's your accounting
        wallet.transfer(msg.value);
    }
}

Проблема бухгалтерского учета увековечена в блокчейне и может быть проверена внешним клиентом, например, nodejs. Деньги поступают на ваш walletсчет, и вы можете продолжить оттуда.

Надеюсь, поможет.

Спасибо за ваш подробный ответ. хотя это кажется хорошим подходом, я считаю, что криптобиржи, такие как Binance, не используют этот подход. поскольку отправка эфира на Binance происходит так же, как отправка на него BTC. Итак, на самом деле мне было интересно, как они решают эту проблему для эфира.
Вы, безусловно, можете сделать это, 1) создать учетную запись, 2) следить за деньгами и 3) отправить деньги вперед. Сервер будет иметь ключи подписи для учетных записей, которые он создает. Сервер будет отправлять с "моего счета", баланс счета и оплату газа.
@РобХитченс. Подход, который вы описали последним, соответствует моим потребностям. Однако есть проблема, которую я вижу, пересылка стоит газа. Это работает, когда ETH отправляется на депозитные адреса. Что если токен ERC20 отправлен, а адрес депозита не имеет ETH для оплаты газом за пересылку?