Quiero usar web3.eth.sign
para 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.sign
se debe proporcionar una clave pública y se debe desbloquear la cuenta.
secp256k1
paquete, pero ¿es esto factible solo con web3?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',
...}
xaxa