Merge pull request #2363 from mempool/nymkappa/bugfix/handle-esplora-error
Wrap esplora call into try/catch when scanning channel forensics
This commit is contained in:
		
						commit
						9d9ead60a6
					
				| @ -285,11 +285,24 @@ class NetworkSyncService { | ||||
|       for (const channel of channels) { | ||||
|         let reason = 0; | ||||
|         // Only Esplora backend can retrieve spent transaction outputs
 | ||||
|         const outspends = await bitcoinApi.$getOutspends(channel.closing_transaction_id); | ||||
|         try { | ||||
|           let outspends: IEsploraApi.Outspend[] | undefined; | ||||
|           try { | ||||
|             outspends = await bitcoinApi.$getOutspends(channel.closing_transaction_id); | ||||
|           } catch (e) { | ||||
|             logger.err(`Failed to call ${config.ESPLORA.REST_API_URL + '/tx/' + channel.closing_transaction_id + '/outspends'}. Reason ${e instanceof Error ? e.message : e}`); | ||||
|             continue; | ||||
|           } | ||||
|           const lightningScriptReasons: number[] = []; | ||||
|           for (const outspend of outspends) { | ||||
|             if (outspend.spent && outspend.txid) { | ||||
|             const spendingTx = await bitcoinApi.$getRawTransaction(outspend.txid); | ||||
|               let spendingTx: IEsploraApi.Transaction | undefined; | ||||
|               try { | ||||
|                 spendingTx = await bitcoinApi.$getRawTransaction(outspend.txid); | ||||
|               } catch (e) { | ||||
|                 logger.err(`Failed to call ${config.ESPLORA.REST_API_URL + '/tx/' + outspend.txid}. Reason ${e instanceof Error ? e.message : e}`); | ||||
|                 continue; | ||||
|               } | ||||
|               const lightningScript = this.findLightningScript(spendingTx.vin[outspend.vin || 0]); | ||||
|               lightningScriptReasons.push(lightningScript); | ||||
|             } | ||||
| @ -310,7 +323,13 @@ class NetworkSyncService { | ||||
|                 We can detect a commitment transaction (force close) by reading Sequence and Locktime | ||||
|                 https://github.com/lightning/bolts/blob/master/03-transactions.md#commitment-transaction
 | ||||
|               */ | ||||
|             const closingTx = await bitcoinApi.$getRawTransaction(channel.closing_transaction_id); | ||||
|               let closingTx: IEsploraApi.Transaction | undefined; | ||||
|               try { | ||||
|                 closingTx = await bitcoinApi.$getRawTransaction(channel.closing_transaction_id); | ||||
|               } catch (e) { | ||||
|                 logger.err(`Failed to call ${config.ESPLORA.REST_API_URL + '/tx/' + channel.closing_transaction_id}. Reason ${e instanceof Error ? e.message : e}`); | ||||
|                 continue; | ||||
|               } | ||||
|               const sequenceHex: string = closingTx.vin[0].sequence.toString(16); | ||||
|               const locktimeHex: string = closingTx.locktime.toString(16); | ||||
|               if (sequenceHex.substring(0, 2) === '80' && locktimeHex.substring(0, 2) === '20') { | ||||
| @ -324,6 +343,9 @@ class NetworkSyncService { | ||||
|             logger.debug('Setting closing reason ' + reason + ' for channel: ' + channel.id + '.'); | ||||
|             await DB.query(`UPDATE channels SET closing_reason = ? WHERE id = ?`, [reason, channel.id]); | ||||
|           } | ||||
|         } catch (e) { | ||||
|           logger.err(`$runClosedChannelsForensics() failed for channel ${channel.short_id}. Reason: ${e instanceof Error ? e.message : e}`); | ||||
|         } | ||||
| 
 | ||||
|         ++progress; | ||||
|         const elapsedSeconds = Math.round((new Date().getTime() / 1000) - this.loggerTimer); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user