server changes
This commit is contained in:
parent
3fb35b3f3b
commit
bf7430d36f
@ -22,7 +22,10 @@ import {
|
|||||||
TotalDifficultyNBlockDto,
|
TotalDifficultyNBlockDto,
|
||||||
} from '../dtos';
|
} from '../dtos';
|
||||||
import { Paginate } from '../utils';
|
import { Paginate } from '../utils';
|
||||||
import {latestBlockDetails} from '../utils/common';
|
import {
|
||||||
|
latestBlockDetails,
|
||||||
|
previousBlockDetails
|
||||||
|
} from '../utils/common';
|
||||||
var moment = require('moment');
|
var moment = require('moment');
|
||||||
moment.updateLocale('en', {
|
moment.updateLocale('en', {
|
||||||
relativeTime: {
|
relativeTime: {
|
||||||
@ -256,6 +259,12 @@ export class BlockchainBlockController {
|
|||||||
this.TotalDifficultyNBlock,
|
this.TotalDifficultyNBlock,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
this.router.get(
|
||||||
|
`${this.path}/get51poolapi`,
|
||||||
|
redisMiddleware(process.env.REDIS_EXPIRY),
|
||||||
|
this.get51poolapi,
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @swagger
|
* @swagger
|
||||||
* /epic_explorer/v1/blockchain_block/blockcount:
|
* /epic_explorer/v1/blockchain_block/blockcount:
|
||||||
@ -446,6 +455,7 @@ export class BlockchainBlockController {
|
|||||||
* 200:
|
* 200:
|
||||||
* description: Total Difficulty and No. of blocks fetched successfully
|
* description: Total Difficulty and No. of blocks fetched successfully
|
||||||
*/
|
*/
|
||||||
|
// Last Block home page function
|
||||||
this.router.get(
|
this.router.get(
|
||||||
`${this.path}/latesblockdetails`,
|
`${this.path}/latesblockdetails`,
|
||||||
validationMiddleware(TotalDifficultyNBlockDto, true),
|
validationMiddleware(TotalDifficultyNBlockDto, true),
|
||||||
@ -453,6 +463,14 @@ export class BlockchainBlockController {
|
|||||||
this.LatestDifficultyNBlock,
|
this.LatestDifficultyNBlock,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Previous Block home page function
|
||||||
|
this.router.get(
|
||||||
|
`${this.path}/previousblockdetails`,
|
||||||
|
validationMiddleware(TotalDifficultyNBlockDto, true),
|
||||||
|
redisMiddleware(process.env.REDIS_EXPIRY),
|
||||||
|
this.PreviousDifficultyNBlock,
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @swagger
|
* @swagger
|
||||||
* /epic_explorer/v1/blockchain_block/blockspersec:
|
* /epic_explorer/v1/blockchain_block/blockspersec:
|
||||||
@ -684,6 +702,33 @@ export class BlockchainBlockController {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get 51poolapi
|
||||||
|
private get51poolapi = ( request: Request,res: Response) => {
|
||||||
|
// var request = require('request');
|
||||||
|
var axios = require('axios');
|
||||||
|
try {
|
||||||
|
var config = {
|
||||||
|
method: 'get',
|
||||||
|
url: 'https://51pool.online/api',
|
||||||
|
headers: { }
|
||||||
|
};
|
||||||
|
axios(config).then(function (response) {
|
||||||
|
console.log('response.body----------');
|
||||||
|
console.log(JSON.stringify(response.data));
|
||||||
|
res.status(200).json({
|
||||||
|
status: 200,
|
||||||
|
response: response.data
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch(function (error) {
|
||||||
|
console.log('axios-error');
|
||||||
|
console.log(error);
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
private BlockchainBlockCreate = async (
|
private BlockchainBlockCreate = async (
|
||||||
request: Request,
|
request: Request,
|
||||||
response: Response,
|
response: Response,
|
||||||
@ -1738,7 +1783,8 @@ export class BlockchainBlockController {
|
|||||||
next(new InternalServerErrorException(error));
|
next(new InternalServerErrorException(error));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Last Block home page function
|
||||||
private LatestDifficultyNBlock = async (
|
private LatestDifficultyNBlock = async (
|
||||||
request: Request,
|
request: Request,
|
||||||
response: Response,
|
response: Response,
|
||||||
@ -1758,6 +1804,28 @@ export class BlockchainBlockController {
|
|||||||
next(new InternalServerErrorException(error));
|
next(new InternalServerErrorException(error));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
// Previous Block home page function
|
||||||
|
private PreviousDifficultyNBlock = async (
|
||||||
|
request: Request,
|
||||||
|
response: Response,
|
||||||
|
next: NextFunction,
|
||||||
|
) => {
|
||||||
|
try {
|
||||||
|
let result = await previousBlockDetails()
|
||||||
|
response.status(200).json({
|
||||||
|
status: 200,
|
||||||
|
timestamp: Date.now(),
|
||||||
|
message: 'Previous Block Details fetched Successfully',
|
||||||
|
response: {
|
||||||
|
...result
|
||||||
|
},
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
next(new InternalServerErrorException(error));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private BlockchainBlockPerSecond = async (
|
private BlockchainBlockPerSecond = async (
|
||||||
request: Request,
|
request: Request,
|
||||||
|
@ -32,9 +32,9 @@ export class BlockchainKernelController {
|
|||||||
|
|
||||||
IsJsonString(str) {
|
IsJsonString(str) {
|
||||||
try {
|
try {
|
||||||
var dataJson = JSON.parse(str);
|
var dataJson = JSON.parse(str);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
return dataJson;
|
return dataJson;
|
||||||
}
|
}
|
||||||
@ -149,29 +149,30 @@ export class BlockchainKernelController {
|
|||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @swagger
|
* @swagger
|
||||||
* /epic_explorer/v1/network:
|
* /epic_explorer/v1/network:
|
||||||
* get:
|
* get:
|
||||||
* tags:
|
* tags:
|
||||||
* - name: Network | Network CONTROLLER
|
* - name: Network | Network CONTROLLER
|
||||||
* summary: change a network
|
* summary: change a network
|
||||||
* description: change a network
|
* description: change a network
|
||||||
* consumes:
|
* consumes:
|
||||||
* - application/json
|
* - application/json
|
||||||
* produces:
|
* produces:
|
||||||
* - application/json
|
* - application/json
|
||||||
* parameters:
|
* parameters:
|
||||||
* - name: network
|
* - name: network
|
||||||
* responses:
|
* responses:
|
||||||
* 200:
|
* 200:
|
||||||
* description: Network Changed successfully
|
* description: Network Changed successfully
|
||||||
*/
|
*/
|
||||||
this.router.get(
|
this.router.get(
|
||||||
`${this.path}/network`,
|
`${this.path}/network`,
|
||||||
this.changeNetwok,
|
this.changeNetwok,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @swagger
|
* @swagger
|
||||||
* /epic_explorer/v1/getpeers:
|
* /epic_explorer/v1/getpeers:
|
||||||
@ -562,6 +563,212 @@ export class BlockchainKernelController {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
private getPeersLocation = async (
|
||||||
|
request: Request,
|
||||||
|
response: Response,
|
||||||
|
next: NextFunction,
|
||||||
|
) => {
|
||||||
|
var self = this;
|
||||||
|
try {
|
||||||
|
if (Global.network == "Floonet") {
|
||||||
|
var peer_url = process.env.FLOONET_PEER_URL;
|
||||||
|
} else {
|
||||||
|
var peer_url = process.env.TESTNET_PEER_URL;
|
||||||
|
}
|
||||||
|
let finalresult = await request_promise(peer_url);
|
||||||
|
if (finalresult) {
|
||||||
|
var jsonresponse = JSON.parse(finalresult);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
let getAllIp = [];
|
||||||
|
let getExistingIp = [];
|
||||||
|
let result = jsonresponse.map(function (value, i) {
|
||||||
|
value['id'] = i;
|
||||||
|
let getIP = value['addr'].split(':')[0];
|
||||||
|
getAllIp.push(getIP);
|
||||||
|
return value;
|
||||||
|
});
|
||||||
|
|
||||||
|
const fetchAllIps = await getConnection(Global.network).query(`SELECT ip, longitude, latitude FROM public.peer_ip`);
|
||||||
|
|
||||||
|
// const fetchAllIps = await getConnection(Global.network).getRepository(
|
||||||
|
// PeerIp,
|
||||||
|
// ).find({
|
||||||
|
// select: ['IpAddress']
|
||||||
|
// });
|
||||||
|
|
||||||
|
let markers = [];
|
||||||
|
for (let ip = 0; ip < fetchAllIps.length; ip++) {
|
||||||
|
getExistingIp.push(fetchAllIps[ip]['ip'].replace(/['"]+/g, ''));
|
||||||
|
const mapMarker = {
|
||||||
|
"longitude": fetchAllIps[ip]['longitude'],
|
||||||
|
"latitude": fetchAllIps[ip]['latitude']
|
||||||
|
};
|
||||||
|
|
||||||
|
markers.push(mapMarker);
|
||||||
|
}
|
||||||
|
let users = {};
|
||||||
|
users['locations'] = markers;
|
||||||
|
response.status(200).json({
|
||||||
|
status: 200,
|
||||||
|
timestamp: Date.now(),
|
||||||
|
message: 'Peers location list fetched successfully',
|
||||||
|
response: {
|
||||||
|
dataJson: users
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (error) {
|
||||||
|
console.log('getpeerslocation-error', error);
|
||||||
|
next(new InternalServerErrorException(error));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
private getPeers = async (
|
||||||
|
request: Request,
|
||||||
|
response: Response,
|
||||||
|
next: NextFunction,
|
||||||
|
) => {
|
||||||
|
var self = this;
|
||||||
|
try {
|
||||||
|
if (Global.network == "Floonet") {
|
||||||
|
var peer_url = process.env.FLOONET_PEER_URL;
|
||||||
|
} else {
|
||||||
|
var peer_url = process.env.TESTNET_PEER_URL;
|
||||||
|
}
|
||||||
|
let finalresult = await request_promise(peer_url);
|
||||||
|
if (finalresult) {
|
||||||
|
var jsonresponse = JSON.parse(finalresult);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
let getAllIp = [];
|
||||||
|
let getExistingIp = [];
|
||||||
|
let result = jsonresponse.map(function (value, i) {
|
||||||
|
value['id'] = i;
|
||||||
|
let getIP = value['addr'].split(':')[0];
|
||||||
|
getAllIp.push(getIP);
|
||||||
|
return value;
|
||||||
|
});
|
||||||
|
|
||||||
|
const fetchAllIps = await getConnection(Global.network).query(`SELECT ip, longitude, latitude FROM public.peer_ip`);
|
||||||
|
|
||||||
|
// const fetchAllIps = await getConnection(Global.network).getRepository(
|
||||||
|
// PeerIp,
|
||||||
|
// ).find({
|
||||||
|
// select: ['IpAddress']
|
||||||
|
// });
|
||||||
|
|
||||||
|
let markers = [];
|
||||||
|
for (let ip = 0; ip < fetchAllIps.length; ip++) {
|
||||||
|
getExistingIp.push(fetchAllIps[ip]['ip'].replace(/['"]+/g, ''));
|
||||||
|
const mapMarker = {
|
||||||
|
"longitude": fetchAllIps[ip]['longitude'],
|
||||||
|
"latitude": fetchAllIps[ip]['latitude']
|
||||||
|
};
|
||||||
|
|
||||||
|
markers.push(mapMarker);
|
||||||
|
}
|
||||||
|
let users = {};
|
||||||
|
users['locations'] = markers;
|
||||||
|
fs.writeFile(path.join(__dirname, "../../", "browser", "assets/geojson.json"), JSON.stringify(users), err => {
|
||||||
|
// Checking for errors
|
||||||
|
if (err) { throw err; }
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
const missingIp = getAllIp.filter(item => getExistingIp.indexOf(item) < 0);
|
||||||
|
|
||||||
|
if (missingIp.length > 0) {
|
||||||
|
fs.readFile(path.join(__dirname, "../../", "browser", "assets/geojson.json"), (err, data) => {
|
||||||
|
if (err) { throw err; }
|
||||||
|
const users = JSON.parse(data);
|
||||||
|
|
||||||
|
for (let i = 0; i < missingIp.length; i++) {
|
||||||
|
const markers = [];
|
||||||
|
const ips = missingIp[i];
|
||||||
|
httpRequest(`https://api.ipgeolocationapi.com/geolocate/${ips}`, async (error, response, resp) => {
|
||||||
|
if (error) { throw error; }
|
||||||
|
const ipResp = JSON.parse(resp);
|
||||||
|
const ipLatitude = ipResp.geo.latitude;
|
||||||
|
const ipLongitude = ipResp.geo.longitude;
|
||||||
|
|
||||||
|
const insertQuery = await getConnection(Global.network)
|
||||||
|
.query(`INSERT INTO public.peer_ip(ip, longitude, latitude) VALUES ('${ips}', '${ipLongitude}', '${ipLatitude}');`);
|
||||||
|
|
||||||
|
// let mapMarker = {
|
||||||
|
// "type": "Feature",
|
||||||
|
// "geometry": {
|
||||||
|
// "type": "Point",
|
||||||
|
// "coordinates": [ipLongitude, ipLatitude]
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
const mapMarker = {
|
||||||
|
"longitude": ipLongitude,
|
||||||
|
"latitude": ipLatitude
|
||||||
|
};
|
||||||
|
|
||||||
|
markers.push(mapMarker);
|
||||||
|
users.locations = markers;
|
||||||
|
fs.writeFile(path.join(__dirname, "../../", "browser", "assets/geojson.json"), JSON.stringify(users), err => {
|
||||||
|
// Checking for errors
|
||||||
|
if (err) { throw err; }
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
response.status(200).json({
|
||||||
|
status: 200,
|
||||||
|
timestamp: Date.now(),
|
||||||
|
message: 'Peers list fetched successfully',
|
||||||
|
response: {
|
||||||
|
dataJson: result
|
||||||
|
},
|
||||||
|
});
|
||||||
|
// http.get(peer_url,
|
||||||
|
// async (resp) => {
|
||||||
|
// // console.log('resp resp respresp',resp);
|
||||||
|
// let data = '';
|
||||||
|
// let result ;
|
||||||
|
|
||||||
|
// // A chunk of data has been recieved.
|
||||||
|
// await new Promise((resolve) => {
|
||||||
|
// resp.on('data', function (chunk) {
|
||||||
|
// data += chunk;
|
||||||
|
|
||||||
|
// let dataJson = self.IsJsonString(data);
|
||||||
|
// if(dataJson.length > 0){
|
||||||
|
|
||||||
|
// result = dataJson.map(function (value, i) {
|
||||||
|
// value['id'] = i;
|
||||||
|
// return value;
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
// resolve();
|
||||||
|
// });
|
||||||
|
// });
|
||||||
|
// response.status(200).json({
|
||||||
|
// status: 200,
|
||||||
|
// timestamp: Date.now(),
|
||||||
|
// message: 'Peers list fetched successfully',
|
||||||
|
// response: {
|
||||||
|
// dataJson: result
|
||||||
|
// },
|
||||||
|
// });
|
||||||
|
// });
|
||||||
|
} catch (error) {
|
||||||
|
console.log('error 3###########', error);
|
||||||
|
next(new InternalServerErrorException(error));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
|
||||||
private getPeers = async (
|
private getPeers = async (
|
||||||
request: Request,
|
request: Request,
|
||||||
response: Response,
|
response: Response,
|
||||||
@ -651,7 +858,7 @@ export class BlockchainKernelController {
|
|||||||
.utc()
|
.utc()
|
||||||
.format('YYYY-MM-DD');
|
.format('YYYY-MM-DD');
|
||||||
|
|
||||||
var timeIntervalQry =
|
var timeIntervalQry =
|
||||||
"timestamp at time zone '" +
|
"timestamp at time zone '" +
|
||||||
process.env.TIME_ZONE +
|
process.env.TIME_ZONE +
|
||||||
"' BETWEEN SYMMETRIC '" +
|
"' BETWEEN SYMMETRIC '" +
|
||||||
@ -679,7 +886,7 @@ export class BlockchainKernelController {
|
|||||||
Fee.push(e.fee);
|
Fee.push(e.fee);
|
||||||
});
|
});
|
||||||
|
|
||||||
if(date.length == 0){
|
if (date.length == 0) {
|
||||||
date = [moment(Date.now()).format('YYYY-MM-DD')];
|
date = [moment(Date.now()).format('YYYY-MM-DD')];
|
||||||
Fee = [0];
|
Fee = [0];
|
||||||
}
|
}
|
||||||
@ -834,7 +1041,7 @@ LEFT JOIN (select block_id, count(block_id) as block_id_count from blockchain_ou
|
|||||||
) => {
|
) => {
|
||||||
try {
|
try {
|
||||||
const TransactionFeeRequestData: TransactionFeeDto = request.query;
|
const TransactionFeeRequestData: TransactionFeeDto = request.query;
|
||||||
if (TransactionFeeRequestData.Interval) {
|
if (TransactionFeeRequestData.Interval) {
|
||||||
var timeIntervalQry =
|
var timeIntervalQry =
|
||||||
"blockchain_block.timestamp > current_date - interval '" +
|
"blockchain_block.timestamp > current_date - interval '" +
|
||||||
TransactionFeeRequestData.Interval +
|
TransactionFeeRequestData.Interval +
|
||||||
@ -853,7 +1060,7 @@ LEFT JOIN (select block_id, count(block_id) as block_id_count from blockchain_ou
|
|||||||
// ' AND ' +
|
// ' AND ' +
|
||||||
// TransactionFeeRequestData.ToDate;
|
// TransactionFeeRequestData.ToDate;
|
||||||
|
|
||||||
var timeIntervalQry =
|
var timeIntervalQry =
|
||||||
"blockchain_block.timestamp at time zone '" +
|
"blockchain_block.timestamp at time zone '" +
|
||||||
process.env.TIME_ZONE +
|
process.env.TIME_ZONE +
|
||||||
"' BETWEEN SYMMETRIC '" +
|
"' BETWEEN SYMMETRIC '" +
|
||||||
@ -861,7 +1068,7 @@ LEFT JOIN (select block_id, count(block_id) as block_id_count from blockchain_ou
|
|||||||
"' AND '" +
|
"' AND '" +
|
||||||
TransactionFeeRequestData.ToDate +
|
TransactionFeeRequestData.ToDate +
|
||||||
"'";
|
"'";
|
||||||
|
|
||||||
var seriesquery =
|
var seriesquery =
|
||||||
"'" +
|
"'" +
|
||||||
TransactionFeeRequestData.FromDate +
|
TransactionFeeRequestData.FromDate +
|
||||||
@ -914,8 +1121,7 @@ LEFT JOIN (select block_id, count(block_id) as block_id_count from blockchain_ou
|
|||||||
totaloutput = [];
|
totaloutput = [];
|
||||||
|
|
||||||
TransactionHeatmapChartQuery.forEach(e => {
|
TransactionHeatmapChartQuery.forEach(e => {
|
||||||
if(moment(e.hour).format('YYYY-MM-DD') >= moment('2019-09-03').format('YYYY-MM-DD'))
|
if (moment(e.hour).format('YYYY-MM-DD') >= moment('2019-09-03').format('YYYY-MM-DD')) {
|
||||||
{
|
|
||||||
date.push(moment(e.hour).format('YYYY-MM-DD'));
|
date.push(moment(e.hour).format('YYYY-MM-DD'));
|
||||||
totalinput.push(e.totalinput != null ? e.totalinput : 0);
|
totalinput.push(e.totalinput != null ? e.totalinput : 0);
|
||||||
totalkernal.push(e.totalkernal != null ? e.totalkernal : 0);
|
totalkernal.push(e.totalkernal != null ? e.totalkernal : 0);
|
||||||
|
41
server/entities/PeerIp.ts
Normal file
41
server/entities/PeerIp.ts
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
import {
|
||||||
|
BaseEntity,
|
||||||
|
Column,
|
||||||
|
Entity,
|
||||||
|
Index,
|
||||||
|
JoinColumn,
|
||||||
|
ManyToOne,
|
||||||
|
PrimaryGeneratedColumn,
|
||||||
|
} from 'typeorm';
|
||||||
|
|
||||||
|
@Entity('peer_ip', { schema: 'public' })
|
||||||
|
export class PeerIp {
|
||||||
|
@PrimaryGeneratedColumn({
|
||||||
|
type: 'integer',
|
||||||
|
name: 'id',
|
||||||
|
})
|
||||||
|
Id: number;
|
||||||
|
|
||||||
|
@Column('character varying', {
|
||||||
|
nullable: false,
|
||||||
|
primary: true,
|
||||||
|
length: 142,
|
||||||
|
name: 'ip',
|
||||||
|
})
|
||||||
|
IpAddress: string;
|
||||||
|
|
||||||
|
@Column('character varying', {
|
||||||
|
nullable: false,
|
||||||
|
length: 142,
|
||||||
|
name: 'longitude',
|
||||||
|
})
|
||||||
|
Longitude: string;
|
||||||
|
|
||||||
|
@Column('character varying', {
|
||||||
|
nullable: false,
|
||||||
|
length: 142,
|
||||||
|
name: 'latitude',
|
||||||
|
})
|
||||||
|
Latitude: string;
|
||||||
|
|
||||||
|
}
|
@ -103,6 +103,12 @@
|
|||||||
"getdifficulty-randomx" : "Gibt die RandomX-Schwierigkeit als reine Textzeichenfolge zurück",
|
"getdifficulty-randomx" : "Gibt die RandomX-Schwierigkeit als reine Textzeichenfolge zurück",
|
||||||
"getdifficulty-progpow" : "Gibt die ProgPoW-Schwierigkeit als reine Textzeichenfolge zurück",
|
"getdifficulty-progpow" : "Gibt die ProgPoW-Schwierigkeit als reine Textzeichenfolge zurück",
|
||||||
"getdifficulty-cuckoo" : "Gibt die Cuckoo-Schwierigkeit als einfache Textzeichenfolge zurück",
|
"getdifficulty-cuckoo" : "Gibt die Cuckoo-Schwierigkeit als einfache Textzeichenfolge zurück",
|
||||||
|
"gettargetdifficulty-randomx" : "Gibt die RandomX-Zielschwierigkeit als Nur-Text-Zeichenfolge zurück",
|
||||||
|
"gettargetdifficulty-progpow" : "Gibt die ProgPoW-Zielschwierigkeit als Nur-Text-Zeichenfolge zurück",
|
||||||
|
"gettargetdifficulty-cuckoo" : "Gibt die Cuckoo-Zielschwierigkeit als Nur-Text-Zeichenfolge zurück",
|
||||||
|
"getnetworkhashrate-randomx" : "Gibt die RandomX-Netzwerk-Hashrate als Nur-Text-Zeichenfolge zurück",
|
||||||
|
"getnetworkhashrate-progpow" : "Gibt die ProgPoW-Netzwerk-Hashrate als Nur-Text-Zeichenfolge zurück",
|
||||||
|
"getnetworkhashrate-cuckoo" : "Gibt die Cuckoo-Netzwerk-Hashrate als Nur-Text-Zeichenfolge zurück",
|
||||||
"totalcoins" : "Gibt die ausstehende Anzahl von Münzen zurück",
|
"totalcoins" : "Gibt die ausstehende Anzahl von Münzen zurück",
|
||||||
"Block-Queries": "Block Abfragen",
|
"Block-Queries": "Block Abfragen",
|
||||||
"real-time-simple-query" : "Einfache Echtzeits abfragen",
|
"real-time-simple-query" : "Einfache Echtzeits abfragen",
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
"EXPLORE_IT": "Explore",
|
"EXPLORE_IT": "Explore",
|
||||||
"blocks-by-algorithm" : "Blocks by Algorithm",
|
"blocks-by-algorithm" : "Blocks by Algorithm",
|
||||||
"VIEWALL": "View All Charts",
|
"VIEWALL": "View All Charts",
|
||||||
"BLOCKCHAIN_HEIGHT": "Blockchain Height",
|
"BLOCKCHAIN_HEIGHT": "Block Height",
|
||||||
"BLOCKCHAIN_SIZE":"Blockchain Size",
|
"BLOCKCHAIN_SIZE":"Blockchain Size",
|
||||||
"LATEST_BLOCKS" : "Latest Blocks",
|
"LATEST_BLOCKS" : "Latest Blocks",
|
||||||
"LATEST_BLOCK_AGE": "Latest Block",
|
"LATEST_BLOCK_AGE": "Latest Block",
|
||||||
@ -103,6 +103,12 @@
|
|||||||
"getdifficulty-randomx" : "returns the RandomX difficulty as a plain text string",
|
"getdifficulty-randomx" : "returns the RandomX difficulty as a plain text string",
|
||||||
"getdifficulty-progpow" : "returns the ProgPoW difficulty as a plain text string",
|
"getdifficulty-progpow" : "returns the ProgPoW difficulty as a plain text string",
|
||||||
"getdifficulty-cuckoo" : "returns the Cuckoo difficulty as a plain text string",
|
"getdifficulty-cuckoo" : "returns the Cuckoo difficulty as a plain text string",
|
||||||
|
"gettargetdifficulty-randomx" : "returns the RandomX target difficulty as a plain text string",
|
||||||
|
"gettargetdifficulty-progpow" : "returns the ProgPoW target difficulty as a plain text string",
|
||||||
|
"gettargetdifficulty-cuckoo" : "returns the Cuckoo target difficulty as a plain text string",
|
||||||
|
"getnetworkhashrate-randomx" : "returns the RandomX network hashrate as a plain text string",
|
||||||
|
"getnetworkhashrate-progpow" : "returns the ProgPoW network hashrate as a plain text string",
|
||||||
|
"getnetworkhashrate-cuckoo" : "returns the Cuckoo network hashrate as a plain text string",
|
||||||
"totalcoins" : "returns the outstanding number of coins",
|
"totalcoins" : "returns the outstanding number of coins",
|
||||||
"Block-Queries": "Block Queries",
|
"Block-Queries": "Block Queries",
|
||||||
"real-time-simple-query" : "Real-Time Simple Queries",
|
"real-time-simple-query" : "Real-Time Simple Queries",
|
||||||
|
@ -225,154 +225,80 @@ else if(height < (first_duration + (7 * year_height)) ) {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Last Block home page function
|
||||||
const latestBlockDetails = async()=> {
|
const latestBlockDetails = async()=> {
|
||||||
let block_height = '',
|
let block_height = '',
|
||||||
letest_block,
|
letest_block,
|
||||||
letest_block_num = '',
|
letest_block_num = '',
|
||||||
letest_block_duration = '';
|
letest_block_duration = '';
|
||||||
|
const BlockchainLatestBlockQuery = await getConnection(Global.network)
|
||||||
|
.query(
|
||||||
|
'SELECT timestamp,height,edge_bits,hash,secondary_scaling, previous_id, total_difficulty_cuckaroo, total_difficulty_cuckatoo, total_difficulty_progpow, total_difficulty_randomx FROM blockchain_block ORDER BY timestamp DESC LIMIT 1',
|
||||||
|
)
|
||||||
|
.catch(err_msg => {
|
||||||
|
return(err_msg);
|
||||||
|
});
|
||||||
|
const BlockchainPreviousBlockQuery = await getConnection(Global.network)
|
||||||
|
.query(
|
||||||
|
'SELECT total_difficulty_cuckaroo, total_difficulty_cuckatoo, total_difficulty_progpow, total_difficulty_randomx FROM blockchain_block WHERE hash=' +
|
||||||
|
"'" +
|
||||||
|
BlockchainLatestBlockQuery[0].previous_id +
|
||||||
|
"'",
|
||||||
|
).catch(err_msg => {
|
||||||
|
return(err_msg);
|
||||||
|
});
|
||||||
|
|
||||||
const BlockchainLatestBlockQuery = await getConnection(Global.network)
|
// const space = await exec('du -sh /root/.epic/main/chain_data/ --exclude=*.zip');
|
||||||
.query(
|
const space = "1.7G /var/www/html/"
|
||||||
'SELECT timestamp,height,edge_bits,hash,secondary_scaling, previous_id, total_difficulty_cuckaroo, total_difficulty_cuckatoo, total_difficulty_progpow, total_difficulty_randomx FROM blockchain_block ORDER BY timestamp DESC LIMIT 1',
|
// let disk_space = space.stdout.split('\t')[0];
|
||||||
)
|
const disk_space = "1.7"
|
||||||
.catch(err_msg => {
|
|
||||||
return(err_msg);
|
|
||||||
});
|
|
||||||
const BlockchainPreviousBlockQuery = await getConnection(Global.network)
|
|
||||||
.query(
|
|
||||||
'SELECT total_difficulty_cuckaroo, total_difficulty_cuckatoo, total_difficulty_progpow, total_difficulty_randomx FROM blockchain_block WHERE hash=' +
|
|
||||||
"'" +
|
|
||||||
BlockchainLatestBlockQuery[0].previous_id +
|
|
||||||
"'",
|
|
||||||
)
|
|
||||||
.catch(err_msg => {
|
|
||||||
return(err_msg);
|
|
||||||
});
|
|
||||||
|
|
||||||
const space = await exec('du -sh /root/.epic/main/chain_data/ --exclude=*.zip');
|
// const space_new = await exec('du -sk /root/.epic/main/chain_data/ --exclude=*.zip');
|
||||||
let disk_space = space.stdout.split('\t')[0];
|
const space_new = "1.7G /var/www/html/"
|
||||||
|
//let disk_space_kb = space_new.stdout.split('\t')[0];
|
||||||
|
// let disk_space_kb = (space_new.stdout.split('\t')[0] / 1000000).toFixed(2)+"G";
|
||||||
|
let disk_space_kb = "1.7G"
|
||||||
|
let height = BlockchainLatestBlockQuery[0].height;
|
||||||
|
var coin_existence;
|
||||||
|
let DAY_HEIGHT = 1440
|
||||||
|
/// Height of the first epic block emission era
|
||||||
|
const BLOCK_ERA_1 = DAY_HEIGHT * 334;
|
||||||
|
/// Height of the second epic block emission era
|
||||||
|
const BLOCK_ERA_2 = BLOCK_ERA_1 + (DAY_HEIGHT * 470);
|
||||||
|
/// Height of the third epic block emission era
|
||||||
|
const BLOCK_ERA_3 = BLOCK_ERA_2 + (DAY_HEIGHT * 601);
|
||||||
|
/// Height of the fourth epic block emission era
|
||||||
|
const BLOCK_ERA_4 = BLOCK_ERA_3 + (DAY_HEIGHT * 800);
|
||||||
|
/// Height of the fifth epic block emission era
|
||||||
|
const BLOCK_ERA_5 = BLOCK_ERA_4 + (DAY_HEIGHT * 1019);
|
||||||
|
/// After the epic block emission era 6, each era will last 4 years (approximately 1460 days)
|
||||||
|
const BLOCK_ERA_6_ONWARDS = DAY_HEIGHT * 1460;
|
||||||
|
/// Block Reward that will be assigned after we change from era 5 to era 6.
|
||||||
|
const BASE_REWARD_ERA_6_ONWARDS = 0.15625;
|
||||||
|
|
||||||
const space_new = await exec('du -sk /root/.epic/main/chain_data/ --exclude=*.zip');
|
let remaining_height = 0;
|
||||||
//let disk_space_kb = space_new.stdout.split('\t')[0];
|
let currentReward = 16;
|
||||||
let disk_space_kb = (space_new.stdout.split('\t')[0] / 1000000).toFixed(2)+"G";
|
/// Compute the total reward generated by each block in a given height.
|
||||||
let height = BlockchainLatestBlockQuery[0].height;
|
|
||||||
var coin_existence;
|
|
||||||
// if (height > 12960) {
|
|
||||||
// var remain_block = height - 12960;
|
|
||||||
// var coin_existence =
|
|
||||||
// 1440 * 200 +
|
|
||||||
// 1440 * 180 +
|
|
||||||
// 1440 * 160 +
|
|
||||||
// 1440 * 140 +
|
|
||||||
// 1440 * 120 +
|
|
||||||
// 1440 * 100 +
|
|
||||||
// 1440 * 80 +
|
|
||||||
// 1440 * 60 +
|
|
||||||
// 1440 * 50 +
|
|
||||||
// 25 * remain_block;
|
|
||||||
// } else if (height > 11520) {
|
|
||||||
// var remain_block = height - 11520;
|
|
||||||
// var coin_existence =
|
|
||||||
// 1440 * 200 +
|
|
||||||
// 1440 * 180 +
|
|
||||||
// 1440 * 160 +
|
|
||||||
// 1440 * 140 +
|
|
||||||
// 1440 * 120 +
|
|
||||||
// 1440 * 100 +
|
|
||||||
// 1440 * 80 +
|
|
||||||
// 1440 * 60 +
|
|
||||||
// remain_block * 50;
|
|
||||||
// } else if (height > 10080) {
|
|
||||||
// var remain_block = height - 10080;
|
|
||||||
// var coin_existence =
|
|
||||||
// 1440 * 200 +
|
|
||||||
// 1440 * 180 +
|
|
||||||
// 1440 * 160 +
|
|
||||||
// 1440 * 140 +
|
|
||||||
// 1440 * 120 +
|
|
||||||
// 1440 * 100 +
|
|
||||||
// 1440 * 80 +
|
|
||||||
// remain_block * 60;
|
|
||||||
// } else if (height > 8640) {
|
|
||||||
// var remain_block = height - 8640;
|
|
||||||
// var coin_existence =
|
|
||||||
// 1440 * 200 +
|
|
||||||
// 1440 * 180 +
|
|
||||||
// 1440 * 160 +
|
|
||||||
// 1440 * 140 +
|
|
||||||
// 1440 * 120 +
|
|
||||||
// 1440 * 100 +
|
|
||||||
// remain_block * 80;
|
|
||||||
// } else if (height > 7200) {
|
|
||||||
// var remain_block = height - 7200;
|
|
||||||
// var coin_existence =
|
|
||||||
// 1440 * 200 +
|
|
||||||
// 1440 * 180 +
|
|
||||||
// 1440 * 160 +
|
|
||||||
// 1440 * 140 +
|
|
||||||
// 1440 * 120 +
|
|
||||||
// remain_block * 100;
|
|
||||||
// } else if (height > 5760) {
|
|
||||||
// var remain_block = height - 5760;
|
|
||||||
// var coin_existence =
|
|
||||||
// 1440 * 200 +
|
|
||||||
// 1440 * 180 +
|
|
||||||
// 1440 * 160 +
|
|
||||||
// 1440 * 140 +
|
|
||||||
// remain_block * 120;
|
|
||||||
// } else if (height > 4320) {
|
|
||||||
// var remain_block = height - 4320;
|
|
||||||
// var coin_existence =
|
|
||||||
// 1440 * 200 + 1440 * 180 + 1440 * 160 + remain_block * 140;
|
|
||||||
// } else if (height > 2880) {
|
|
||||||
// var remain_block = height - 2880;
|
|
||||||
// var coin_existence = 1440 * 200 + 1440 * 180 + remain_block * 160;
|
|
||||||
// } else if (height > 1440) {
|
|
||||||
// var remain_block = height - 1440;
|
|
||||||
// var coin_existence = 1440 * 200 + remain_block * 180;
|
|
||||||
// } else {
|
|
||||||
// var coin_existence = height * 200;
|
|
||||||
// }
|
|
||||||
|
|
||||||
let DAY_HEIGHT = 1440
|
|
||||||
/// Height of the first epic block emission era
|
|
||||||
const BLOCK_ERA_1 = DAY_HEIGHT * 334;
|
|
||||||
/// Height of the second epic block emission era
|
|
||||||
const BLOCK_ERA_2 = BLOCK_ERA_1 + (DAY_HEIGHT * 470);
|
|
||||||
/// Height of the third epic block emission era
|
|
||||||
const BLOCK_ERA_3 = BLOCK_ERA_2 + (DAY_HEIGHT * 601);
|
|
||||||
/// Height of the fourth epic block emission era
|
|
||||||
const BLOCK_ERA_4 = BLOCK_ERA_3 + (DAY_HEIGHT * 800);
|
|
||||||
/// Height of the fifth epic block emission era
|
|
||||||
const BLOCK_ERA_5 = BLOCK_ERA_4 + (DAY_HEIGHT * 1019);
|
|
||||||
/// After the epic block emission era 6, each era will last 4 years (approximately 1460 days)
|
|
||||||
const BLOCK_ERA_6_ONWARDS = DAY_HEIGHT * 1460;
|
|
||||||
/// Block Reward that will be assigned after we change from era 5 to era 6.
|
|
||||||
const BASE_REWARD_ERA_6_ONWARDS = 0.15625;
|
|
||||||
|
|
||||||
let remaining_height = 0;
|
|
||||||
let currentReward = 16;
|
|
||||||
/// Compute the total reward generated by each block in a given height.
|
|
||||||
if (height <= BLOCK_ERA_1) {
|
if (height <= BLOCK_ERA_1) {
|
||||||
coin_existence = height * 16;
|
coin_existence = height * 16;
|
||||||
currentReward = 16;
|
currentReward = 16;
|
||||||
} else if (height <= BLOCK_ERA_2) {
|
} else if (height <= BLOCK_ERA_2) {
|
||||||
remaining_height = height - BLOCK_ERA_1;
|
remaining_height = height - BLOCK_ERA_1;
|
||||||
coin_existence = (16 * BLOCK_ERA_1) + 8 * remaining_height;
|
coin_existence = (16 * BLOCK_ERA_1) + 8 * remaining_height;
|
||||||
currentReward = 8;
|
currentReward = 8;
|
||||||
} else if (height <= BLOCK_ERA_3) {
|
} else if (height <= BLOCK_ERA_3) {
|
||||||
remaining_height = height - BLOCK_ERA_2;
|
remaining_height = height - BLOCK_ERA_2;
|
||||||
coin_existence = (16 * BLOCK_ERA_1) + (8 * BLOCK_ERA_2) + 4 * remaining_height;
|
coin_existence = (16 * BLOCK_ERA_1) + (8 * BLOCK_ERA_2) + 4 * remaining_height;
|
||||||
currentReward = 4;
|
currentReward = 4;
|
||||||
} else if (height <= BLOCK_ERA_4) {
|
} else if (height <= BLOCK_ERA_4) {
|
||||||
remaining_height = height - BLOCK_ERA_3;
|
remaining_height = height - BLOCK_ERA_3;
|
||||||
coin_existence = (16 * BLOCK_ERA_1) + (8 * BLOCK_ERA_2) + (4 * BLOCK_ERA_3) + 2 * remaining_height;
|
coin_existence = (16 * BLOCK_ERA_1) + (8 * BLOCK_ERA_2) + (4 * BLOCK_ERA_3) + 2 * remaining_height;
|
||||||
currentReward = 2;
|
currentReward = 2;
|
||||||
} else if (height <= BLOCK_ERA_5) {
|
} else if (height <= BLOCK_ERA_5) {
|
||||||
remaining_height = height - BLOCK_ERA_4;
|
remaining_height = height - BLOCK_ERA_4;
|
||||||
coin_existence = (16 * BLOCK_ERA_1) + (8 * BLOCK_ERA_2) + (4 * BLOCK_ERA_3) + (2 * BLOCK_ERA_4) +1 * remaining_height;
|
coin_existence = (16 * BLOCK_ERA_1) + (8 * BLOCK_ERA_2) + (4 * BLOCK_ERA_3) + (2 * BLOCK_ERA_4) +1 * remaining_height;
|
||||||
currentReward = 1;
|
currentReward = 1;
|
||||||
} else {
|
} else {
|
||||||
// After the era 6, we reduce the block rewards by half each 1460 days.
|
// After the era 6, we reduce the block rewards by half each 1460 days.
|
||||||
// Minus 1 to include multiples in the same index
|
// Minus 1 to include multiples in the same index
|
||||||
// (i.e changes greater than to greater or equals to)
|
// (i.e changes greater than to greater or equals to)
|
||||||
@ -386,135 +312,325 @@ let currentReward = 16;
|
|||||||
currentReward = reward_emission;
|
currentReward = reward_emission;
|
||||||
}
|
}
|
||||||
|
|
||||||
letest_block = dateDiff(BlockchainLatestBlockQuery[0].timestamp,true);
|
letest_block = dateDiff(BlockchainLatestBlockQuery[0].timestamp,true);
|
||||||
letest_block_num = letest_block; // "72"
|
letest_block_num = letest_block; // "72"
|
||||||
letest_block_duration = letest_block == 1 ? 'second ago' : 'seconds ago';
|
letest_block_duration = letest_block == 1 ? 'second ago' : 'seconds ago';
|
||||||
const SECOND_POW_EDGE_BITS = 29;
|
const SECOND_POW_EDGE_BITS = 29;
|
||||||
const BASE_EDGE_BITS = 24;
|
const BASE_EDGE_BITS = 24;
|
||||||
|
|
||||||
if (BlockchainLatestBlockQuery[0].edge_bits == SECOND_POW_EDGE_BITS) {
|
if (BlockchainLatestBlockQuery[0].edge_bits == SECOND_POW_EDGE_BITS) {
|
||||||
var hashvalue = BlockchainLatestBlockQuery[0].hash;
|
var hashvalue = BlockchainLatestBlockQuery[0].hash;
|
||||||
var diff =
|
var diff =
|
||||||
(BlockchainLatestBlockQuery[0].secondary_scaling * 2 ** 64) /
|
(BlockchainLatestBlockQuery[0].secondary_scaling * 2 ** 64) /
|
||||||
parseInt(hashvalue.substring(0, 16), 16);
|
parseInt(hashvalue.substring(0, 16), 16);
|
||||||
var result = Math.min(diff, 0xffffffffffffffff);
|
var result = Math.min(diff, 0xffffffffffffffff);
|
||||||
var difficulty = Math.round(result);
|
var difficulty = Math.round(result);
|
||||||
} else {
|
} else {
|
||||||
var graph_weight =
|
var graph_weight =
|
||||||
2 *
|
2 *
|
||||||
2 ** (BlockchainLatestBlockQuery[0].edge_bits - BASE_EDGE_BITS) *
|
2 ** (BlockchainLatestBlockQuery[0].edge_bits - BASE_EDGE_BITS) *
|
||||||
BlockchainLatestBlockQuery[0].edge_bits;
|
BlockchainLatestBlockQuery[0].edge_bits;
|
||||||
var hashvalue = BlockchainLatestBlockQuery[0].hash;
|
var hashvalue = BlockchainLatestBlockQuery[0].hash;
|
||||||
var diff =
|
var diff =
|
||||||
(graph_weight * 2 ** 64) / parseInt(hashvalue.substring(0, 16), 16);
|
(graph_weight * 2 ** 64) / parseInt(hashvalue.substring(0, 16), 16);
|
||||||
var result = Math.min(diff, 0xffffffffffffffff);
|
var result = Math.min(diff, 0xffffffffffffffff);
|
||||||
var difficulty = Math.round(result);
|
var difficulty = Math.round(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (BlockchainLatestBlockQuery[0].previous_id) {
|
if (BlockchainLatestBlockQuery[0].previous_id) {
|
||||||
var targetdifficultycuckaroo =
|
var targetdifficultycuckaroo =
|
||||||
BlockchainLatestBlockQuery[0].total_difficulty_cuckaroo -
|
BlockchainLatestBlockQuery[0].total_difficulty_cuckaroo -
|
||||||
BlockchainPreviousBlockQuery[0].total_difficulty_cuckaroo;
|
BlockchainPreviousBlockQuery[0].total_difficulty_cuckaroo;
|
||||||
var targetdifficultycuckatoo =
|
var targetdifficultycuckatoo =
|
||||||
BlockchainLatestBlockQuery[0].total_difficulty_cuckatoo -
|
BlockchainLatestBlockQuery[0].total_difficulty_cuckatoo -
|
||||||
BlockchainPreviousBlockQuery[0].total_difficulty_cuckatoo;
|
BlockchainPreviousBlockQuery[0].total_difficulty_cuckatoo;
|
||||||
var targetdifficultyprogpow =
|
var targetdifficultyprogpow =
|
||||||
BlockchainLatestBlockQuery[0].total_difficulty_progpow -
|
BlockchainLatestBlockQuery[0].total_difficulty_progpow -
|
||||||
BlockchainPreviousBlockQuery[0].total_difficulty_progpow;
|
BlockchainPreviousBlockQuery[0].total_difficulty_progpow;
|
||||||
var targetdifficultyrandomx =
|
var targetdifficultyrandomx =
|
||||||
BlockchainLatestBlockQuery[0].total_difficulty_randomx -
|
BlockchainLatestBlockQuery[0].total_difficulty_randomx -
|
||||||
BlockchainPreviousBlockQuery[0].total_difficulty_randomx;
|
BlockchainPreviousBlockQuery[0].total_difficulty_randomx;
|
||||||
}
|
}
|
||||||
|
|
||||||
block_height = BlockchainLatestBlockQuery[0].height;
|
block_height = BlockchainLatestBlockQuery[0].height;
|
||||||
var TotalCuckoo=parseInt(BlockchainLatestBlockQuery[0].total_difficulty_cuckatoo) +
|
var TotalCuckoo=parseInt(BlockchainLatestBlockQuery[0].total_difficulty_cuckatoo) +
|
||||||
parseInt(BlockchainLatestBlockQuery[0].total_difficulty_cuckaroo);
|
parseInt(BlockchainLatestBlockQuery[0].total_difficulty_cuckaroo);
|
||||||
|
|
||||||
|
let FOUNDATION_LEVY_ERA_1 = DAY_HEIGHT * 120;
|
||||||
|
/// After the first foundation levy era, we decrease the foundation levy each year
|
||||||
|
let FOUNDATION_LEVY_ERA_2_ONWARDS = DAY_HEIGHT * 365;
|
||||||
|
|
||||||
let FOUNDATION_LEVY_ERA_1 = DAY_HEIGHT * 120;
|
/// The foundation levy in each era
|
||||||
/// After the first foundation levy era, we decrease the foundation levy each year
|
let FOUNDATION_LEVY = [
|
||||||
let FOUNDATION_LEVY_ERA_2_ONWARDS = DAY_HEIGHT * 365;
|
0.0888, 0.0777, 0.0666, 0.0555, 0.0444, 0.0333, 0.0222, 0.0111, 0.0111,
|
||||||
|
];
|
||||||
|
|
||||||
/// The foundation levy in each era
|
/// Compute the foundation levy for each block.
|
||||||
let FOUNDATION_LEVY = [
|
let foundationReward = 16 * FOUNDATION_LEVY[0];
|
||||||
0.0888, 0.0777, 0.0666, 0.0555, 0.0444, 0.0333, 0.0222, 0.0111, 0.0111,
|
let userReward = 16 - (FOUNDATION_LEVY[0]);
|
||||||
];
|
if (height <= 0) {
|
||||||
|
foundationReward =0;
|
||||||
/// Compute the foundation levy for each block.
|
userReward = 0;
|
||||||
let foundationReward = 16 * FOUNDATION_LEVY[0];
|
} else if (height <= FOUNDATION_LEVY_ERA_1) {
|
||||||
let userReward = 16 - (FOUNDATION_LEVY[0]);
|
foundationReward = currentReward * FOUNDATION_LEVY[0];
|
||||||
if (height <= 0) {
|
userReward = currentReward -foundationReward;
|
||||||
foundationReward =0;
|
} else {
|
||||||
userReward = 0;
|
// We subtract 1 to include the last block of an era.
|
||||||
} else if (height <= FOUNDATION_LEVY_ERA_1) {
|
let height_with_offset = height - FOUNDATION_LEVY_ERA_1 - 1;
|
||||||
foundationReward = currentReward * FOUNDATION_LEVY[0];
|
// We used the index 0 in the first era, therefore we offset the index by 1
|
||||||
userReward = currentReward -foundationReward;
|
let index = (height_with_offset / FOUNDATION_LEVY_ERA_2_ONWARDS) + 1;
|
||||||
} else {
|
if (index < FOUNDATION_LEVY.length ) {
|
||||||
// We subtract 1 to include the last block of an era.
|
foundationReward = currentReward * FOUNDATION_LEVY[index];
|
||||||
let height_with_offset = height - FOUNDATION_LEVY_ERA_1 - 1;
|
userReward = currentReward -foundationReward;
|
||||||
// We used the index 0 in the first era, therefore we offset the index by 1
|
} else {
|
||||||
let index = (height_with_offset / FOUNDATION_LEVY_ERA_2_ONWARDS) + 1;
|
foundationReward = 0;
|
||||||
|
userReward = 0;
|
||||||
if (index < FOUNDATION_LEVY.length ) {
|
|
||||||
foundationReward = currentReward * FOUNDATION_LEVY[index];
|
|
||||||
userReward = currentReward -foundationReward;
|
|
||||||
} else {
|
|
||||||
foundationReward = 0;
|
|
||||||
userReward = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let cuckoohashrate = await network_hashrate(block_height,31,targetdifficultycuckatoo+targetdifficultycuckaroo,"Cuckoo");
|
|
||||||
let progpowhashrate = await network_hashrate(block_height,16,targetdifficultyprogpow,"ProgPow");
|
|
||||||
let randomxhashrate = await network_hashrate(block_height,16,targetdifficultyrandomx,"RandomX");
|
|
||||||
cuckoohashrate = Math.round(cuckoohashrate)
|
|
||||||
progpowhashrate = Math.round(progpowhashrate)
|
|
||||||
randomxhashrate = Math.round(randomxhashrate)
|
|
||||||
|
|
||||||
// // Test purpose
|
|
||||||
// let test_cuckoo = await testavgBlockTime(block_height,"Cuckoo")
|
|
||||||
// let test_randomx = await testavgBlockTime(block_height,"RandomX")
|
|
||||||
// let test_progpow = await testavgBlockTime(block_height,"ProgPow")
|
|
||||||
|
|
||||||
// console.log("-----------------")
|
|
||||||
// console.log("Cuckoo avg block time ", test_cuckoo)
|
|
||||||
// console.log("randomx avg block time ", test_randomx)
|
|
||||||
// console.log("Progpow avg block time ", test_progpow)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Total foundation reward
|
|
||||||
let totalFoundationReward = await circulationsupply(height)
|
|
||||||
|
|
||||||
return {
|
|
||||||
block_height,
|
|
||||||
letest_block,
|
|
||||||
letest_block_num,
|
|
||||||
letest_block_duration,
|
|
||||||
coin_existence,
|
|
||||||
difficulty,
|
|
||||||
targetdifficultycuckaroo,
|
|
||||||
targetdifficultycuckatoo,
|
|
||||||
targetdifficultyprogpow,
|
|
||||||
targetdifficultyrandomx,
|
|
||||||
TotalCuckoo,
|
|
||||||
TotalDifficultyCuckaroo:BlockchainLatestBlockQuery[0].total_difficulty_cuckaroo,
|
|
||||||
TotalDifficultyCuckatoo:BlockchainLatestBlockQuery[0].total_difficulty_cuckatoo,
|
|
||||||
TotalDifficultyProgpow:BlockchainLatestBlockQuery[0].total_difficulty_progpow,
|
|
||||||
TotalDifficultyRandomx:BlockchainLatestBlockQuery[0].total_difficulty_randomx,
|
|
||||||
currentReward,
|
|
||||||
foundationReward,
|
|
||||||
userReward,
|
|
||||||
cuckoohashrate,
|
|
||||||
progpowhashrate,
|
|
||||||
randomxhashrate,
|
|
||||||
totalFoundationReward,
|
|
||||||
diskSpace:disk_space_kb,
|
|
||||||
diskSpaceKb : disk_space_kb
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let cuckoohashrate = await network_hashrate(block_height,31,targetdifficultycuckatoo+targetdifficultycuckaroo,"Cuckoo");
|
||||||
|
let progpowhashrate = await network_hashrate(block_height,16,targetdifficultyprogpow,"ProgPow");
|
||||||
|
let randomxhashrate = await network_hashrate(block_height,16,targetdifficultyrandomx,"RandomX");
|
||||||
|
cuckoohashrate = Math.round(cuckoohashrate)
|
||||||
|
progpowhashrate = Math.round(progpowhashrate)
|
||||||
|
randomxhashrate = Math.round(randomxhashrate)
|
||||||
|
let totalFoundationReward = await circulationsupply(height)
|
||||||
|
|
||||||
|
return {
|
||||||
|
block_height,
|
||||||
|
letest_block,
|
||||||
|
letest_block_num,
|
||||||
|
letest_block_duration,
|
||||||
|
coin_existence,
|
||||||
|
difficulty,
|
||||||
|
targetdifficultycuckaroo,
|
||||||
|
targetdifficultycuckatoo,
|
||||||
|
targetdifficultyprogpow,
|
||||||
|
targetdifficultyrandomx,
|
||||||
|
TotalCuckoo,
|
||||||
|
TotalDifficultyCuckaroo:BlockchainLatestBlockQuery[0].total_difficulty_cuckaroo,
|
||||||
|
TotalDifficultyCuckatoo:BlockchainLatestBlockQuery[0].total_difficulty_cuckatoo,
|
||||||
|
TotalDifficultyProgpow:BlockchainLatestBlockQuery[0].total_difficulty_progpow,
|
||||||
|
TotalDifficultyRandomx:BlockchainLatestBlockQuery[0].total_difficulty_randomx,
|
||||||
|
currentReward,
|
||||||
|
foundationReward,
|
||||||
|
userReward,
|
||||||
|
cuckoohashrate,
|
||||||
|
progpowhashrate,
|
||||||
|
randomxhashrate,
|
||||||
|
totalFoundationReward,
|
||||||
|
diskSpace:disk_space_kb,
|
||||||
|
diskSpaceKb : disk_space_kb
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Previous Block home page function
|
||||||
|
const previousBlockDetails = async() => {
|
||||||
|
let block_height = '',
|
||||||
|
letest_block,
|
||||||
|
letest_block_num = '',
|
||||||
|
letest_block_duration = '';
|
||||||
|
const CurrentBlock = await getConnection(Global.network)
|
||||||
|
.query(
|
||||||
|
'SELECT timestamp,height,edge_bits,hash,secondary_scaling, previous_id, total_difficulty_cuckaroo, total_difficulty_cuckatoo, total_difficulty_progpow, total_difficulty_randomx FROM blockchain_block ORDER BY timestamp DESC LIMIT 1',
|
||||||
|
).catch(err_msg => {
|
||||||
|
return(err_msg);
|
||||||
|
});
|
||||||
|
const BlockchainLatestBlockQuery = await getConnection(Global.network)
|
||||||
|
.query(
|
||||||
|
'SELECT timestamp,height,edge_bits,hash,secondary_scaling, previous_id, total_difficulty_cuckaroo, total_difficulty_cuckatoo, total_difficulty_progpow, total_difficulty_randomx FROM blockchain_block WHERE hash=' +
|
||||||
|
"'" +
|
||||||
|
CurrentBlock[0].previous_id +
|
||||||
|
"'",
|
||||||
|
)
|
||||||
|
.catch(err_msg => {
|
||||||
|
return(err_msg);
|
||||||
|
});
|
||||||
|
const BlockchainPreviousBlockQuery = await getConnection(Global.network)
|
||||||
|
.query(
|
||||||
|
'SELECT total_difficulty_cuckaroo, total_difficulty_cuckatoo, total_difficulty_progpow, total_difficulty_randomx FROM blockchain_block WHERE hash=' +
|
||||||
|
"'" +
|
||||||
|
BlockchainLatestBlockQuery[0].previous_id +
|
||||||
|
"'",
|
||||||
|
).catch(err_msg => {
|
||||||
|
return(err_msg);
|
||||||
|
});
|
||||||
|
|
||||||
|
// const space = await exec('du -sh /root/.epic/main/chain_data/ --exclude=*.zip');
|
||||||
|
const space = "1.7G /var/www/html/"
|
||||||
|
// let disk_space = space.stdout.split('\t')[0];
|
||||||
|
const disk_space = "1.7"
|
||||||
|
|
||||||
|
// const space_new = await exec('du -sk /root/.epic/main/chain_data/ --exclude=*.zip');
|
||||||
|
const space_new = "1.7G /var/www/html/"
|
||||||
|
//let disk_space_kb = space_new.stdout.split('\t')[0];
|
||||||
|
// let disk_space_kb = (space_new.stdout.split('\t')[0] / 1000000).toFixed(2)+"G";
|
||||||
|
let disk_space_kb = "1.7G"
|
||||||
|
let height = BlockchainLatestBlockQuery[0].height;
|
||||||
|
var coin_existence;
|
||||||
|
let DAY_HEIGHT = 1440
|
||||||
|
/// Height of the first epic block emission era
|
||||||
|
const BLOCK_ERA_1 = DAY_HEIGHT * 334;
|
||||||
|
/// Height of the second epic block emission era
|
||||||
|
const BLOCK_ERA_2 = BLOCK_ERA_1 + (DAY_HEIGHT * 470);
|
||||||
|
/// Height of the third epic block emission era
|
||||||
|
const BLOCK_ERA_3 = BLOCK_ERA_2 + (DAY_HEIGHT * 601);
|
||||||
|
/// Height of the fourth epic block emission era
|
||||||
|
const BLOCK_ERA_4 = BLOCK_ERA_3 + (DAY_HEIGHT * 800);
|
||||||
|
/// Height of the fifth epic block emission era
|
||||||
|
const BLOCK_ERA_5 = BLOCK_ERA_4 + (DAY_HEIGHT * 1019);
|
||||||
|
/// After the epic block emission era 6, each era will last 4 years (approximately 1460 days)
|
||||||
|
const BLOCK_ERA_6_ONWARDS = DAY_HEIGHT * 1460;
|
||||||
|
/// Block Reward that will be assigned after we change from era 5 to era 6.
|
||||||
|
const BASE_REWARD_ERA_6_ONWARDS = 0.15625;
|
||||||
|
|
||||||
|
let remaining_height = 0;
|
||||||
|
let currentReward = 16;
|
||||||
|
/// Compute the total reward generated by each block in a given height.
|
||||||
|
if (height <= BLOCK_ERA_1) {
|
||||||
|
coin_existence = height * 16;
|
||||||
|
currentReward = 16;
|
||||||
|
} else if (height <= BLOCK_ERA_2) {
|
||||||
|
remaining_height = height - BLOCK_ERA_1;
|
||||||
|
coin_existence = (16 * BLOCK_ERA_1) + 8 * remaining_height;
|
||||||
|
currentReward = 8;
|
||||||
|
} else if (height <= BLOCK_ERA_3) {
|
||||||
|
remaining_height = height - BLOCK_ERA_2;
|
||||||
|
coin_existence = (16 * BLOCK_ERA_1) + (8 * BLOCK_ERA_2) + 4 * remaining_height;
|
||||||
|
currentReward = 4;
|
||||||
|
} else if (height <= BLOCK_ERA_4) {
|
||||||
|
remaining_height = height - BLOCK_ERA_3;
|
||||||
|
coin_existence = (16 * BLOCK_ERA_1) + (8 * BLOCK_ERA_2) + (4 * BLOCK_ERA_3) + 2 * remaining_height;
|
||||||
|
currentReward = 2;
|
||||||
|
} else if (height <= BLOCK_ERA_5) {
|
||||||
|
remaining_height = height - BLOCK_ERA_4;
|
||||||
|
coin_existence = (16 * BLOCK_ERA_1) + (8 * BLOCK_ERA_2) + (4 * BLOCK_ERA_3) + (2 * BLOCK_ERA_4) +1 * remaining_height;
|
||||||
|
currentReward = 1;
|
||||||
|
} else {
|
||||||
|
// After the era 6, we reduce the block rewards by half each 1460 days.
|
||||||
|
// Minus 1 to include multiples in the same index
|
||||||
|
// (i.e changes greater than to greater or equals to)
|
||||||
|
|
||||||
|
let preious_circulation = (16 * BLOCK_ERA_1) + (8 * BLOCK_ERA_2) + (4 * BLOCK_ERA_3) + (2 * BLOCK_ERA_4) + (1 * BLOCK_ERA_5);
|
||||||
|
|
||||||
|
let height_with_offset = height - (BLOCK_ERA_5 - 1);
|
||||||
|
let exp = height_with_offset / BLOCK_ERA_6_ONWARDS;
|
||||||
|
let reward_emission = BASE_REWARD_ERA_6_ONWARDS / (1 << exp);
|
||||||
|
coin_existence = preious_circulation + reward_emission ;
|
||||||
|
currentReward = reward_emission;
|
||||||
|
}
|
||||||
|
|
||||||
|
letest_block = dateDiff(BlockchainLatestBlockQuery[0].timestamp,true);
|
||||||
|
letest_block_num = letest_block; // "72"
|
||||||
|
letest_block_duration = letest_block == 1 ? 'second ago' : 'seconds ago';
|
||||||
|
const SECOND_POW_EDGE_BITS = 29;
|
||||||
|
const BASE_EDGE_BITS = 24;
|
||||||
|
|
||||||
|
if (BlockchainLatestBlockQuery[0].edge_bits == SECOND_POW_EDGE_BITS) {
|
||||||
|
var hashvalue = BlockchainLatestBlockQuery[0].hash;
|
||||||
|
var diff =
|
||||||
|
(BlockchainLatestBlockQuery[0].secondary_scaling * 2 ** 64) /
|
||||||
|
parseInt(hashvalue.substring(0, 16), 16);
|
||||||
|
var result = Math.min(diff, 0xffffffffffffffff);
|
||||||
|
var difficulty = Math.round(result);
|
||||||
|
} else {
|
||||||
|
var graph_weight =
|
||||||
|
2 *
|
||||||
|
2 ** (BlockchainLatestBlockQuery[0].edge_bits - BASE_EDGE_BITS) *
|
||||||
|
BlockchainLatestBlockQuery[0].edge_bits;
|
||||||
|
var hashvalue = BlockchainLatestBlockQuery[0].hash;
|
||||||
|
var diff =
|
||||||
|
(graph_weight * 2 ** 64) / parseInt(hashvalue.substring(0, 16), 16);
|
||||||
|
var result = Math.min(diff, 0xffffffffffffffff);
|
||||||
|
var difficulty = Math.round(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (BlockchainLatestBlockQuery[0].previous_id) {
|
||||||
|
var targetdifficultycuckaroo =
|
||||||
|
BlockchainLatestBlockQuery[0].total_difficulty_cuckaroo -
|
||||||
|
BlockchainPreviousBlockQuery[0].total_difficulty_cuckaroo;
|
||||||
|
var targetdifficultycuckatoo =
|
||||||
|
BlockchainLatestBlockQuery[0].total_difficulty_cuckatoo -
|
||||||
|
BlockchainPreviousBlockQuery[0].total_difficulty_cuckatoo;
|
||||||
|
var targetdifficultyprogpow =
|
||||||
|
BlockchainLatestBlockQuery[0].total_difficulty_progpow -
|
||||||
|
BlockchainPreviousBlockQuery[0].total_difficulty_progpow;
|
||||||
|
var targetdifficultyrandomx =
|
||||||
|
BlockchainLatestBlockQuery[0].total_difficulty_randomx -
|
||||||
|
BlockchainPreviousBlockQuery[0].total_difficulty_randomx;
|
||||||
|
}
|
||||||
|
|
||||||
|
block_height = BlockchainLatestBlockQuery[0].height;
|
||||||
|
var TotalCuckoo=parseInt(BlockchainLatestBlockQuery[0].total_difficulty_cuckatoo) +
|
||||||
|
parseInt(BlockchainLatestBlockQuery[0].total_difficulty_cuckaroo);
|
||||||
|
|
||||||
|
let FOUNDATION_LEVY_ERA_1 = DAY_HEIGHT * 120;
|
||||||
|
/// After the first foundation levy era, we decrease the foundation levy each year
|
||||||
|
let FOUNDATION_LEVY_ERA_2_ONWARDS = DAY_HEIGHT * 365;
|
||||||
|
|
||||||
|
/// The foundation levy in each era
|
||||||
|
let FOUNDATION_LEVY = [
|
||||||
|
0.0888, 0.0777, 0.0666, 0.0555, 0.0444, 0.0333, 0.0222, 0.0111, 0.0111,
|
||||||
|
];
|
||||||
|
|
||||||
|
/// Compute the foundation levy for each block.
|
||||||
|
let foundationReward = 16 * FOUNDATION_LEVY[0];
|
||||||
|
let userReward = 16 - (FOUNDATION_LEVY[0]);
|
||||||
|
if (height <= 0) {
|
||||||
|
foundationReward =0;
|
||||||
|
userReward = 0;
|
||||||
|
} else if (height <= FOUNDATION_LEVY_ERA_1) {
|
||||||
|
foundationReward = currentReward * FOUNDATION_LEVY[0];
|
||||||
|
userReward = currentReward -foundationReward;
|
||||||
|
} else {
|
||||||
|
// We subtract 1 to include the last block of an era.
|
||||||
|
let height_with_offset = height - FOUNDATION_LEVY_ERA_1 - 1;
|
||||||
|
// We used the index 0 in the first era, therefore we offset the index by 1
|
||||||
|
let index = (height_with_offset / FOUNDATION_LEVY_ERA_2_ONWARDS) + 1;
|
||||||
|
if (index < FOUNDATION_LEVY.length ) {
|
||||||
|
foundationReward = currentReward * FOUNDATION_LEVY[index];
|
||||||
|
userReward = currentReward -foundationReward;
|
||||||
|
} else {
|
||||||
|
foundationReward = 0;
|
||||||
|
userReward = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let cuckoohashrate = await network_hashrate(block_height,31,targetdifficultycuckatoo+targetdifficultycuckaroo,"Cuckoo");
|
||||||
|
let progpowhashrate = await network_hashrate(block_height,16,targetdifficultyprogpow,"ProgPow");
|
||||||
|
let randomxhashrate = await network_hashrate(block_height,16,targetdifficultyrandomx,"RandomX");
|
||||||
|
cuckoohashrate = Math.round(cuckoohashrate)
|
||||||
|
progpowhashrate = Math.round(progpowhashrate)
|
||||||
|
randomxhashrate = Math.round(randomxhashrate)
|
||||||
|
let totalFoundationReward = await circulationsupply(height)
|
||||||
|
|
||||||
|
return {
|
||||||
|
block_height,
|
||||||
|
letest_block,
|
||||||
|
letest_block_num,
|
||||||
|
letest_block_duration,
|
||||||
|
coin_existence,
|
||||||
|
difficulty,
|
||||||
|
targetdifficultycuckaroo,
|
||||||
|
targetdifficultycuckatoo,
|
||||||
|
targetdifficultyprogpow,
|
||||||
|
targetdifficultyrandomx,
|
||||||
|
TotalCuckoo,
|
||||||
|
TotalDifficultyCuckaroo:BlockchainLatestBlockQuery[0].total_difficulty_cuckaroo,
|
||||||
|
TotalDifficultyCuckatoo:BlockchainLatestBlockQuery[0].total_difficulty_cuckatoo,
|
||||||
|
TotalDifficultyProgpow:BlockchainLatestBlockQuery[0].total_difficulty_progpow,
|
||||||
|
TotalDifficultyRandomx:BlockchainLatestBlockQuery[0].total_difficulty_randomx,
|
||||||
|
currentReward,
|
||||||
|
foundationReward,
|
||||||
|
userReward,
|
||||||
|
cuckoohashrate,
|
||||||
|
progpowhashrate,
|
||||||
|
randomxhashrate,
|
||||||
|
totalFoundationReward,
|
||||||
|
diskSpace:disk_space_kb,
|
||||||
|
diskSpaceKb : disk_space_kb
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
async function Details (height) {
|
async function Details (height) {
|
||||||
if(height){
|
if(height){
|
||||||
@ -648,5 +764,6 @@ async function network_hashrate(height, edge_bits, difficulty,proof) {
|
|||||||
export {network_hashrate};
|
export {network_hashrate};
|
||||||
export {averageblockdifficulty};
|
export {averageblockdifficulty};
|
||||||
export {latestBlockDetails};
|
export {latestBlockDetails};
|
||||||
|
export {previousBlockDetails};
|
||||||
export {GetBlocktime};
|
export {GetBlocktime};
|
||||||
export {Details};
|
export {Details};
|
||||||
|
Loading…
Reference in New Issue
Block a user