Я хочу воспроизвести функциональность, предоставляемую криптовалютными биржами, такими как Kraken и Poloniex, когда дело доходит до депонирования ETH и токенов. А именно:
Каков наилучший способ добиться этого?
У меня есть несколько идей с использованием web3, но я не уверен, что они являются наиболее эффективными или масштабируемыми решениями:
Эфириум
web3.eth.accounts.create()
. Сопоставьте сгенерированный адрес с пользователем и сохраните закрытый ключ.web3.eth.filter
для мониторинга последнего блока в блокчейне ETH. Сопоставьте транзакции в блоке с сохраненными адресами пользователей и при необходимости обновите балансы пользователей.Проблемы с этим подходом : мониторинг каждого блока и сопоставление с сохраненными адресами требует больших вычислительных ресурсов, особенно если количество отслеживаемых адресов становится большим (сотни тысяч). Как это может масштабироваться?
Токены ERC20
web3.eth.accounts.create()
. Сопоставьте сгенерированный адрес с пользователем и соответствующим токеном и сохраните закрытый ключ.Transfer
события, когда в контракте происходит транзакция. Отслеживайте это событие с помощью web3.eth.filter
. Когда происходит Transfer
событие для адреса, который существует в нашей базе данных, обновите баланс соответствующего пользователя на бирже с переведенной суммой.Проблемы с этим подходом : как настроить фильтр web3 для обнаружения Transfer
событий только из рассматриваемого токена, а не всей сети? Должен ли я установить 1 фильтр для каждого адреса или 1 фильтр для всех адресов пользователей? Сколько адресов может отслеживать фильтр web3 одновременно? Что, если отслеживаемые адреса станут очень большими (сотни тысяч)?
Это правильный способ думать обо всем этом или я что-то упускаю? Я удивлен, что нет более очевидной документации по этому потоку, поскольку он довольно популярен (на биржах и в любом другом сервисе, принимающем платежи в цифровой валюте).
Вероятно, это будет примерно так:
Пользователь хочет внести токен на вашу биржу
Если это первый раз, когда пользователь вносит этот токен, происходит следующее:
В следующий раз, когда они нажмут кнопку депозита, чтобы получить адрес депозита, у вас уже будет уникальный адрес депозита для пользователя, хранящийся в базе данных, который вы можете предоставить пользователю.
Пользователь вносит токен на депозитный адрес
Вызовите метод balanceOf контрактов токенов, передав ему адрес депозита, который вы сгенерировали, привязанный к пользователю, чтобы отобразить баланс токенов пользователей на бирже. Вы показываете только этот конкретный баланс токенов и ничего больше для этого адреса.
Пользователь хочет вывести свой токен
У меня такие же мысли по поводу реализации. И я думаю, что предложенное вами решение хорошее. Но как для эфира, так и для токенов ERC20 я не рекомендую следить за блокчейном.
Для баланса эфира вы вызовете web3.eth.getBalance
передачу адреса, чтобы проверить значение, когда пользователь заходит на страницу, и установите таймер javascript для выполнения вызова, например, каждые 15 секунд.
И то же самое, что касается вашего вопроса о балансе Ether баланса токенов ERC20: « Как вы настроили фильтр web3 для обнаружения событий Transfer только из рассматриваемого токена, а не всей сети? ». Я думаю, что лучший способ — вызвать смарт-контракт токена ERC20, чтобы узнать баланс каждого токена. Это делается путем вызова метода: function balanceOf(address _owner)
для каждого токена после входа пользователя на страницу. И вы можете установить таймер javascript для обновления значений, например, каждые 15 секунд.
Я думаю, что именно это делает Кракен, например, поскольку содержимое страницы перезагружается каждые пару секунд.
Обратите внимание, что вы будете выполнять вызов ajax для обновления значений баланса без необходимости обновления всей страницы. Кроме того, вызов balanceOf
бесплатный, поскольку это метод только для чтения, который будет выполняться на вашем узле, подключенном напрямую, без каких-либо затрат на газ.
function balanceOf(address _owner)
это не web3
функциейfunction balanceOf(address _owner)
— это метод внутри любого токена ERC20. Таким образом, вы можете вызвать этот метод web3
для любого токена ERC20.Вам нужен кошелек HD (Hierarchical Determenistic). Ознакомьтесь с пакетом npm для HD-кошелька Truffle. Эта ссылка может помочь: https://www.npmjs.com/package/@truffle/hdwallet-provider
Озгур
резчик