Browse Source

Moved to raw db queries in syncBlockchain

master
xcps 6 years ago committed by R4SAS
parent
commit
4630f5fa83
  1. 213
      bin/syncBlockchain.js
  2. 1
      package.json

213
bin/syncBlockchain.js

@ -1,11 +1,14 @@
var http = require('http'); var http = require('http');
const fs = require('fs-ext'); const fs = require('fs-ext');
const moment = require('moment');
var models = require('../models'); var models = require('../models');
var rpcConfig = require('../config/config')['rpc']; var rpcConfig = require('../config/config')['rpc'];
const {username, password, hostname, port} = rpcConfig; const {username, password, hostname, port} = rpcConfig;
let sync_sql = '';
function MakeRPCRequest(postData) { function MakeRPCRequest(postData) {
return new Promise(function(resolve, reject) { return new Promise(function(resolve, reject) {
var post_options = { var post_options = {
@ -19,6 +22,7 @@ function MakeRPCRequest(postData) {
'Content-Length': Buffer.byteLength(postData) 'Content-Length': Buffer.byteLength(postData)
} }
}; };
var post_req = http.request(post_options, function(res) { var post_req = http.request(post_options, function(res) {
res.setEncoding("utf8"); res.setEncoding("utf8");
let body = ""; let body = "";
@ -29,6 +33,14 @@ function MakeRPCRequest(postData) {
resolve(body); resolve(body);
}); });
}); });
post_req.on('error', function(err) {
if (err.code == 'ECONNREFUSED') {
console.log('\x1b[36m%s\x1b[0m', "Couldn't make request to wallet")
}
reject(err);
});
post_req.write(postData); post_req.write(postData);
post_req.end(); post_req.end();
}); });
@ -40,6 +52,7 @@ async function saveTransaction(txid, blockHeight) {
params: [txid, 1], params: [txid, 1],
id: 1 id: 1
})); }));
const tx = JSON.parse(res_tx)['result']; const tx = JSON.parse(res_tx)['result'];
if (tx === null) { if (tx === null) {
await models.Failure.create({ await models.Failure.create({
@ -47,62 +60,129 @@ async function saveTransaction(txid, blockHeight) {
}); });
return; return;
} }
const transaction = await models.Transaction.create({
txid: tx.txid, // const transaction = await models.Transaction.create({
BlockHeight: blockHeight, // txid: tx.txid,
}); // BlockHeight: blockHeight,
// });
sync_sql += `
SELECT 1;
SELECT 1;
SELECT 1;
SELECT 1;
SELECT 1;
SELECT 1;
SELECT 1;
SELECT 1;
INSERT INTO Transactions (
txid,
BlockHeight
)
VALUES (
"${txid}",
${blockHeight}
);
SET @txid = LAST_INSERT_ID();
`;
// Loop over vouts // Loop over vouts
for (var i = 0; i < tx.vout.length; i++) { for (var i = 0; i < tx.vout.length; i++) {
const vout = tx.vout[i]; const vout = tx.vout[i];
const m_vout = await models.Vout.create({ // const m_vout = await models.Vout.create({
n: vout.n, // n: vout.n,
value: vout.value, // value: vout.value,
}); // });
sync_sql += `
INSERT INTO Vouts (n, value)
VALUES ("${vout.n}", "${vout.value}");
SET @voutid= LAST_INSERT_ID();
`;
// Loop over addresses in vout // Loop over addresses in vout
for (var y = 0; y < vout.scriptPubKey.addresses.length; y++) { for (var y = 0; y < vout.scriptPubKey.addresses.length; y++) {
const address = vout.scriptPubKey.addresses[y]; const address = vout.scriptPubKey.addresses[y];
let m_address = await models.Address.findOne({ // let m_address = await models.Address.findOne({
where: { // where: {
address, // address,
}, // },
}); // });
if (m_address === null) { // if (m_address === null) {
m_address = await models.Address.create({ // m_address = await models.Address.create({
address, // address,
}); // });
} // }
await m_vout.addAddresses(m_address); sync_sql += `
INSERT INTO Addresses (address) VALUES ("${address}");
SET @addrid = (
SELECT IF(
ROW_COUNT() > 0,
LAST_INSERT_ID(),
(
SELECT id
FROM Addresses
WHERE address='Ga68WPtiA15sPyZzMXR9rUQZNz1AEpUaKW1'
)
)
);
`;
// await m_vout.addAddresses(m_address);
sync_sql += `
INSERT INTO AddressVouts (AddressId, VoutId)
VALUES (@addrid, @voutid);
`;
} }
await transaction.addVouts(m_vout, {through: {direction: 1}}); // await transaction.addVouts(m_vout, {through: {direction: 1}});
sync_sql += `
INSERT INTO TransactionVouts (TransactionId, VoutId, direction)
VALUES (@txid, @voutid, 1);
`;
} }
// Loop over vins
for (var i = 0; i < tx.vin.length; i++) { for (var i = 0; i < tx.vin.length; i++) {
const vin = tx.vin[i]; const vin = tx.vin[i];
if (vin.txid) { if (vin.txid) {
const vout = await models.Vout.findAll({ // const vout = await models.Vout.findAll({
include: { // include: {
model: models.Transaction, // model: models.Transaction,
where: { // where: {
txid: vin.txid, // txid: vin.txid,
}, // },
}, // },
where: { // where: {
n: vin.vout, // n: vin.vout,
}, // },
}); // });
if (vout) { // if (vout) {
await transaction.addVouts(vout[0], { through: { direction: 0, }, }); // await transaction.addVouts(vout[0], { through: { direction: 0, }, });
} else { // } else {
throw('Couldnt find vout for VIN'); // throw('Couldnt find vout for VIN');
} // }
sync_sql += `
SET @vin = (
SELECT id
FROM Vouts
INNER JOIN TransactionVouts
ON Vouts.id=TransactionVouts.VoutId
INNER JOIN Transactions
ON Transactions.id=TransactionVouts.TransactionId
WHERE
TransactionVouts.direction=1 AND
Transactions.txid="${vin.txid}" AND
Vouts.n=${vin.vout}
);
INSERT INTO TransactionVouts (TransactionId, VoutId, direction)
VALUES (@txid, @vin, 0);
`
} }
} }
} }
async function syncNextBlock(syncedHeight) { async function syncNextBlock(syncedHeight) {
const height = syncedHeight + 1; const height = syncedHeight + 1;
sync_sql = '';
const res_hash = await MakeRPCRequest(JSON.stringify({ const res_hash = await MakeRPCRequest(JSON.stringify({
method: 'getblockhash', method: 'getblockhash',
params: [height], params: [height],
@ -115,20 +195,61 @@ async function syncNextBlock(syncedHeight) {
id: 1 id: 1
})); }));
const block = JSON.parse(res_block)['result']; const block = JSON.parse(res_block)['result'];
block.time = new Date(block.time * 1000);
await models.Block.create(block); block.time = moment(1491163173000).format('YYYY-MM-DD HH:MM:SS');
// await models.Block.create(block);
sync_sql = `
SET autocommit = 0;
START TRANSACTION;
INSERT INTO Block (
hash,
height,
size,
version,
merkleroot,
time,
nonce,
bits,
difficulty,
previousblockhash,
nextblockhash
)
VALUES (
"${block.hash}",
"${block.height}",
"${block.size}",
"${block.version}",
"${block.merkleroot}",
"${block.time}",
"${block.nonce}",
"${block.bits}",
"${block.difficulty}",
"${block.previousblockhash}",
"${block.nextblockhash}"
);
`
for (var i = 0; i < block.tx.length; i++) { for (var i = 0; i < block.tx.length; i++) {
await saveTransaction(block.tx[i], block.height); await saveTransaction(block.tx[i], block.height);
} }
if (block.height > 1) { if (block.height > 1) {
await models.Block.update({ // await models.Block.update({
nextblockhash: block.hash // nextblockhash: block.hash
},{ // },{
where: { // where: {
hash: block.previousblockhash // hash: block.previousblockhash
} // }
}); // });
sync_sql += `
UPDATE Block
SET nextblockhash="${block.previousblockhash}"
WHERE nextblockhash="${block.previousblockhash}";
`
} }
sync_sql += 'COMMIT;'
await models.sequelize.query(sync_sql);
return height; return height;
} }
@ -138,7 +259,6 @@ async function getCurrentHeight() {
params: [], params: [],
id: 1 id: 1
})); }));
return JSON.parse(result)['result']; return JSON.parse(result)['result'];
} }
@ -148,6 +268,7 @@ async function getSyncedHeight() {
order: [['height', 'DESC']], order: [['height', 'DESC']],
limit: 1 limit: 1
}); });
const height = result ? result.height : -1; const height = result ? result.height : -1;
return height; return height;
} }

1
package.json

@ -24,6 +24,7 @@
"express": "^4.16.3", "express": "^4.16.3",
"forever": "^0.15.3", "forever": "^0.15.3",
"fs-ext": "^1.2.1", "fs-ext": "^1.2.1",
"moment": "^2.24.0",
"morgan": "~1.9.0", "morgan": "~1.9.0",
"mysql": "^2.15.0", "mysql": "^2.15.0",
"mysql2": "^1.5.1", "mysql2": "^1.5.1",

Loading…
Cancel
Save