Proporcionar billetera de seguridad

Tengo un servicio donde los usuarios pueden comprar mi producto. Además de pagar con tarjeta, quiero poder permitir que los usuarios paguen en ETH. Creo que generará direcciones correctamente para cada usuario para que sea posible seguir el saldo. En el servidor que he ejecutado geth, los usuarios obtienen sus direcciones a través de la rpcsolicitud. Pero si alguien tiene un servidor pirateado, puede retirar todas las cantidades. ¿Cómo puedo proporcionar una billetera segura?

Cualquier sugerencia sería muy apreciada.

Respuestas (1)

Puedes usar carteras HD . Podrá almacenar sus palabras semilla de forma segura fuera de línea, poner la clave pública maestra en un servidor y generar direcciones de recepción basadas en ella.

Así es como puede generar direcciones basadas en una clave pública maestra que corresponde a una ruta de derivación base:

const wallet = require('ethereumjs-wallet')
const hdkey = require('ethereumjs-wallet/hdkey')

const create_addresses = async (from, to) => {

  const addresses = [];

  const master_public_key = process.env.MASTER_PUBLIC_KEY;

  const hdk = hdkey.fromExtendedKey(master_public_key);

  from = from || 0;
  to = to || 100;

  for (let i = from; i <= to; i++){
    const child = hdk.deriveChild(i);
    const w = wallet.fromExtendedPublicKey( child.publicExtendedKey() );
    const addr = {};
    addr[w.getAddressString()] = `${process.env.BASE_DERIVATION_PATH}/${i}`;
    addresses.push(addr);
  };

  return addresses;
}

Suponiendo que el valor encontrado en process.env.MASTER_PUBLIC_KEYcorresponde a la ruta de derivación m/44'/60'/0, la función anterior, cuando se llama sin ningún parámetro, generará direcciones de m/44'/60'/0/0am/44'/60'/0/100

Actualizar: obtener la clave pública maestra:

const get_mpk = ( seed, bdp ) => {
  const seed = bip39.mnemonicToSeed(mnemonic)
  const hdk = hdkey.fromMasterSeed(seed);

  const base_derivation_path = bdp || "m/44'/60'/0'/0";
  const base_derived = hdk.derivePath(base_derivation_path);
  const master_public_key = base_derived.publicExtendedKey();
  return master_public_key;
}
¡Gracias! ¿Puede proporcionar también cómo puedo generar MASTER_PUBLIC_KEY? y luego, ¿cómo retiro las monedas recibidas?
He agregado el código que genera las MASTER_PUBLIC_KEYpalabras iniciales y la ruta de derivación. Desafortunadamente, no tengo el código para crear y firmar transacciones en un solo lugar (estamos creando el tx en línea y lo firmamos fuera de línea) y no tengo tiempo para armarlo ahora.
Solo quiero entender lo que necesito tener para hacer transacciones. ¿Cómo puedo entender que necesito tener una clave privada para realizar transacciones desde esas direcciones? Pero, ¿qué clave privada necesito tener? ¿Y cómo puedo usarlo?