Usando web3 para firmar una transacción sin conectarse a geth

¿Es posible usar la biblioteca web3.js en el navegador de un cliente para permitirles generar una dirección y firmar una transacción sin que se conecten a un nodo ethereum?

Respuestas (5)

No en web3.js. EDITAR : como respondió @Andromelus, web3js 1.0 puede hacerlo con la siguiente función:web3.eth.accounts.signTransaction(tx, privateKey [, callback]);

Hay otras bibliotecas, como https://github.com/ethereumjs/ethereumjs-tx y https://github.com/SilentCicero/ethereumjs-accounts , que se pueden usar. Consulte ¿Crear y firmar transacciones sin procesar SIN CONEXIÓN?

Parece que el datacampo se envía como hexadecimal. ¿Cómo convierto mi llamada de función y parámetro para ponerlo? Por ejemplo, si quiero llamar: setName("roger")en el contrato.
No veo la conexión entre las preguntas. Explique/aclare y haga una pregunta por separado.
Sin embargo, es posible firmar transacciones con web3js.

Es posible firmar transacciones con web3js, verifique la versión 1.0.0

También revisaría https://github.com/ethjs/ethjs-provider-signer

Tiene justo lo que buscas.

Estaba buscando una respuesta a lo anterior, descubrí lo siguiente. El módulo eth se puede usar creando primero una instancia de web3 con el constructor predeterminado y luego llamando a la función de signo.

var web3 = require('web3');
var myWeb3 = new web3();
var signedTx = myWeb3.eth.signTransaction(tx, privateKey [, callback]);

Puede usar este script y ajustarlo para que se ejecute en un navegador (es una herramienta de línea de comandos para Node).

Lo copio aquí en caso de que no esté disponible más adelante:

#!/usr/bin/env node
'use strict';

// ethereum: generate signed offline transactions

const fs        = require('fs-extra');
const rls       = require('readline-sync');
const Accounts  = require('web3-eth-accounts');
const web3utils = require('web3-utils');
const accounts  = new Accounts();

async function main() {
    if (process.argv.length < 6) {
        console.log("usage:\n" +
            "\tsign-offline.js filename recipient amount nonce gasprice\n\n" +
            "\t\t amount is given in ether, gas price is given in gwei");
        process.exit(1);
    }

    let filename  = process.argv[2];
    let recipient = process.argv[3];
    let amount    = web3utils.toWei(process.argv[4], "ether");
    let nonce     = process.argv[5];
    let gasprice  = web3utils.toWei(process.argv[6], "gwei");

    console.log("file %s to %s amount %f eth nonce %d price %f",
        filename, recipient, amount, nonce, gasprice);

    let keystore = await fs.readJson(filename);

    if (!("crypto" in keystore)) {
        // MEW creates capitalized "crypto" property
        // web3 expects it in lowercase
        keystore.crypto = keystore.Crypto;
        delete keystore.Crypto;
    }

    let password  = rls.question('keystore Password? ', { hideEchoBack: true });
    let myaccount = accounts.decrypt(keystore, password);
    let data      = accounts.signTransaction({
        to: recipient,
        value: amount,
        gas: 21000,
        gasPrice: gasprice,
        nonce: nonce,
        chainId: 1 // mainNet
    }, myaccount.privateKey);
    console.log("signed raw transaction: ", data.rawTransaction);
}

main();