EthereumJS: cómo obtener una clave pública de una clave privada

Estoy tratando de crear una clave privada y su clave pública correspondiente usando la biblioteca EthereumJS. Hasta ahora todo bien, he podido crear claves privadas usando el método keythereum.create(). Sin embargo, me encuentro atascado cuando se trata de clave pública.

Escuché que usando el algoritmo de firma digital de curva elíptica (ECDSA) es posible obtener una clave pública de Ethereum (64 bytes de largo) de su clave privada. La pregunta es cómo puedo codificar este proceso usando la biblioteca EthereumJS. Tal vez haya algún método simple para derivar la clave pública, pero no puedo encontrarlo. Cualquier ayuda será apreciada.

Encontré información limitada sobre preguntas anteriores de StackExchange, pero preferiría una respuesta centrada en EthereumJS:

¿Cómo se generan las direcciones ethereum?

Crear un archivo de claves y una dirección a partir de una clave privada

¡Gracias!

Respuestas (2)

ethereumjs-wallet se puede usar para obtener una clave pública de una clave privada:

> const hdkey = require('ethereumjs-wallet/hdkey')
> const privateKey = hdkey.fromMasterSeed('random')._hdkey._privateKey
> const Wallet = require('ethereumjs-wallet').default
> const wallet = Wallet.fromPrivateKey(privateKey)
> wallet.getPublicKeyString()
'0x11f2b30c9479ccaa639962e943ca7cfd3498705258ddb49dfe25bba00a555e48cb35a79f3d084ce26dbac0e6bb887463774817cb80e89b20c0990bc47f9075d5'
> wallet.getPublicKey()
<Buffer 11 f2 b3 0c 94 79 cc aa 63 99 62 e9 43 ca 7c fd 34 98 70 52 58 dd b4 9d fe 25 bb a0 0a 55 5e 48 cb 35 a7 9f 3d 08 4c e2 6d ba c0 e6 bb 88 74 63 77 48 ... >

Otra opción es usar ethereumjs-util (que ethereumjs-wallet usa internamente):

> const util = require('ethereumjs-util')
> util.privateToPublic(privateKey)
<Buffer 11 f2 b3 0c 94 79 cc aa 63 99 62 e9 43 ca 7c fd 34 98 70 52 58 dd b4 9d fe 25 bb a0 0a 55 5e 48 cb 35 a7 9f 3d 08 4c e2 6d ba c0 e6 bb 88 74 63 77 48 ... >

Otra opción más es secp256k1 :

> const secp256k1 = require('secp256k1')
> secp256k1.publicKeyCreate(privateKey, false).slice(1)
<Buffer 11 f2 b3 0c 94 79 cc aa 63 99 62 e9 43 ca 7c fd 34 98 70 52 58 dd b4 9d fe 25 bb a0 0a 55 5e 48 cb 35 a7 9f 3d 08 4c e2 6d ba c0 e6 bb 88 74 63 77 48 ... >

slice(1)es soltar el tipo de byte que está codificado como 04ethereum.

¿Cómo convierte un pk de cadena en un búfer para usar con los métodos anteriores? probé el nuevo Buffer (pk, 'hex') pero no funcionó.
¿Cómo usar ethereumjs-wallet? No hay un paquete en npm para usar npm install para instalar la dependencia
@Frankie, puedes instalarlo desde npm regitsry :npm i ethereumjs-wallet
Uso toBufferde @Rayjax de ethereumjs-util: el enlace a la documentación es: github.com/ethereumjs/ethereumjs-util/blob/master/docs/…
Es una mala práctica usar propiedades de objetos privados como _hdkey._privateKey. Considere usar la API pública.
const wallet = Wallet.fromPrivateKey(privateKey)no hay tal método
@ekks, esta publicación está un poco desactualizada, pero aún debería ser válida. Consulte la API de Wallet .

Esta es la respuesta correcta. tienes que usarconst wallet = Wallet['default'].fromPrivateKey(privateKeyBuffer);

Generación de una billetera Ethereum con una clave privada existente