PHP WebShell
Текущая директория: /opt/BitGoJS/modules/utxo-lib/dist/test/integration_local_rpc/generate
Просмотр файла: regtestNode.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getRegtestNode = getRegtestNode;
exports.getRegtestNodeHelp = getRegtestNodeHelp;
exports.getRegtestNodeUrl = getRegtestNodeUrl;
const crypto = require("crypto");
const util = require("util");
const child_process_1 = require("child_process");
const utxolib = require("../../../src");
const networks_1 = require("../../../src/networks");
const rpcPort = 18333;
const rpcUser = 'utxolib';
const rpcPassword = crypto.randomBytes(16).toString('hex');
function dockerImage(image, binary, extraArgsNode = [], extraArgsDocker = []) {
return { image, binary, extraArgsNode, extraArgsDocker };
}
function getDockerParams(network) {
switch (network) {
case utxolib.networks.testnet:
return dockerImage('ruimarinho/bitcoin-core:0.21.1', 'bitcoind', ['-fallbackfee=0.0001']);
case utxolib.networks.bitcoincashTestnet:
return dockerImage('zquestz/bitcoin-cash-node:23.0.0', 'bitcoind', ['-usecashaddr=0']);
case utxolib.networks.bitcoinsvTestnet:
return dockerImage('bitcoinsv/bitcoin-sv:1.0.5', 'bitcoind', [
'-excessiveblocksize=0',
'-maxstackmemoryusageconsensus=0',
]);
case utxolib.networks.bitcoingoldTestnet:
return dockerImage('uphold/bitcoin-gold:0.17.3', 'bgoldd');
case utxolib.networks.dashTest:
return dockerImage('dashpay/dashd:0.16.1.1', 'dashd');
case utxolib.networks.dogecoinTest:
return dockerImage('williamqinbitgo/dogeimage:1.14.5-v3', 'dogecoind');
case utxolib.networks.ecashTest:
return dockerImage('bitcoinabc/bitcoin-abc:0.26.9', 'bitcoind', ['-ecash=0 -usecashaddr=0']);
case utxolib.networks.litecoinTest:
return dockerImage('uphold/litecoin-core:0.17.1', 'litecoind');
case utxolib.networks.zcashTest:
return dockerImage('electriccoinco/zcashd:v6.0.0', undefined, // `zcashd` is implicit
[
'-nuparams=5ba81b19:10',
'-nuparams=76b809bb:20',
'-nuparams=2bb40e60:30',
'-nuparams=f5b9230b:40',
'-nuparams=e9ff75a6:400',
// https://zips.z.cash/zip-0252
'-nuparams=c2d6d0b4:500',
// https://zips.z.cash/zip-0253
'-nuparams=c8e71055:600',
]
// [`--volume=${paramsDir}:/srv/zcashd/.zcash-params`]
);
}
throw new Error(`unsupported network ${(0, networks_1.getNetworkName)(network)}`);
}
async function getRegtestNode(network) {
const dockerParams = getDockerParams(network);
const args = [
'run',
`--publish=${rpcPort}:${rpcPort}`,
...dockerParams.extraArgsDocker,
dockerParams.image,
...(dockerParams.binary ? [dockerParams.binary] : []),
'-regtest',
'-txindex',
`-rpcuser=${rpcUser}`,
`-rpcpassword=${rpcPassword}`,
`-rpcbind=0.0.0.0:${rpcPort}`,
`-rpcallowip=0.0.0.0/0`,
...dockerParams.extraArgsNode,
];
let stdio = 'ignore';
if (process.env.UTXOLIB_TESTS_LOG_DOCKER === '1') {
stdio = 'inherit';
}
const proc = (0, child_process_1.spawn)('docker', args, { stdio });
return {
stop() {
proc.kill();
return new Promise((resolve, reject) => {
proc.on('exit', (code, signal) => {
if (code === 0) {
return resolve();
}
reject(new Error(`code=${code} signal=${signal}`));
});
});
},
};
}
async function getRegtestNodeHelp(network) {
const dockerParams = getDockerParams(network);
const args = [
'run',
...dockerParams.extraArgsDocker,
dockerParams.image,
...(dockerParams.binary ? [dockerParams.binary] : []),
'--help',
'-help-debug',
'-regtest',
];
return await util.promisify(child_process_1.execFile)('docker', args);
}
function getRegtestNodeUrl(network) {
return `http://${rpcUser}:${rpcPassword}@localhost:${rpcPort}`;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVndGVzdE5vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2ludGVncmF0aW9uX2xvY2FsX3JwYy9nZW5lcmF0ZS9yZWd0ZXN0Tm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXlFQSx3Q0FxQ0M7QUFFRCxnREFhQztBQUVELDhDQUVDO0FBaklELGlDQUFpQztBQUNqQyw2QkFBNkI7QUFDN0IsaURBQWdEO0FBRWhELHdDQUF3QztBQUN4QyxvREFBZ0U7QUFTaEUsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDO0FBQ3RCLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUMxQixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUUzRCxTQUFTLFdBQVcsQ0FDbEIsS0FBYSxFQUNiLE1BQTBCLEVBQzFCLGdCQUEwQixFQUFFLEVBQzVCLGtCQUE0QixFQUFFO0lBRTlCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsQ0FBQztBQUMzRCxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsT0FBZ0I7SUFDdkMsUUFBUSxPQUFPLEVBQUUsQ0FBQztRQUNoQixLQUFLLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTztZQUMzQixPQUFPLFdBQVcsQ0FBQyxnQ0FBZ0MsRUFBRSxVQUFVLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7UUFDNUYsS0FBSyxPQUFPLENBQUMsUUFBUSxDQUFDLGtCQUFrQjtZQUN0QyxPQUFPLFdBQVcsQ0FBQyxrQ0FBa0MsRUFBRSxVQUFVLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7UUFDekYsS0FBSyxPQUFPLENBQUMsUUFBUSxDQUFDLGdCQUFnQjtZQUNwQyxPQUFPLFdBQVcsQ0FBQyw0QkFBNEIsRUFBRSxVQUFVLEVBQUU7Z0JBQzNELHVC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LENBQUM7UUFDTCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFTSxLQUFLLFVBQVUsa0JBQWtCLENBQUMsT0FBZ0I7SUFDdkQsTUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlDLE1BQU0sSUFBSSxHQUFHO1FBQ1gsS0FBSztRQUNMLEdBQUcsWUFBWSxDQUFDLGVBQWU7UUFDL0IsWUFBWSxDQUFDLEtBQUs7UUFDbEIsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDckQsUUFBUTtRQUNSLGFBQWE7UUFDYixVQUFVO0tBQ1gsQ0FBQztJQUVGLE9BQU8sTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLHdCQUFRLENBQUMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUVELFNBQWdCLGlCQUFpQixDQUFDLE9BQWdCO0lBQ2hELE9BQU8sVUFBVSxPQUFPLElBQUksV0FBVyxjQUFjLE9BQU8sRUFBRSxDQUFDO0FBQ2pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAndXRpbCc7XG5pbXBvcnQgeyBzcGF3biwgZXhlY0ZpbGUgfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0IHsgTmV0d29yaywgZ2V0TmV0d29ya05hbWUgfSBmcm9tICcuLi8uLi8uLi9zcmMvbmV0d29ya3MnO1xuXG50eXBlIERvY2tlckltYWdlUGFyYW1zID0ge1xuICBleHRyYUFyZ3NEb2NrZXI6IHN0cmluZ1tdO1xuICBpbWFnZTogc3RyaW5nO1xuICBiaW5hcnk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZXh0cmFBcmdzTm9kZTogc3RyaW5nW107XG59O1xuXG5jb25zdCBycGNQb3J0ID0gMTgzMzM7XG5jb25zdCBycGNVc2VyID0gJ3V0eG9saWInO1xuY29uc3QgcnBjUGFzc3dvcmQgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoMTYpLnRvU3RyaW5nKCdoZXgnKTtcblxuZnVuY3Rpb24gZG9ja2VySW1hZ2UoXG4gIGltYWdlOiBzdHJpbmcsXG4gIGJpbmFyeTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBleHRyYUFyZ3NOb2RlOiBzdHJpbmdbXSA9IFtdLFxuICBleHRyYUFyZ3NEb2NrZXI6IHN0cmluZ1tdID0gW11cbik6IERvY2tlckltYWdlUGFyYW1zIHtcbiAgcmV0dXJuIHsgaW1hZ2UsIGJpbmFyeSwgZXh0cmFBcmdzTm9kZSwgZXh0cmFBcmdzRG9ja2VyIH07XG59XG5cbmZ1bmN0aW9uIGdldERvY2tlclBhcmFtcyhuZXR3b3JrOiBOZXR3b3JrKTogRG9ja2VySW1hZ2VQYXJhbXMge1xuICBzd2l0Y2ggKG5ldHdvcmspIHtcbiAgICBjYXNlIHV0eG9saWIubmV0d29ya3MudGVzdG5ldDpcbiAgICAgIHJldHVybiBkb2NrZXJJbWFnZSgncnVpbWFyaW5oby9iaXRjb2luLWNvcmU6MC4yMS4xJywgJ2JpdGNvaW5kJywgWyctZmFsbGJhY2tmZWU9MC4wMDAxJ10pO1xuICAgIGNhc2UgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luY2FzaFRlc3RuZXQ6XG4gICAgICByZXR1cm4gZG9ja2VySW1hZ2UoJ3pxdWVzdHovYml0Y29pbi1jYXNoLW5vZGU6MjMuMC4wJywgJ2JpdGNvaW5kJywgWyctdXNlY2FzaGFkZHI9MCddKTtcbiAgICBjYXNlIHV0eG9saWIubmV0d29ya3MuYml0Y29pbnN2VGVzdG5ldDpcbiAgICAgIHJldHVybiBkb2NrZXJJbWFnZSgnYml0Y29pbnN2L2JpdGNvaW4tc3Y6MS4wLjUnLCAnYml0Y29pbmQnLCBbXG4gICAgICAgICctZXhjZXNzaXZlYmxvY2tzaXplPTAnLFxuICAgICAgICAnLW1heHN0YWNrbWVtb3J5dXNhZ2Vjb25zZW5zdXM9MCcsXG4gICAgICBdKTtcbiAgICBjYXNlIHV0eG9saWIubmV0d29ya3MuYml0Y29pbmdvbGRUZXN0bmV0OlxuICAgICAgcmV0dXJuIGRvY2tlckltYWdlKCd1cGhvbGQvYml0Y29pbi1nb2xkOjAuMTcuMycsICdiZ29sZGQnKTtcbiAgICBjYXNlIHV0eG9saWIubmV0d29ya3MuZGFzaFRlc3Q6XG4gICAgICByZXR1cm4gZG9ja2VySW1hZ2UoJ2Rhc2hwYXkvZGFzaGQ6MC4xNi4xLjEnLCAnZGFzaGQnKTtcbiAgICBjYXNlIHV0eG9saWIubmV0d29ya3MuZG9nZWNvaW5UZXN0OlxuICAgICAgcmV0dXJuIGRvY2tlckltYWdlKCd3aWxsaWFtcWluYml0Z28vZG9nZWltYWdlOjEuMTQuNS12MycsICdkb2dlY29pbmQnKTtcbiAgICBjYXNlIHV0eG9saWIubmV0d29ya3MuZWNhc2hUZXN0OlxuICAgICAgcmV0dXJuIGRvY2tlckltYWdlKCdiaXRjb2luYWJjL2JpdGNvaW4tYWJjOjAuMjYuOScsICdiaXRjb2luZCcsIFsnLWVjYXNoPTAgLXVzZWNhc2hhZGRyPTAnXSk7XG4gICAgY2FzZSB1dHhvbGliLm5ldHdvcmtzLmxpdGVjb2luVGVzdDpcbiAgICAgIHJldHVybiBkb2NrZXJJbWFnZSgndXBob2xkL2xpdGVjb2luLWNvcmU6MC4xNy4xJywgJ2xpdGVjb2luZCcpO1xuICAgIGNhc2UgdXR4b2xpYi5uZXR3b3Jrcy56Y2FzaFRlc3Q6XG4gICAgICByZXR1cm4gZG9ja2VySW1hZ2UoXG4gICAgICAgICdlbGVjdHJpY2NvaW5jby96Y2FzaGQ6djYuMC4wJyxcbiAgICAgICAgdW5kZWZpbmVkLCAvLyBgemNhc2hkYCBpcyBpbXBsaWNpdFxuICAgICAgICBbXG4gICAgICAgICAgJy1udXBhcmFtcz01YmE4MWIxOToxMCcsXG4gICAgICAgICAgJy1udXBhcmFtcz03NmI4MDliYjoyMCcsXG4gICAgICAgICAgJy1udXBhcmFtcz0yYmI0MGU2MDozMCcsXG4gICAgICAgICAgJy1udXBhcmFtcz1mNWI5MjMwYjo0MCcsXG4gICAgICAgICAgJy1udXBhcmFtcz1lOWZmNzVhNjo0MDAnLFxuICAgICAgICAgIC8vIGh0dHBzOi8vemlwcy56LmNhc2gvemlwLTAyNTJcbiAgICAgICAgICAnLW51cGFyYW1zPWMyZDZkMGI0OjUwMCcsXG4gICAgICAgICAgLy8gaHR0cHM6Ly96aXBzLnouY2FzaC96aXAtMDI1M1xuICAgICAgICAgICctbnVwYXJhbXM9YzhlNzEwNTU6NjAwJyxcbiAgICAgICAgXVxuICAgICAgICAvLyBbYC0tdm9sdW1lPSR7cGFyYW1zRGlyfTovc3J2L3pjYXNoZC8uemNhc2gtcGFyYW1zYF1cbiAgICAgICk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBuZXR3b3JrICR7Z2V0TmV0d29ya05hbWUobmV0d29yayl9YCk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9kZSB7XG4gIHN0b3AoKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJlZ3Rlc3ROb2RlKG5ldHdvcms6IE5ldHdvcmspOiBQcm9taXNlPE5vZGU+IHtcbiAgY29uc3QgZG9ja2VyUGFyYW1zID0gZ2V0RG9ja2VyUGFyYW1zKG5ldHdvcmspO1xuICBjb25zdCBhcmdzID0gW1xuICAgICdydW4nLFxuICAgIGAtLXB1Ymxpc2g9JHtycGNQb3J0fToke3JwY1BvcnR9YCxcbiAgICAuLi5kb2NrZXJQYXJhbXMuZXh0cmFBcmdzRG9ja2VyLFxuICAgIGRvY2tlclBhcmFtcy5pbWFnZSxcbiAgICAuLi4oZG9ja2VyUGFyYW1zLmJpbmFyeSA/IFtkb2NrZXJQYXJhbXMuYmluYXJ5XSA6IFtdKSxcbiAgICAnLXJlZ3Rlc3QnLFxuICAgICctdHhpbmRleCcsXG4gICAgYC1ycGN1c2VyPSR7cnBjVXNlcn1gLFxuICAgIGAtcnBjcGFzc3dvcmQ9JHtycGNQYXNzd29yZH1gLFxuICAgIGAtcnBjYmluZD0wLjAuMC4wOiR7cnBjUG9ydH1gLFxuICAgIGAtcnBjYWxsb3dpcD0wLjAuMC4wLzBgLFxuICAgIC4uLmRvY2tlclBhcmFtcy5leHRyYUFyZ3NOb2RlLFxuICBdIGFzIHN0cmluZ1tdO1xuXG4gIGxldCBzdGRpbzogJ2lnbm9yZScgfCAnaW5oZXJpdCcgPSAnaWdub3JlJztcbiAgaWYgKHByb2Nlc3MuZW52LlVUWE9MSUJfVEVTVFNfTE9HX0RPQ0tFUiA9PT0gJzEnKSB7XG4gICAgc3RkaW8gPSAnaW5oZXJpdCc7XG4gIH1cblxuICBjb25zdCBwcm9jID0gc3Bhd24oJ2RvY2tlcicsIGFyZ3MsIHsgc3RkaW8gfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgcHJvYy5raWxsKCk7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBwcm9jLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICAgIGlmIChjb2RlID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBjb2RlPSR7Y29kZX0gc2lnbmFsPSR7c2lnbmFsfWApKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVndGVzdE5vZGVIZWxwKG5ldHdvcms6IE5ldHdvcmspOiBQcm9taXNlPHsgc3Rkb3V0OiBzdHJpbmc7IHN0ZGVycjogc3RyaW5nIH0+IHtcbiAgY29uc3QgZG9ja2VyUGFyYW1zID0gZ2V0RG9ja2VyUGFyYW1zKG5ldHdvcmspO1xuICBjb25zdCBhcmdzID0gW1xuICAgICdydW4nLFxuICAgIC4uLmRvY2tlclBhcmFtcy5leHRyYUFyZ3NEb2NrZXIsXG4gICAgZG9ja2VyUGFyYW1zLmltYWdlLFxuICAgIC4uLihkb2NrZXJQYXJhbXMuYmluYXJ5ID8gW2RvY2tlclBhcmFtcy5iaW5hcnldIDogW10pLFxuICAgICctLWhlbHAnLFxuICAgICctaGVscC1kZWJ1ZycsXG4gICAgJy1yZWd0ZXN0JyxcbiAgXTtcblxuICByZXR1cm4gYXdhaXQgdXRpbC5wcm9taXNpZnkoZXhlY0ZpbGUpKCdkb2NrZXInLCBhcmdzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlZ3Rlc3ROb2RlVXJsKG5ldHdvcms6IE5ldHdvcmspOiBzdHJpbmcge1xuICByZXR1cm4gYGh0dHA6Ly8ke3JwY1VzZXJ9OiR7cnBjUGFzc3dvcmR9QGxvY2FsaG9zdDoke3JwY1BvcnR9YDtcbn1cbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!