Verwendung von web3 zum Signieren einer Transaktion ohne Verbindung zu geth

Ist es möglich, die web3.js-Bibliothek im Browser eines Clients zu verwenden, damit er eine Adresse generieren und eine Transaktion signieren kann, ohne dass er sich mit einem Ethereum-Knoten verbindet?

Antworten (5)

Nicht in web3.js. BEARBEITEN : Wie von @Andromelus beantwortet, kann web3js 1.0 dies mit der folgenden Funktion tun:web3.eth.accounts.signTransaction(tx, privateKey [, callback]);

Es gibt andere Bibliotheken wie https://github.com/ethereumjs/ethereumjs-tx und https://github.com/SilentCicero/ethereumjs-accounts , die verwendet werden können. Siehe Offline-Rohtransaktionen erstellen und signieren?

Sieht so aus, als würde das dataFeld als Hex gesendet. Wie konvertiere ich meinen Funktionsaufruf und Parameter, um ihn einzufügen? Zum Beispiel, wenn ich anrufen will: setName("roger")auf den Vertrag.
Ich sehe keinen Zusammenhang zwischen den Fragen. Bitte präzisieren/klären Sie und stellen Sie eine separate Frage.
Es ist jedoch möglich, Transaktionen mit web3js zu signieren.

Es ist möglich, Transaktionen mit web3js zu signieren, überprüfen Sie die Version 1.0.0

Ich würde auch https://github.com/ethjs/ethjs-provider-signer überprüfen

Es hat genau das, wonach Sie suchen.

Ich habe nach einer Antwort auf das oben Gesagte gesucht und folgendes herausgefunden. Das eth-Modul kann verwendet werden, indem zuerst web3 mit dem Standardkonstruktor instanziiert und dann die sign-Funktion aufgerufen wird.

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

Sie könnten dieses Skript verwenden und so anpassen, dass es in einem Browser ausgeführt wird (es ist ein Befehlszeilentool für Node).

Ich kopiere es hier für den Fall, dass es später nicht mehr verfügbar ist:

#!/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();