Steht vor einem Problem bei der Generierung von Transaktionssignaturen mit einer C-Bibliothek

Ich versuche, eine Signatur für eine Rohtransaktion mit einer in C implementierten ECDSA-Bibliothek zu generieren.

Hier sind die Transaktionsparameter:

const txParams = {
    "nonce": "0x05",
    "gasPrice": "0x0ba43b7400",
    "gasLimit": "0x5208",
    "to": "0x9fbad6ab4b240d7512f863753ad3449f9ad6a530",
    "value": "0x0de0b6b3a7640000",
    "data": "0x",
    "chainId": 4
}

Dann generiere ich den RLP-codierten Keccak256-Hash der Transaktionsparameter. Unten ist der RLP-Hash:

ad7de070ee104a433e37298f70feb6af08da26287efff6af2b25bbf64a56b70b

Alle Schritte bis hierher werden mit der ethereumjs-tx -Bibliothek durchgeführt.

Im C-Programm konvertiere ich den RLP-Hash in das Byte-Format und speichere ihn in einem Byte-Array.

static uint8_t m_hash[] =
{
  0xad,0x7d,0xe0,0x70,0xee,0x10,0x4a,0x43,
  0x3e,0x37,0x29,0x8f,0x70,0xfe,0xb6,0xaf,
  0x08,0xda,0x26,0x28,0x7e,0xff,0xf6,0xaf,
  0x2b,0x25,0xbb,0xf6,0x4a,0x56,0xb7,0x0b
};

Diese wird dann mit dem privaten Schlüssel signiert.

Die Ausgabesignatur ist jedes Mal anders, wenn ich das Programm ausführe, und unten sind einige Beispiele.

29C1C06C3E60D5BD51F9F803AEE5193ACABFFD6B45FAC48C7DDE737427FB7F2C643B35FABB633E6A6B6ABC52F7907D245457ECAE5F2372D3D6A85BC2B68A4DF0

64FE2A3AF423642EFC989BAD1503CEA2637FC5543963E64F95A0644942D96EF5663267511DB6A8853E666F1877ACEAC86470DF8A710D844177E66DE4A158F0EA

B3C2DA2C5800FE4773BECF5A0690041483AB6C551A8DE6CCB84FD07EDD09857B3B2AAFA0BA268A4B7178B260C8A79BC86EFF60A55D60EFD11247632A9AB11382

Ich verwende dann die Sign-Funktion von ethereumjs-util , um diese Signatur zu parsen und sie in v-, r-, s-Werte zu codieren.

Um v zu berechnen, habe ich verschiedene Werte der Wiederherstellungs-ID im Bereich 0 - 3 ausprobiert, die ich direkt in die Vorzeichenfunktion von ethereumjs-util eingebe , die so aussieht.

exports.ecsign = function (msgHash, privateKey) {

  // -------------------------------------------------
  // Original Implementation

  // var sig = secp256k1.sign(msgHash, privateKey);

  // --------------------------------------------------


  // --------------------------------------------------
  // My changes

  var sig = {
    signature: "",
    recovery: 0
  }

  var signature = "29C1C06C3E60D5BD51F9F803AEE5193ACABFFD6B45FAC48C7DDE737427FB7F2C643B35FABB633E6A6B6ABC52F7907D245457ECAE5F2372D3D6A85BC2B68A4DF0"

  sig.signature = Buffer.from(signature, 'hex');

  // --------------------------------------------------

  var ret = {};
  ret.r = sig.signature.slice(0, 32);
  ret.s = sig.signature.slice(32, 64);
  ret.v = sig.recovery + 27;
  return ret;
};

Dies gibt die signierte Transaktion zurück, die ich dann serialisiere und versuche, an die Ethereum-Blockchain zu senden

0xf86c05850ba43b7400825208949fbad6ab4b240d7512f863753ad3449f9ad6a530880de0b6b3a7640000802ca029c1c06c3e60d5bd51f9f803aee5193acabffd6b45fac48c7dde737427fb7f2ca0643b35fabb633e6a6b6abc52f7907d245457ecae5f2372d3d6a85bc2b68a4df0

An dieser Stelle erhalte ich eine Fehlermeldung mit der Aufschrift „Ungültiger Absender“.

Kann mir jemand helfen, was ich hier falsch mache?

Antworten (1)

Tut mir leid, ich habe versucht, die Transaktion an das Hauptnetzwerk statt an das Rinkeby-Testnetzwerk zu senden. Es funktioniert jetzt gut.