You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.5 KiB
89 lines
2.5 KiB
const bitcoindService = require('services/bitcoind.js');
|
|
const bashService = require('services/bash.js');
|
|
|
|
async function getBitcoindAddresses() {
|
|
|
|
const addresses = [];
|
|
|
|
// Find standard ip address
|
|
const peerInfo = (await bitcoindService.getPeerInfo()).result;
|
|
|
|
if (peerInfo.length === 0) {
|
|
addresses.push(await getExternalIPFromIPInfo());
|
|
} else {
|
|
|
|
const mostValidIp = getMostValidatedIP(peerInfo);
|
|
|
|
// TODO don't call third party service if running with TOR_ONLY
|
|
if (mostValidIp.includes('onion')) {
|
|
addresses.push(await getExternalIPFromIPInfo());
|
|
} else {
|
|
addresses.push(mostValidIp);
|
|
}
|
|
}
|
|
|
|
// Try to find that Tor onion address.
|
|
const networkInfo = (await bitcoindService.getNetworkInfo()).result;
|
|
|
|
if (Object.prototype.hasOwnProperty.call(networkInfo, 'localaddresses')
|
|
&& networkInfo.localaddresses.length > 0) {
|
|
|
|
// If Tor is initialized there should only be one local address
|
|
addresses.push(networkInfo.localaddresses[0].address);
|
|
}
|
|
|
|
return addresses; // eslint-disable-line object-shorthand
|
|
}
|
|
|
|
async function getExternalIPFromIPInfo() {
|
|
|
|
const options = {};
|
|
|
|
// use ipinfo.io to get ip address if unable to from peers
|
|
const data = await bashService.exec('curl', ['https://ipinfo.io/ip'], options);
|
|
|
|
// clean return characters
|
|
return data.out.replace(/[^a-zA-Z0-9 .:]/g, '');
|
|
}
|
|
|
|
function getMostValidatedIP(peerInfo) {
|
|
const peerCount = {};
|
|
const mostValidatedExternalIp = {
|
|
count: 0,
|
|
externalIP: 'UNKNOWN'
|
|
};
|
|
|
|
for (const peer of peerInfo) {
|
|
|
|
// Make sure addrlocal exists, sometimes peers don't supply it
|
|
if (Object.prototype.hasOwnProperty.call(peer, 'addrlocal')) {
|
|
|
|
// Use the semi colon to account for ipv4 and ipv6
|
|
const semi = peer.addrlocal.lastIndexOf(':');
|
|
const externalIP = peer.addrlocal.substr(0, semi);
|
|
|
|
// Ignore localhost, this is incorrect data from bitcoind
|
|
if (externalIP !== '127.0.0.1' || externalIP !== '0.0.0.0') {
|
|
|
|
// Increment the count for this external ip
|
|
if (Object.prototype.hasOwnProperty.call(peerCount, externalIP)) {
|
|
peerCount[externalIP]++;
|
|
} else {
|
|
peerCount[externalIP] = 1;
|
|
}
|
|
|
|
// Set the most validated external ip
|
|
if (peerCount[externalIP] > mostValidatedExternalIp.count) {
|
|
mostValidatedExternalIp.count = peerCount[externalIP];
|
|
mostValidatedExternalIp.externalIP = externalIP;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return mostValidatedExternalIp.externalIP;
|
|
}
|
|
|
|
module.exports = {
|
|
getBitcoindAddresses,
|
|
};
|
|
|