No pude encontrar ninguna biblioteca que, dado un valor hexadecimal, devuelva verdadero si la cadena dada es una clave privada de éter válida.
¿Alguna pista?
Como mencionó Peter, una clave privada es un blob aleatorio de 256 bits. Es un descuido común que no hay restricciones.
Tiene que ser válido para la curva secp256k1, lo que significa dos condiciones:
n
y tiene un valor de ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141
)En Javascript, puede usar ethereumjs-wallet para realizar esta verificación: Wallet.fromPrivateKey(<yourkey>)
generará una excepción en una entrada no válida.
Alternativamente, también puede usar el privateKeyVerify()
método de la biblioteca subyacente secp256k1
o hacerlo manualmente con la biblioteca de números grandes de su elección.
importante : esta respuesta se refiere a la dirección pública, no a la clave privada, vea los comentarios.
Cada cadena hexadecimal es una dirección válida de Ethereum.
Actualmente no hay sumas de verificación de direcciones implementadas, por lo que todas 0x<40 hex digits here>
son válidas. Estamos considerando agregar ICAP básico en Geth 1.4.1 o Geth 1.5 para permitir la inserción de información adicional en una dirección que evitaría escribirlos mal, pero hasta entonces, mientras sean 40 caracteres hexadecimales, es válido.
También puede usar éteres para verificar. Como esto:
const ethers = require('ethers')
var pk = '0xcaed41dd92c1548cf7536c290e6a1871757fb5fea5721dea3a08c6d4abcd16cf'
let w = new ethers.Wallet(pk)
// Shorter than 32 bytes
pk = '0xcaed41dd92c1548cf7536c290e6a1871757fb5fea5721dea3a08c6d4abcd16'
w = new ethers.Wallet(pk)
// Incorrect hexidecimal string. Change last f to g. G is not hex
pk = '0xcaed41dd92c1548cf7536c290e6a1871757fb5fea5721dea3a08c6d4abcd16cg'
w = new ethers.Wallet(pk)
El primer caso está bien y tendrá éxito.
El segundo arrojará un error.
reason: 'exactly 32 bytes required',
code: 'INVALID_ARGUMENT',
El tercero también arrojará un error:
reason: 'invalid hexidecimal string',
code: 'INVALID_ARGUMENT',
Puede detectar este error para validar su clave privada
pk = '0xcaed41dd92c1548cf7536c290e6a1871757fb5fea5721dea3a08c6d4abcd16cg'
try {
w = new ethers.Wallet(pk)
}
catch (e) {
console.log('Invalid private key.')
}
Avanzado
Péter Szilágyi
Avanzado