Estoy buscando replicar la funcionalidad proporcionada por los intercambios de criptomonedas como Kraken y Poloniex cuando se trata de depositar ETH y tokens. A saber:
¿Cuál es la mejor manera de lograr esto?
Tengo algunas ideas usando web3, pero no estoy seguro de que sean las soluciones más eficientes o escalables:
ETH
web3.eth.accounts.create()
. Asigne la dirección generada al usuario y almacene la clave privada.web3.eth.filter
para monitorear el último bloque en la cadena de bloques ETH. Haga coincidir las transacciones en el bloque con las direcciones de usuario almacenadas y actualice los saldos de los usuarios según corresponda.Problemas con este enfoque : monitorear cada bloque y compararlo con las direcciones almacenadas es computacionalmente intensivo, especialmente si la cantidad de direcciones rastreadas se vuelve grande (cientos de miles). ¿Cómo puede esta escala?
Fichas ERC20
web3.eth.accounts.create()
. Asigne la dirección generada al usuario y al token relevante, y almacene la clave privada.Transfer
eventos cuando ocurre una transacción en el contrato. Supervise este evento mediante web3.eth.filter
. Cuando Transfer
ocurre un evento para una dirección que existe en nuestra base de datos, actualice el saldo del usuario relevante en el intercambio con el monto transferido.Problemas con este enfoque : ¿Cómo configura el filtro web3 para detectar Transfer
eventos solo del token en cuestión, no de toda la red? ¿Debo configurar 1 filtro por dirección o 1 filtro para todas las direcciones de usuario? ¿Cuántas direcciones puede rastrear el filtro web3 a la vez? ¿Qué pasa si las direcciones rastreadas se vuelven muy altas (cientos de miles)?
¿Es esta la forma correcta de pensar en todo esto o me estoy perdiendo algo? Me sorprende que no haya documentación más obvia sobre este flujo, ya que es bastante popular (en intercambios y cualquier otro servicio que acepte pagos en moneda digital).
Probablemente sería algo como esto:
El usuario quiere depositar un token en su intercambio
Si es la primera vez que el usuario deposita ese token, esto ocurre:
La próxima vez que presionen el botón de depósito para obtener la dirección de depósito, ya tendrá una dirección de depósito única para el usuario almacenada en la base de datos que puede presentar al usuario.
El usuario deposita el token en la dirección de depósito
Llame al método balanceOf de los contratos de token pasándole la dirección de depósito que ha generado vinculada al usuario para mostrar el saldo del token de los usuarios en el intercambio. Solo muestra ese saldo de token en particular y nada más para esa dirección.
El usuario quiere retirar su token
Tengo los mismos pensamientos sobre la implementación. Y creo que la solución que propones es buena. Pero tanto para tokens ether como ERC20, no recomiendo monitorear la cadena de bloques.
Para el saldo de ether, llamará web3.eth.getBalance
pasando la dirección para verificar el valor cuando el usuario ingrese a la página y coloque un temporizador de javascript para realizar la llamada cada 15 segundos, por ejemplo.
Y, lo mismo, con respecto a su pregunta para Ether equilibrar los saldos de los tokens ERC20: " ¿Cómo configura el filtro web3 para detectar eventos de transferencia solo del token en cuestión, no de toda la red? ". Creo que la mejor manera es llamar al contrato inteligente del token ERC20 para consultar el saldo de cada token. Esto es llamando al método: function balanceOf(address _owner)
para cada token una vez que el usuario ingresa a la página. Y puede configurar un temporizador de javascript para actualizar los valores cada 15 segundos, por ejemplo.
Creo que esto es lo que hace Kraken, por ejemplo, ya que el contenido de la página se recarga cada dos segundos.
Tenga en cuenta que hará una llamada ajax para actualizar los valores de los saldos sin necesidad de actualizar toda la página. Además, la llamada balanceOf
es gratuita ya que es un método de solo lectura que se ejecutará en su nodo conectado directamente sin ningún costo de gas.
function balanceOf(address _owner)
no es una web3
funcionfunction balanceOf(address _owner)
es un método dentro de cualquier token ERC20. Por lo tanto, puede llamar a este método desde web3
cualquier token ERC20.Necesita una billetera HD (determinista jerárquica). Echa un vistazo al paquete npm de billetera HD de Truffle. Este enlace podría ayudar: https://www.npmjs.com/package/@truffle/hdwallet-provider
Özgur
tallista