Signieren von Transaktionen mit un/komprimiertem Schlüssel

Guten Tag.

Ich habe 2 Adressen aus demselben privaten Schlüssel erstellt. Eine Adresse wird natürlich komprimiert, die andere nicht.

compressed_public_key = "025d9a1a0a5dab7e3e4a84c30a42ddc0d71b2da0fa1f3b99fbda9fc03eb8c75cd5" 
corresponding_address = "mfjRUvWr9QZadpiRnbRfHS4UDSxdR9FE75"

uncompressed_public_key =  "045d9a1a0a5dab7e3e4a84c30a42ddc0d71b2da0fa1f3b99fbda9fc03eb8c75cd535a0b893f20338d37d20eebe2941859dfe53b175f0bb24a27bc77741f0bb8cac"
uncompressed_address = "mi4kMd3HcLUGJSouNdJZ87eUBbi7cNE6C3"

Ich habe auch einige Münzen an jede Adresse geschickt.

utxo_to_compressed = "963baf6eb615a09afcb05ebcdbd3db05a163994dd2035002477c753ba3281eff"
utxo_to_uncompressed = "08a1286bb379f6eb5151828505b934c1b917201592bb76bd252a53b7a3009b17"

Mit Bitcore habe ich den private_key erstellt, um die Transaktionen und die Utxos wie folgt zu signieren:

privateKey = new bitcore.PrivateKey(BN, "testnet")

scriptSig =  "76a914" + hashedPubKey + "88ac";

And the hashed public keys are:
1bf398bb044e55f1971e384cc1e6d861dca3adb9 for the uncompressed 
025bafbac8a8a1fcbae04f9a6aa8b6f968c9d145 for the compressed

utxo_compressed = new bitcore.Transaction.UnspentOutput({
    "txId": "08a1286bb379f6eb5151828505b934c1b917201592bb76bd252a53b7a3009b17",
    "outputIndex": 0,
  "address": "mi4kMd3HcLUGJSouNdJZ87eUBbi7cNE6C3",
    "script": scriptSig,
    "satoshis": 5000000000
});

utxo_uncompressed = new bitcore.Transaction.UnspentOutput({
    "txId": "963baf6eb615a09afcb05ebcdbd3db05a163994dd2035002477c753ba3281eff",
    "outputIndex": 0,
  "address": "mfjRUvWr9QZadpiRnbRfHS4UDSxdR9FE75",
    "script": scriptSig,
    "satoshis": 5000000000
});

Das Signieren des komprimierten utxo ist kein Problem. Aber sobald ich versuche, die unkomprimierte Transaktion zu signieren, erhalte ich eine Fehlermeldung.

compressedTx = new bitcore.Transaction();
uncompressedTx = new bitcore.Transaction();
compressedTx.from(utxo).to(some output).sign(privateKey); <-This one works fine
uncompressedTx.from(utxo).to(some output).sign(privateKey); <-This one fails
//Some inputs have not been fully signed Use//

In der Vergangenheit habe ich Transaktionen von unkomprimierten öffentlichen Schlüsseln gesendet und eingelöst (ich habe es manuell mit einem einfachen Python-Code gemacht). Ich kann anscheinend keinen Grund finden, warum die Eingaben nicht signiert wurden.

Ich werde jede Hilfe, die Sie anbieten können, sehr zu schätzen wissen

Antworten (2)

komprimierter und unkomprimierter Pubkey haben unterschiedliche Hashes. Ihr Code sollte also ungefähr so ​​​​aussehen:

scriptSig1 = "76a914" + hashedPubKey_1 + "88ac"; 
scriptSig2 = "76a914" + hashedPubKey_2 + "88ac"; 
Danke für deinen Kommentar. Ich verwende tatsächlich 2 verschiedene gehashte öffentliche Schlüssel. Ich werde meinen ursprünglichen Beitrag so schnell wie möglich aktualisieren, um weitere Verwirrung zu vermeiden.
Obwohl ich einen anderen gehashten öffentlichen Schlüssel verwende, kann ich den unkomprimierten TX nicht signieren

folgenden Code von sign.cppetwa line25 jetzt. Scheint, dass das Signieren von unkomprimierten Schlüsseln in neuerem Kerncode absichtlich deaktiviert ist.

Ich habe nicht nachvollzogen, warum das deaktiviert wurde, vielleicht nur, um es potential hash collisionin Zukunft zu vermeiden und mehr Daten zu behalten standardized.

// Signing with uncompressed keys is disabled in witness scripts
if (sigversion == SigVersion::WITNESS_V0 && !key.IsCompressed())
    return false;
Unkomprimierte Schlüssel werden nur für die Ausgabe von Segwit-Ausgaben deaktiviert. Der Grund dafür, sie nicht zuzulassen, besteht darin, Transaktionen kleiner zu machen, und hat nichts mit Hash-Kollisionen zu tun.