Liquid unblinding: Replacing async/await with observable.

This commit is contained in:
softsimon 2021-08-18 14:05:40 +03:00
parent 7fe9993f91
commit f5bc9ced0a
No known key found for this signature in database
GPG Key ID: 488D7DCFB5A430D7
2 changed files with 18 additions and 13 deletions

View File

@ -58,7 +58,7 @@ export class LiquidUnblinding {
// Lookup all transaction inputs/outputs and attach the unblinded data // Lookup all transaction inputs/outputs and attach the unblinded data
tryUnblindTx(tx: Transaction) { tryUnblindTx(tx: Transaction) {
if (tx) { if (tx) {
if (tx._unblinded) { return tx._unblinded; } if (tx._unblinded) { return tx; }
let matched = 0; let matched = 0;
if (tx.vout !== undefined) { if (tx.vout !== undefined) {
tx.vout.forEach(vout => matched += +this.tryUnblindOut(vout)); tx.vout.forEach(vout => matched += +this.tryUnblindOut(vout));
@ -71,7 +71,7 @@ export class LiquidUnblinding {
throw new Error(`Invalid blinding data.`) throw new Error(`Invalid blinding data.`)
} }
tx._deduced = false; // invalidate cache so deduction is attempted again tx._deduced = false; // invalidate cache so deduction is attempted again
return tx._unblinded; return tx;
} }
} }
} }
@ -131,8 +131,9 @@ export class LiquidUnblinding {
const blinders = this.parseBlinders(windowLocationHash); const blinders = this.parseBlinders(windowLocationHash);
if (blinders) { if (blinders) {
this.commitments = await this.makeCommitmentMap(blinders); this.commitments = await this.makeCommitmentMap(blinders);
this.tryUnblindTx(tx); return this.tryUnblindTx(tx);
} }
} }
throw new Error('Invalid blinding data.');
} }
} }

View File

@ -10,7 +10,7 @@ import {
map map
} from 'rxjs/operators'; } from 'rxjs/operators';
import { Transaction, Block } from '../../interfaces/electrs.interface'; import { Transaction, Block } from '../../interfaces/electrs.interface';
import { of, merge, Subscription, Observable, Subject, timer, combineLatest, } from 'rxjs'; import { of, merge, Subscription, Observable, Subject, timer, combineLatest, from } from 'rxjs';
import { StateService } from '../../services/state.service'; import { StateService } from '../../services/state.service';
import { WebsocketService } from '../../services/websocket.service'; import { WebsocketService } from '../../services/websocket.service';
import { AudioService } from 'src/app/services/audio.service'; import { AudioService } from 'src/app/services/audio.service';
@ -154,21 +154,25 @@ export class TransactionComponent implements OnInit, OnDestroy {
transactionObservable$, transactionObservable$,
this.stateService.mempoolTransactions$ this.stateService.mempoolTransactions$
); );
}),
switchMap((tx) => {
if (this.network === 'liquid') {
return from(this.liquidUnblinding.checkUnblindedTx(tx))
.pipe(
catchError((error) => {
this.errorUnblinded = error;
return of(tx);
})
)
}
return of(tx);
}) })
) )
.subscribe(async (tx: Transaction) => { .subscribe((tx: Transaction) => {
if (!tx) { if (!tx) {
return; return;
} }
if (this.network === 'liquid') {
try {
await this.liquidUnblinding.checkUnblindedTx(tx)
} catch (error) {
this.errorUnblinded = error;
}
}
this.tx = tx; this.tx = tx;
if (tx.fee === undefined) { if (tx.fee === undefined) {
this.tx.fee = 0; this.tx.fee = 0;