Firmar transacciones con clave no comprimida

Buen día.

He creado 2 direcciones a partir de la misma clave privada. Por supuesto, una dirección está comprimida, mientras que la otra no.

compressed_public_key = "025d9a1a0a5dab7e3e4a84c30a42ddc0d71b2da0fa1f3b99fbda9fc03eb8c75cd5" 
corresponding_address = "mfjRUvWr9QZadpiRnbRfHS4UDSxdR9FE75"

uncompressed_public_key =  "045d9a1a0a5dab7e3e4a84c30a42ddc0d71b2da0fa1f3b99fbda9fc03eb8c75cd535a0b893f20338d37d20eebe2941859dfe53b175f0bb24a27bc77741f0bb8cac"
uncompressed_address = "mi4kMd3HcLUGJSouNdJZ87eUBbi7cNE6C3"

También he enviado algunas monedas a cada dirección.

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

Usando bitcore, he creado private_key para firmar las transacciones y los utxos de la siguiente manera:

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
});

Firmar el utxo comprimido no es un problema. Pero una vez que intento firmar la transacción sin comprimir, recibo un mensaje de error.

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//

En el pasado, envié y canjeé transacciones desde una clave pública sin comprimir (lo hice manualmente, usando un código Python simple). Parece que no puedo encontrar ninguna razón por la que las entradas no se hayan firmado.

Apreciaré mucho cualquier ayuda que pueda ofrecer

Respuestas (2)

pubkey comprimida y sin comprimir tienen hashes diferentes. entonces, su código debería ser algo como:

scriptSig1 = "76a914" + hashedPubKey_1 + "88ac"; 
scriptSig2 = "76a914" + hashedPubKey_2 + "88ac"; 
Gracias por tu comentario. De hecho, estoy usando 2 claves públicas hash diferentes. Actualizaré mi publicación original lo antes posible para evitar más confusiones.
Aún así, aunque estoy usando una clave pública hash diferente, no puedo firmar el tx sin comprimir

siguiendo el código de sign.cppaproximadamente line25 ahora. Parece que la firma de claves sin comprimir está deshabilitada en el código central más nuevo.

No seguí por qué estaba deshabilitado, tal vez solo para evitarlo potential hash collisionen el futuro y mantener más datos standardized.

// Signing with uncompressed keys is disabled in witness scripts
if (sigversion == SigVersion::WITNESS_V0 && !key.IsCompressed())
    return false;
Las claves sin comprimir solo están deshabilitadas para gastar salidas de segwit. El motivo para no permitirlos es hacer que las transacciones sean más pequeñas y no está relacionado con las colisiones de hash.