¿Cómo verificamos la firma en una transacción sin procesar usando Bitcoinj?

Logré crear un tx sin procesar usando Bitcoinj pero no pude descubrir cómo verificar sus firmas. Suponiendo que conozco las direcciones correspondientes a las salidas (supuestamente) no gastadas utilizadas como entradas para el Tx, ¿cuál es la forma más fácil de verificar el Tx?

Respuestas (1)

Está interesado en las siguientes llamadas a la API:

public List<TransactionInput> Transaction.getInputs()
public Script TransactionInput.getScriptSig() throws ScriptException
public void Script.correctlySpends(Transaction txContainingThis, long scriptSigIndex, Script scriptPubKey)

Úsalos así:

Transaction tx = ...
List<TransactionInput> inputs = tx.getInputs();
for(int i = 0; i < inputs.size(); i++) {
    TransactionInput input = inputs.get(i);
    Script scriptSig = input.getScriptSig();
    Script scriptPubKey = ...
    scriptSig.correctlySpends(tx, i, scriptPubKey);
}

La parte complicada es obtener scriptPubKey. Si tiene las transacciones que está gastando en la memoria, es tan simple comoinput.getConnectedOutput().getScriptPubKey();

Si no es así, puede hacer una conjetura convirtiendo la dirección en una P2PKH scriptPubKey.

public static Script ScriptBuilder.createOutputScript(Address to)

Esto crea un caso límite en el que si alguien intenta gastar una salida de P2PK , parecerá que se firmó incorrectamente en su programa. (Ambos están representados por direcciones).

Parece responder a la pregunta. Comprobará y revertirá. Gracias por mencionar las salidas P2PK. Las transacciones son creadas por mí y son estándar, por lo que probablemente pueda ignorar esto.
correctlySpendsrequiere un cuarto parámetro booleano ( enforceP2SH). ¿Qué es eso?
@ Jus12 Es para implementar un caso de borde raro de BIP0016 . Establézcalo en verdadero. PD Estás usando una versión antigua de BitcoinJ. Deberías actualizarlo.
Gracias. Lo puse en verdadero. Hay cambios significativos de 0,11 a 0,12. Traté de actualizar pero rompe mi código (requiere algo de refactorización). Llegará a eso eventualmente. ¿Hay algún problema serio al usar 0.11?
@ Jus12 I tried to upgrade but it breaks my code (requires some refactoring)Ah, está bien. Are there any serious issues in using 0.11?Bueno, la gente en Internet asumirá que estás usando la última versión. :) Pero no hay nada específico en lo que pueda pensar.
Como actualización, en realidad hay algo serio en el uso de 0.11 según este informe de error: github.com/bitcoinj/bitcoinj/issues/1082