Skip to content

Commit

Permalink
Merge remote-tracking branch 'shesek/202101-graceful-degradation' int…
Browse files Browse the repository at this point in the history
…o feature-prune-support
  • Loading branch information
janoside committed Feb 19, 2021
2 parents cb9d58b + bea32a6 commit 8604466
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 2 deletions.
3 changes: 3 additions & 0 deletions .env-sample
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@
# used if BTCEXP_ADDRESS_API=electrumx
#BTCEXP_ELECTRUMX_SERVERS=tls://electrumx.server.com:50002,tcp://127.0.0.1:50001,...

# Use the Electrumx server as an external txindex. This is only available in Electrs.
#BTCEXP_ELECTRUM_TXINDEX=true

# Set number of concurrent RPC requests. Should be lower than your node's "rpcworkqueue" value.
# Note that Bitcoin Core's default rpcworkqueue=16.
# Default: 10
Expand Down
22 changes: 21 additions & 1 deletion app/api/electrumAddressApi.js
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,25 @@ function getAddressBalance(addrScripthash) {
});
}

// Lookup the confirming block hash of a given txid. This only works with Electrs.
// https://github.com/romanz/electrs/commit/a0a3d4f9392e21f9e92fdc274c88fed6d0634794
function lookupTxBlockHash(txid) {
if (electrumClients.length == 0) {
return Promise.reject({ error: "No ElectrumX Connection", userText: noConnectionsErrorText });
}

return runOnAllServers(function(electrumClient) {
return electrumClient.request('blockchain.transaction.get_confirmed_blockhash', [txid]);
}).then(function(results) {
var blockhash = results[0].result;
if (results.slice(1).every(({ result }) => result == blockhash)) {
return blockhash;
} else {
return Promise.reject({conflictedResults:results});
}
});
}

function logStats(cmd, dt, success) {
if (!global.electrumStats.rpc[cmd]) {
global.electrumStats.rpc[cmd] = {count:0, time:0, successes:0, failures:0};
Expand All @@ -341,6 +360,7 @@ function logStats(cmd, dt, success) {

module.exports = {
connectToServers: connectToServers,
getAddressDetails: getAddressDetails
getAddressDetails: getAddressDetails,
lookupTxBlockHash: lookupTxBlockHash,
};

11 changes: 11 additions & 0 deletions app/api/rpcApi.js
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,17 @@ function getRawTransaction(txid, blockhash) {
}

async function noTxIndexTransactionLookup(txid) {
// Try looking up with an external Electrum server, using 'get_confirmed_blockhash'.
// This is only available in Electrs and requires enabling BTCEXP_ELECTRUM_TXINDEX.
if (config.addressApi == "electrumx" && config.electrumTxIndex) {
try {
var blockhash = await electrumAddressApi.lookupTxBlockHash(txid);
return await getRawTransaction(txid, blockhash);
} catch (err) {
debugLog(`Electrs blockhash lookup failed for ${txid}:`, err);
}
}

// Try looking up in wallet transactions
for (var wallet of await listWallets()) {
try { return await getWalletTransaction(wallet, txid); }
Expand Down
4 changes: 3 additions & 1 deletion app/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ for (var i = 0; i < electrumXServerUriStrings.length; i++) {
"BTCEXP_DEMO",
"BTCEXP_PRIVACY_MODE",
"BTCEXP_NO_INMEMORY_RPC_CACHE",
"BTCEXP_RPC_ALLOWALL"
"BTCEXP_RPC_ALLOWALL",
"BTCEXP_ELECTRUM_TXINDEX",

].forEach(function(item) {
if (process.env[item] === undefined) {
Expand Down Expand Up @@ -170,6 +171,7 @@ module.exports = {
],

addressApi:process.env.BTCEXP_ADDRESS_API,
electrumTxIndex:process.env.BTCEXP_ELECTRUM_TXINDEX != "false",
electrumXServers:electrumXServers,

redisUrl:process.env.BTCEXP_REDIS_URL,
Expand Down

0 comments on commit 8604466

Please sign in to comment.