Skip to content

Commit

Permalink
Lookup txid in external Electrum txindex
Browse files Browse the repository at this point in the history
This only works with Electrs and requires enabling BTCEXP_ELECTRUM_TXINDEX.

See: romanz/electrs@a0a3d4f
  • Loading branch information
shesek committed Feb 19, 2021
1 parent 5526d18 commit bea32a6
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 @@ -268,6 +268,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 bea32a6

Please sign in to comment.