¿Puedo web3.eth.sign con clave privada?

Quiero usar web3.eth.signpara crear una firma que se almacenará en blockchain y se verificará más tarde mediante un contrato (con ecrecover). Me gustaría usar la menor cantidad de bibliotecas posible.

Los documentos de Web3 especifican que para usar web3.eth.signse debe proporcionar una clave pública y se debe desbloquear la cuenta.

  1. ¿Puedo desbloquear una cuenta sin ejecutar un nodo ethereum?
  2. Conozco la clave privada de esta cuenta, ¿puedo crear una firma usando una clave privada en lugar de una clave pública y sin desbloquear? Parece que se puede hacer con la ayuda de un secp256k1paquete, pero ¿es esto factible solo con web3?

Respuestas (1)

  1. N/A, en el sentido de que no necesita desbloquear una cuenta en absoluto.
  2. Sí, ver más abajo.

Lo siguiente usa la versión 1.0.0-beta de Web3.js, que ahora es la instalada por defecto por npm. Tenga en cuenta que no se adjunta ningún nodo.

> var Web3 = require('web3');
> var web3 = new Web3();
> web3.version
'1.0.0-beta.10'

El segundo parámetro a continuación es la clave privada:

> web3.eth.accounts.sign("Hello, world!", '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef')
{ message: 'Hello, world!',
  messageHash: '0xb453bd4e271eed985cbab8231da609c4ce0a9cf1f763b6c1594e76315510e0f1',
  v: '0x1b',
  r: '0x3bc843a917d6c19c487c1d0c660cdd61389ce2a7651ee3171bcc212ffddca164',
  s: '0x193f1f2e06f7ed8f9fbf2254232d99848a8102b552032b68a5507b4d81492f0f',
  signature: '0x3bc843a917d6c19c487c1d0c660cdd61389ce2a7651ee3171bcc212ffddca164193f1f2e06f7ed8f9fbf2254232d99848a8102b552032b68a5507b4d81492f0f1b' }

Y la firma también se verifica (la cuenta recuperada es la misma que la cuenta generada directamente a partir de la clave privada):

> web3.eth.accounts.recover('0xb453bd4e271eed985cbab8231da609c4ce0a9cf1f763b6c1594e76315510e0f1', '0x1b', '0x3bc843a917d6c19c487c1d0c660cdd61389ce2a7651ee3171bcc212ffddca164', '0x193f1f2e06f7ed8f9fbf2254232d99848a8102b552032b68a5507b4d81492f0f')
'0xFCAd0B19bB29D4674531d6f115237E16AfCE377c'
>
> web3.eth.accounts.privateKeyToAccount('0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef');
{ address: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c',
  privateKey: '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',
...}
Gracias, creo que usaré secp256k1 hasta que web3@1.0.0 esté oficialmente disponible y luego usaré su solución.