mirror of
https://github.com/GOSTSec/gostexplr
synced 2025-02-07 04:14:18 +00:00
asdf
This commit is contained in:
parent
37038a28e0
commit
b47b86aff9
@ -32,6 +32,7 @@ function MakeRPCRequest(postData) {
|
||||
});
|
||||
}
|
||||
|
||||
// async function saveTransaction(txid, blockHeight) {
|
||||
async function saveTransaction(txid, blockHeight) {
|
||||
const res_tx = await MakeRPCRequest(JSON.stringify({
|
||||
method: 'getrawtransaction',
|
||||
@ -53,66 +54,121 @@ async function saveTransaction(txid, blockHeight) {
|
||||
txid: tx.txid,
|
||||
BlockHeight: blockHeight,
|
||||
vouts: [],
|
||||
vins: [],
|
||||
};
|
||||
|
||||
// Loop over vouts
|
||||
for (var i = 0; i < tx.vout.length; i++) {
|
||||
const vout = tx.vout[i];
|
||||
|
||||
// const m_vout = await models.Vout.create({
|
||||
// n: vout.n,
|
||||
// value: vout.value,
|
||||
// });
|
||||
const m_vout = {
|
||||
n: vout.n,
|
||||
value: vout.value,
|
||||
addresses: []
|
||||
addresses: [],
|
||||
direction: 1,
|
||||
};
|
||||
|
||||
// Loop over addresses in vout
|
||||
for (var y = 0; y < vout.scriptPubKey.addresses.length; y++) {
|
||||
const address = vout.scriptPubKey.addresses[y];
|
||||
// let m_address = await models.Address.findOne({
|
||||
// where: {
|
||||
// address,
|
||||
// },
|
||||
// });
|
||||
// if (m_address === null) {
|
||||
// m_address = await models.Address.create({ /// TODO create
|
||||
// address,
|
||||
// });
|
||||
// }
|
||||
// if (m_address === null) {
|
||||
// m_address = { address, };
|
||||
// }
|
||||
|
||||
// await m_vout.addAddresses(m_address);
|
||||
m_vout.push(m_address);
|
||||
m_vout.addresses.push(address);
|
||||
}
|
||||
// await transaction.addVouts(m_vout, {through: {direction: 1}}); // TODO create
|
||||
transaction.addVouts(m_vout, {through: {direction: 1}}); // TODO create
|
||||
transaction.vouts.push(m_vout); // TODO create
|
||||
}
|
||||
for (var i = 0; i < tx.vin.length; i++) {
|
||||
const vin = tx.vin[i];
|
||||
if (vin.txid) {
|
||||
const vout = await models.Vout.findAll({
|
||||
include: {
|
||||
model: models.Transaction,
|
||||
where: {
|
||||
txid: vin.txid,
|
||||
},
|
||||
},
|
||||
where: {
|
||||
n: vin.vout,
|
||||
},
|
||||
});
|
||||
if (vout) {
|
||||
await transaction.addVouts(vout[0], { through: { direction: 0, }, });
|
||||
} else {
|
||||
throw('Couldnt find vout for VIN');
|
||||
}
|
||||
transaction.vins.push(vin);
|
||||
}
|
||||
}
|
||||
return transaction;
|
||||
}
|
||||
|
||||
async function createBlock(block) {
|
||||
return models.sequelize.transaction().then(async (t) => {
|
||||
try {
|
||||
console.log(1)
|
||||
const m_block = await models.Block.create(Object.assign({}, block, {transaction: t}));
|
||||
for (var i = block.tx.length - 1; i >= 0; i--) {
|
||||
tx = block.tx[i];
|
||||
if (!tx) continue; // for genesis block
|
||||
console.log(2)
|
||||
const m_transaction = await models.Transaction.create({
|
||||
txid: tx.txid,
|
||||
BlockHeight: tx.BlockHeight,
|
||||
transaction: t,
|
||||
});
|
||||
console.log(2.1, m_transaction.id, m_block.height)
|
||||
await m_block.addTransaction(m_transaction, t);
|
||||
console.log(2.2)
|
||||
for (var y = tx.vouts.length - 1; y >= 0; y--) {
|
||||
const vout = tx.vouts[y];
|
||||
console.log(3)
|
||||
const m_vout = await models.Vout.create({
|
||||
n: vout.n,
|
||||
value: vout.value,
|
||||
direction: 1,
|
||||
transaction: t,
|
||||
});
|
||||
console.log(4)
|
||||
await m_transaction.addVouts(m_vout, {
|
||||
through: {
|
||||
direction: 1
|
||||
},
|
||||
transaction: t,
|
||||
});
|
||||
for (var z = vout.addresses.length - 1; z >= 0; z--) {
|
||||
const address = vout.addresses[z];
|
||||
console.log(5)
|
||||
let m_address = await models.Address.findOne({
|
||||
where: {
|
||||
address,
|
||||
},
|
||||
});
|
||||
if (!m_address) {
|
||||
console.log(6)
|
||||
m_address = await models.Address.create({
|
||||
address,
|
||||
transaction: t,
|
||||
}, t);
|
||||
}
|
||||
console.log(7)
|
||||
await m_vout.addAddress(m_address);
|
||||
}
|
||||
}
|
||||
for (var y = tx.vins.length - 1; y >= 0; y--) {
|
||||
const vin = tx.vins[y];
|
||||
if (vin.txid) {
|
||||
console.log(8)
|
||||
const vout = await models.Vout.findAll({
|
||||
include: {
|
||||
model: models.Transaction,
|
||||
where: {
|
||||
txid: vin.txid,
|
||||
},
|
||||
},
|
||||
where: {
|
||||
n: vin.vout,
|
||||
},
|
||||
});
|
||||
if (vout) {
|
||||
console.log(9)
|
||||
await m_transaction.addVouts(vout[0], {
|
||||
through: {
|
||||
direction: 0,
|
||||
},
|
||||
transaction: t,
|
||||
});
|
||||
} else {
|
||||
throw('Couldnt find vout for VIN');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
t.commit();
|
||||
} catch (e) {
|
||||
t.rollback();
|
||||
console.log('===', e, 'error');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async function syncNextBlock(syncedHeight) {
|
||||
@ -130,11 +186,13 @@ async function syncNextBlock(syncedHeight) {
|
||||
}));
|
||||
const block = JSON.parse(res_block)['result'];
|
||||
block.time = new Date(block.time * 1000);
|
||||
// await models.Block.create(block);
|
||||
|
||||
const blockToCreate = Object.assign({}, block, {'tx': []});
|
||||
for (var i = 0; i < block.tx.length; i++) {
|
||||
// await saveTransaction(block.tx[i], block.height);
|
||||
tx = await saveTransaction(block.tx[i], block.height);
|
||||
blockToCreate.tx.push(tx);
|
||||
}
|
||||
if (block.height > 1) {
|
||||
if (blockToCreate.height > 1) {
|
||||
await models.Block.update({
|
||||
nextblockhash: block.hash
|
||||
},{
|
||||
@ -143,6 +201,7 @@ async function syncNextBlock(syncedHeight) {
|
||||
}
|
||||
});
|
||||
}
|
||||
await createBlock(blockToCreate);
|
||||
return height;
|
||||
}
|
||||
|
||||
@ -175,14 +234,18 @@ async function syncBlockchain() {
|
||||
try {
|
||||
while (syncedHeight < currentHeight) {
|
||||
syncedHeight = await syncNextBlock(syncedHeight);
|
||||
process.stdout.write(`Synced ${syncedHeight} out of ${currentHeight}\r`);
|
||||
// process.stdout.write(`Synced ${syncedHeight} out of ${currentHeight}\r`);
|
||||
console.log(`Synced ${syncedHeight} out of ${currentHeight}`);
|
||||
if (syncedHeight >= 125)
|
||||
process.exit(0)
|
||||
}
|
||||
} catch (e) {
|
||||
console.log('=====', e);
|
||||
console.log('+====', e);
|
||||
process.exit(0);
|
||||
}
|
||||
process.stdout.write('\nDone\n');
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
syncBlockchain();
|
||||
syncBlockchain()
|
||||
.then((res) => process.exit(0));
|
||||
|
@ -25,7 +25,9 @@ module.exports = (sequelize, DataTypes) => {
|
||||
});
|
||||
|
||||
Block.associate = function(models) {
|
||||
models.Block.hasMany(models.Transaction);
|
||||
models.Block.hasMany(models.Transaction, {
|
||||
onDelete: "CASCADE",
|
||||
});
|
||||
};
|
||||
|
||||
return Block;
|
||||
|
@ -6,40 +6,54 @@ var router = express.Router();
|
||||
router.get('/:address/:offset*?', async function(req, res, next) {
|
||||
|
||||
const safe_address = encodeURI(req.params.address);
|
||||
const limit = 30;
|
||||
const limit = 3;
|
||||
const paramPage = parseInt(req.params.offset);
|
||||
const page = isNaN(paramPage) || paramPage < 1 ? 1 : paramPage;
|
||||
const offset = limit * (page - 1);
|
||||
|
||||
const transactions = await models.Transaction.findAll({
|
||||
include: {
|
||||
model: models.Vout,
|
||||
include: {
|
||||
model: models.Address,
|
||||
where: {
|
||||
address: safe_address,
|
||||
},
|
||||
},
|
||||
},
|
||||
// const transactions = await models.Transaction.findAll({
|
||||
// include: {
|
||||
// model: models.Vout,
|
||||
// include: {
|
||||
// model: models.Address,
|
||||
// where: {
|
||||
// address: safe_address,
|
||||
// },
|
||||
// },
|
||||
// },
|
||||
// raw: true,
|
||||
// offset: offset,
|
||||
// limit: limit,
|
||||
// });
|
||||
|
||||
const vouts = await models.Vout.findAll({
|
||||
raw: true,
|
||||
limit: 30,
|
||||
include: [{
|
||||
// attributes: [],
|
||||
model: models.Address,
|
||||
where: {
|
||||
address: safe_address,
|
||||
}
|
||||
}, {
|
||||
attributes: ['txid'],
|
||||
model: models.Transaction,
|
||||
}],
|
||||
// offset,
|
||||
// limit,
|
||||
});
|
||||
|
||||
console.log(transactions);
|
||||
console.log(vouts);
|
||||
|
||||
if (transactions === null) {
|
||||
if (vouts === null) {
|
||||
res.status(404).render('404');
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const paramPage = parseInt(req.params.offset);
|
||||
const page = isNaN(paramPage) || paramPage < 1 ? 1 : paramPage;
|
||||
const offset = 30 * (page - 1);
|
||||
|
||||
const nextpage = transactions.length === 30 ? page + 1 : null;
|
||||
// console.log(transactions);
|
||||
const nextpage = vouts.length === 30 ? page + 1 : null;
|
||||
const prevpage = page > 1 ? page - 1 : null;
|
||||
|
||||
res.render('address', {
|
||||
address: safe_address,
|
||||
transactions,
|
||||
vouts,
|
||||
nextpage,
|
||||
prevpage,
|
||||
});
|
||||
|
@ -2,20 +2,20 @@ extends layout
|
||||
|
||||
block content
|
||||
h3 Address
|
||||
div= address.address
|
||||
div= address
|
||||
|
||||
h3 Transactions
|
||||
table
|
||||
each transaction in transactions
|
||||
each vout in vouts
|
||||
tr
|
||||
if transaction['Vouts.TransactionVouts.direction'] == 1
|
||||
if vout['Transactions.TransactionVouts.direction'] == 1
|
||||
td INCOME
|
||||
else
|
||||
td OUTCOME
|
||||
td
|
||||
a(href=`/transaction/${transaction.txid}/`) #{transaction.txid}
|
||||
a(href=`/transaction/${vout['Transactions.txid']}/`) #{vout['Transactions.txid']}
|
||||
div.pagination
|
||||
if prevpage
|
||||
a(href=`/address/#{address}/${prevpage}/`, style='float:left') Back
|
||||
a(href=`/address/${address}/${prevpage}/`, style='float:left') Back
|
||||
if nextpage
|
||||
a(href=`/address/${address}/${nextpage}/`, style='float:right') Next
|
||||
|
@ -46,13 +46,9 @@ block content
|
||||
tr
|
||||
th Address
|
||||
th Value
|
||||
th Transaction
|
||||
each vout in transaction.vouts
|
||||
each address in vout.Addresses
|
||||
tr
|
||||
td
|
||||
a(href=`/address/${address.address}/`) #{address.address}
|
||||
td #{vout.value}
|
||||
td
|
||||
each transaction in vout.Transactions
|
||||
a(href=`/transaction/${transaction.txid}/`) #{transaction.txid}
|
||||
|
Loading…
x
Reference in New Issue
Block a user