Fix isCoinbase

Signed-off-by: James Zuccon <zuccon@gmail.com>
This commit is contained in:
James Zuccon
2024-09-12 21:44:02 +10:00
parent a158505b5f
commit 68758140a8
2 changed files with 11 additions and 22 deletions
+11 -13
View File
@@ -108,24 +108,22 @@ export class Transaction {
} }
public isCoinbase(): boolean { public isCoinbase(): boolean {
// TODO: This definitely needs checking. // A coinbase transaction MUST only have one input
// TODO: You're a moron Jim. outpointTransactionHash is 0x00 x 32 for Coinbase. if (this.getInputs().length !== 1) {
// A coinbase transaction MUST only have one input.
if (this.getInputs().length > 1) {
return false; return false;
} }
// Get the input's unlocking bytecode. const input = this.getInputs()[0];
const unlockingBytecode = this.getInputs()[0].unlockingBytecode;
// Get the firt byte. // Check if the outpoint transaction hash is all zeros (32 bytes of 0x00)
const firstByte = unlockingBytecode[0]; const isOutpointZero = input.outpointTransactionHash.every(
(byte) => byte === 0x00
);
if (firstByte >= 0x01 && firstByte <= 0x4b) { // Check if the outpoint index is 0xFFFFFFFF (or -1 in signed 32-bit integer representation)
return true; const isOutpointIndexMax = input.outpointIndex === 0xffffffff;
}
return false; // Both conditions must be true for a coinbase transaction
return isOutpointZero && isOutpointIndexMax;
} }
} }
@@ -81,21 +81,15 @@ export class BlockchainLocal implements IBlockchain {
const utxoSet = this.deriveUtxoSet(); const utxoSet = this.deriveUtxoSet();
if (!opts.skipValidation) { if (!opts.skipValidation) {
console.log('utxoSet', utxoSet);
// Find the source outputs from our UTXO set so that we can make sure the transaction is valid. // Find the source outputs from our UTXO set so that we can make sure the transaction is valid.
const sourceOutputs = tx.getInputs().map((input) => { const sourceOutputs = tx.getInputs().map((input) => {
const utxoId = `${binToHex(input.outpointTransactionHash)}:${ const utxoId = `${binToHex(input.outpointTransactionHash)}:${
input.outpointIndex input.outpointIndex
}`; }`;
console.log(utxoId);
return utxoSet[utxoId]; return utxoSet[utxoId];
}); });
console.log('sourceOutputs', sourceOutputs);
// Validate the transaction. // Validate the transaction.
BlockchainLocal.validateTransaction(tx, sourceOutputs); BlockchainLocal.validateTransaction(tx, sourceOutputs);
} }
@@ -333,9 +327,6 @@ export class BlockchainLocal implements IBlockchain {
* @todo Consider moving this to Transaction Primitive. Trade-off is that it's probably big. Maybe standalone util? * @todo Consider moving this to Transaction Primitive. Trade-off is that it's probably big. Maybe standalone util?
*/ */
static validateTransaction(tx: Transaction, sourceOutputs: Array<Output>) { static validateTransaction(tx: Transaction, sourceOutputs: Array<Output>) {
console.log(tx);
console.log(sourceOutputs);
const virtualMachine = createVirtualMachineBCH(); const virtualMachine = createVirtualMachineBCH();
const virtualMachineResult = virtualMachine.verify({ const virtualMachineResult = virtualMachine.verify({
transaction: { transaction: {