Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • 1.6
  • 1.7
  • 1283-build-release-for-linux-x86-in-docker
  • 1291-write-contributing-workflow
  • RemoveFix
  • atelier-gva
  • bugfix/invalid-rules-distance-sigqty
  • build
  • dependencies-caching
  • dev
  • doc-gva
  • exp/ws2p-v2
  • feature/deb-arm-systemd
  • feature/oxyde-pow
  • fix/security-vulnerabilities
  • gva-blocks
  • gva-txs_by_block
  • oxyde-bc-db
  • oxyde-dal
  • oxyde-scrypt
  • reduce_cpu
  • release/1.8
  • stable
  • sync
  • test_prebuilt_nm
  • 0.14.1
  • 0.20.0a21
  • 0.31.0a1
  • 0.99.10
  • 0.99.11
  • 0.99.12
  • 0.99.13
  • 0.99.14
  • 0.99.15
  • 0.99.16
  • 0.99.17
  • 0.99.18
  • 0.99.19
  • 0.99.2
  • 0.99.20
  • 0.99.21
  • 0.99.3
  • 0.99.30
  • 0.99.4
  • 0.99.5
  • 0.99.6
  • 0.99.7
  • 0.99.8
  • 0.99.9
  • 1.6.10
  • 1.6.12
  • 2019.0324.1706
  • 2019.0325.1919
  • 2019.0327.1837
  • 2019.0329.1732
  • 2019.0403.1317
  • 2019.0405.1251
  • 2019.0407.1406
  • 2019.0407.1508
  • v0.0.1
  • v0.0.2
  • v0.0.3
  • v0.0.4
  • v0.0.4.1
  • v0.1.0
  • v0.12-beta
  • v0.12-beta2
  • v0.12-beta3
  • v0.12-beta4
  • v0.12-beta5
  • v0.12-beta6
  • v0.12.0
  • v0.12.1
  • v0.12.10
  • v0.12.2
  • v0.12.3
  • v0.12.4
  • v0.12.5
  • v0.12.6
  • v0.12.7
  • v0.12.8
  • v0.12.9
  • v0.13.0
  • v0.13.1
  • v0.13.2
  • v0.13.3
  • v0.13.4
  • v0.13.4bis
  • v0.13.5
  • v0.13.5a1
  • v0.13.5a2
  • v0.13.6
  • v0.13.6a1
  • v0.13.6a2
  • v0.13.7
  • v0.13.7a1
  • v0.13.8a1
  • v0.13.8a2
  • v0.14.0
  • v0.14.0a1
  • v0.14.0a2
  • v0.14.0b1
  • v0.14.1
  • v0.14.2
  • v0.14.2a1
  • v0.20.0
  • v0.20.0a1
  • v0.20.0a10
  • v0.20.0a11
  • v0.20.0a12
  • v0.20.0a13
  • v0.20.0a14
  • v0.20.0a15
  • v0.20.0a16
  • v0.20.0a17
  • v0.20.0a18
  • v0.20.0a19
  • v0.20.0a2
  • v0.20.0a20
  • v0.20.0a21
  • v0.20.0a22
  • v0.20.0a23
  • v0.20.0a24
  • v0.20.0a25
  • v0.20.0a26
125 results

Target

Select target project
  • pokapow/duniter
  • pini-gh/duniter
  • elberto2008/duniter
  • diaspogift/duniter
  • d0p1/duniter
  • nodes/typescript/duniter
  • aya/duniter
  • tuxmain/duniter
  • thomasbromehead/duniter
  • Bertrandbenj/duniter
  • Tuxicoman/duniter
  • bpresles/duniter
  • ji_emme/duniter
  • tykayn/duniter
  • 1000i100/duniter
  • 666titi999/duniter
  • blavenie/duniter
17 results
Select Git revision
  • 1.6
  • 1.7
  • 1427_pre-commit
  • 1433-distance-rule-is-not-consistent-between-duniter-1-7-and-1-8
  • bugfix/invalid-rules-distance-sigqty
  • ci_tags
  • dev
  • duniter-v2s-issue-123-industrialize-releases
  • fast-docker-build
  • feature/build-aarch64-nodejs16
  • feature/build-apple-silicon
  • feature/deb-arm-systemd
  • feature/dev-on-windows
  • feature/docker-set-latest
  • feature/dump-distance
  • feature/fast-docker-build-1.8.4
  • feature/node-20
  • feature/oxyde-pow
  • feature/wotwizard-1.8
  • fix/1441/node_summary_with_storage
  • fix/1442/improve_bma_tx_history
  • fix/1448/1.8/txs_not_stored
  • fix/security-vulnerabilities
  • fix/windows-build-electron
  • hotfix/tx-comment-uses-keywords
  • hugo_1.7
  • oxyde-bc-db
  • oxyde-dal
  • oxyde-scrypt
  • pini-1.8-docker
  • pini-docker
  • pini-sync-onlypeers
  • reduce_cpu
  • release/1.8
  • release/1.9
  • release/1.9.1
  • stable
  • sync
  • 0.14.1
  • 0.20.0a21
  • 0.31.0a1
  • 0.99.10
  • 0.99.11
  • 0.99.12
  • 0.99.13
  • 0.99.14
  • 0.99.15
  • 0.99.16
  • 0.99.17
  • 0.99.18
  • 0.99.19
  • 0.99.2
  • 0.99.20
  • 0.99.21
  • 0.99.3
  • 0.99.30
  • 0.99.4
  • 0.99.5
  • 0.99.6
  • 0.99.7
  • 0.99.8
  • 0.99.9
  • 1.6.10
  • 1.6.12
  • 2019.0324.1706
  • 2019.0325.1919
  • 2019.0327.1837
  • 2019.0329.1732
  • 2019.0403.1317
  • 2019.0405.1251
  • 2019.0407.1406
  • 2019.0407.1508
  • v0.0.1
  • v0.0.2
  • v0.0.3
  • v0.0.4
  • v0.0.4.1
  • v0.1.0
  • v0.12-beta
  • v0.12-beta2
  • v0.12-beta3
  • v0.12-beta4
  • v0.12-beta5
  • v0.12-beta6
  • v0.12.0
  • v0.12.1
  • v0.12.10
  • v0.12.2
  • v0.12.3
  • v0.12.4
  • v0.12.5
  • v0.12.6
  • v0.12.7
  • v0.12.8
  • v0.12.9
  • v0.13.0
  • v0.13.1
  • v0.13.2
  • v0.13.3
  • v0.13.4
  • v0.13.4bis
  • v0.13.5
  • v0.13.5a1
  • v0.13.5a2
  • v0.13.6
  • v0.13.6a1
  • v0.13.6a2
  • v0.13.7
  • v0.13.7a1
  • v0.13.8a1
  • v0.13.8a2
  • v0.14.0
  • v0.14.0a1
  • v0.14.0a2
  • v0.14.0b1
  • v0.14.1
  • v0.14.2
  • v0.14.2a1
  • v0.20.0
  • v0.20.0a1
  • v0.20.0a10
  • v0.20.0a11
  • v0.20.0a12
  • v0.20.0a13
  • v0.20.0a14
  • v0.20.0a15
  • v0.20.0a16
  • v0.20.0a17
  • v0.20.0a18
  • v0.20.0a19
  • v0.20.0a2
  • v0.20.0a20
  • v0.20.0a21
  • v0.20.0a22
  • v0.20.0a23
  • v0.20.0a24
  • v0.20.0a25
  • v0.20.0a26
138 results
Show changes
Commits on Source (10)
...@@ -41,6 +41,8 @@ export const ExecuteCommand = () => { ...@@ -41,6 +41,8 @@ export const ExecuteCommand = () => {
.option('--addep <endpoint>', 'With `config` command, add given endpoint to the list of endpoints of this node') .option('--addep <endpoint>', 'With `config` command, add given endpoint to the list of endpoints of this node')
.option('--remep <endpoint>', 'With `config` command, remove given endpoint to the list of endpoints of this node') .option('--remep <endpoint>', 'With `config` command, remove given endpoint to the list of endpoints of this node')
.option('--eco-mode', 'reduce CPU usage for proof-of-work computation')
.option('--no-eco-mode', 'Do not reduce CPU usage for proof-of-work computation')
.option('--cpu <percent>', 'Percent of CPU usage for proof-of-work computation', parsePercent) .option('--cpu <percent>', 'Percent of CPU usage for proof-of-work computation', parsePercent)
.option('--nb-cores <number>', 'Number of cores uses for proof-of-work computation', parseInt) .option('--nb-cores <number>', 'Number of cores uses for proof-of-work computation', parseInt)
.option('--prefix <nodeId>', 'Prefix node id for the first character of nonce', parseInt) .option('--prefix <nodeId>', 'Prefix node id for the first character of nonce', parseInt)
......
...@@ -93,6 +93,16 @@ export class BlockchainContext { ...@@ -93,6 +93,16 @@ export class BlockchainContext {
return local_vHEAD.issuerDiff; return local_vHEAD.issuerDiff;
} }
/**
* Utility method: gives the number of block in the current frame for a given issuer.
* @param issuer The issuer we want.
*/
async getIssuerNbBlockInFrame(issuer: string): Promise<number> {
const local_vHEAD = await this.getvHeadCopy({ issuer })
let issuerNbBlockInFrame = await indexer.preparePersonalizedPoW(local_vHEAD, this.vHEAD_1, (n:number, m:number, p = "") => this.dal.range(n,m,p), this.conf)
return issuerNbBlockInFrame
}
setConfDAL(newConf: any, newDAL: any, theBlockchain: DuniterBlockchain, theQuickSynchronizer: QuickSynchronizer): void { setConfDAL(newConf: any, newDAL: any, theBlockchain: DuniterBlockchain, theQuickSynchronizer: QuickSynchronizer): void {
this.dal = newDAL; this.dal = newDAL;
this.conf = newConf; this.conf = newConf;
......
...@@ -91,6 +91,7 @@ export class ConfDTO implements CurrencyConfDTO, KeypairConfDTO, NetworkConfDTO, ...@@ -91,6 +91,7 @@ export class ConfDTO implements CurrencyConfDTO, KeypairConfDTO, NetworkConfDTO,
public rmEndpoints: string[], public rmEndpoints: string[],
public rootoffset: number, public rootoffset: number,
public upInterval: number, public upInterval: number,
public ecoMode: boolean|undefined,
public cpu: number, public cpu: number,
public nbCores: number, public nbCores: number,
public prefix: number, public prefix: number,
...@@ -162,7 +163,7 @@ export class ConfDTO implements CurrencyConfDTO, KeypairConfDTO, NetworkConfDTO, ...@@ -162,7 +163,7 @@ export class ConfDTO implements CurrencyConfDTO, KeypairConfDTO, NetworkConfDTO,
) {} ) {}
static mock() { static mock() {
return new ConfDTO("", "", [], [], 0, 3600 * 1000, constants.PROOF_OF_WORK.DEFAULT.CPU, 1, constants.PROOF_OF_WORK.DEFAULT.PREFIX, 0, 0, constants.CONTRACT.DEFAULT.C, constants.CONTRACT.DEFAULT.DT, constants.CONTRACT.DEFAULT.DT_REEVAL, 0, constants.CONTRACT.DEFAULT.UD0, 0, 0, constants.CONTRACT.DEFAULT.STEPMAX, constants.CONTRACT.DEFAULT.SIGPERIOD, 0, constants.CONTRACT.DEFAULT.SIGVALIDITY, constants.CONTRACT.DEFAULT.MSVALIDITY, constants.CONTRACT.DEFAULT.SIGQTY, constants.CONTRACT.DEFAULT.SIGSTOCK, constants.CONTRACT.DEFAULT.X_PERCENT, constants.CONTRACT.DEFAULT.PERCENTROT, constants.CONTRACT.DEFAULT.POWDELAY, constants.CONTRACT.DEFAULT.AVGGENTIME, constants.CONTRACT.DEFAULT.MEDIANTIMEBLOCKS, false, 3000, false, constants.BRANCHES.DEFAULT_WINDOW_SIZE, constants.CONTRACT.DEFAULT.IDTYWINDOW, constants.CONTRACT.DEFAULT.MSWINDOW, constants.CONTRACT.DEFAULT.SIGWINDOW, 0, { pub:'', sec:'' }, null, "", "", 0, "", "", "", "", 0, "", "", null, false, "", true, true, false, new ProxiesConf(), undefined) return new ConfDTO("", "", [], [], 0, 3600 * 1000, true, constants.PROOF_OF_WORK.DEFAULT.CPU, 1, constants.PROOF_OF_WORK.DEFAULT.PREFIX, 0, 0, constants.CONTRACT.DEFAULT.C, constants.CONTRACT.DEFAULT.DT, constants.CONTRACT.DEFAULT.DT_REEVAL, 0, constants.CONTRACT.DEFAULT.UD0, 0, 0, constants.CONTRACT.DEFAULT.STEPMAX, constants.CONTRACT.DEFAULT.SIGPERIOD, 0, constants.CONTRACT.DEFAULT.SIGVALIDITY, constants.CONTRACT.DEFAULT.MSVALIDITY, constants.CONTRACT.DEFAULT.SIGQTY, constants.CONTRACT.DEFAULT.SIGSTOCK, constants.CONTRACT.DEFAULT.X_PERCENT, constants.CONTRACT.DEFAULT.PERCENTROT, constants.CONTRACT.DEFAULT.POWDELAY, constants.CONTRACT.DEFAULT.AVGGENTIME, constants.CONTRACT.DEFAULT.MEDIANTIMEBLOCKS, false, 3000, false, constants.BRANCHES.DEFAULT_WINDOW_SIZE, constants.CONTRACT.DEFAULT.IDTYWINDOW, constants.CONTRACT.DEFAULT.MSWINDOW, constants.CONTRACT.DEFAULT.SIGWINDOW, 0, { pub:'', sec:'' }, null, "", "", 0, "", "", "", "", 0, "", "", null, false, "", true, true, false, new ProxiesConf(), undefined)
} }
static defaultConf() { static defaultConf() {
......
...@@ -1092,6 +1092,8 @@ export class Indexer { ...@@ -1092,6 +1092,8 @@ export class Indexer {
HEAD.powRemainder = HEAD.issuerDiff % 16; HEAD.powRemainder = HEAD.issuerDiff % 16;
HEAD.powZeros = (HEAD.issuerDiff - HEAD.powRemainder) / 16; HEAD.powZeros = (HEAD.issuerDiff - HEAD.powRemainder) / 16;
return nbPersonalBlocksInFrame;
} }
// BR_G19 // BR_G19
......
...@@ -18,6 +18,9 @@ export const ProverDependency = { ...@@ -18,6 +18,9 @@ export const ProverDependency = {
/*********** Permanent prover **************/ /*********** Permanent prover **************/
config: { config: {
onLoading: async (conf:ConfDTO) => { onLoading: async (conf:ConfDTO) => {
if (conf.ecoMode === null || conf.ecoMode === undefined) {
conf.ecoMode = ProverConstants.DEFAULT_ECO_MODE;
}
if (conf.cpu === null || conf.cpu === undefined) { if (conf.cpu === null || conf.cpu === undefined) {
conf.cpu = ProverConstants.DEFAULT_CPU; conf.cpu = ProverConstants.DEFAULT_CPU;
} }
......
...@@ -48,6 +48,14 @@ export class WorkerFarm { ...@@ -48,6 +48,14 @@ export class WorkerFarm {
return this.theEngine.getNbWorkers() return this.theEngine.getNbWorkers()
} }
reduceNbCores() {
return this.theEngine.reduceNbCores()
}
boostCPU(){
return this.theEngine.boostCPU()
}
changeCPU(cpu:any) { changeCPU(cpu:any) {
return this.theEngine.setConf({ cpu }) return this.theEngine.setConf({ cpu })
} }
...@@ -179,6 +187,7 @@ export class BlockProver { ...@@ -179,6 +187,7 @@ export class BlockProver {
let result = await powFarm.askNewProof({ let result = await powFarm.askNewProof({
newPoW: { newPoW: {
conf: { conf: {
nbCores: this.conf.nbCores,
cpu: this.conf.cpu, cpu: this.conf.cpu,
prefix: this.conf.prefix, prefix: this.conf.prefix,
avgGenTime: this.conf.avgGenTime, avgGenTime: this.conf.avgGenTime,
...@@ -193,6 +202,14 @@ export class BlockProver { ...@@ -193,6 +202,14 @@ export class BlockProver {
}); });
if (!result) { if (!result) {
this.logger.info('GIVEN proof-of-work for block#%s with %s leading zeros followed by [0-' + highMark + ']! stop PoW for %s', block.number, nbZeros, this.pair && this.pair.pub.slice(0,6)); this.logger.info('GIVEN proof-of-work for block#%s with %s leading zeros followed by [0-' + highMark + ']! stop PoW for %s', block.number, nbZeros, this.pair && this.pair.pub.slice(0,6));
if(this.conf.ecoMode === true) {
let selfNbBlockInFrame = await this.server.getBcContext().getIssuerNbBlockInFrame(this.server.PeeringService.selfPubkey)
if(selfNbBlockInFrame < 2) {
this.boostCPU()
this.conf.nbCores = powFarm.nbWorkers
this.logger.info("Boost number of CPU cores "+powFarm.nbWorkers+" with only "+selfNbBlockInFrame+" block member in frame")
}
}
throw 'Proof-of-work computation canceled because block received'; throw 'Proof-of-work computation canceled because block received';
} else { } else {
const proof = result.block; const proof = result.block;
...@@ -201,13 +218,44 @@ export class BlockProver { ...@@ -201,13 +218,44 @@ export class BlockProver {
const testsPerSecond = testsCount / (duration / 1000) const testsPerSecond = testsCount / (duration / 1000)
this.logger.info('Done: #%s, %s in %ss (~%s tests, ~%s tests/s, using %s cores, CPU %s%)', block.number, proof.hash, (duration / 1000).toFixed(2), testsCount, testsPerSecond.toFixed(2), powFarm.nbWorkers, Math.floor(100*this.conf.cpu)) this.logger.info('Done: #%s, %s in %ss (~%s tests, ~%s tests/s, using %s cores, CPU %s%)', block.number, proof.hash, (duration / 1000).toFixed(2), testsCount, testsPerSecond.toFixed(2), powFarm.nbWorkers, Math.floor(100*this.conf.cpu))
this.logger.info('FOUND proof-of-work with %s leading zeros followed by [0-' + highMark + ']!', nbZeros); this.logger.info('FOUND proof-of-work with %s leading zeros followed by [0-' + highMark + ']!', nbZeros);
if(this.conf.ecoMode === true) {
let selfNbBlockInFrame = await this.server.getBcContext().getIssuerNbBlockInFrame(this.server.PeeringService.selfPubkey)
if(selfNbBlockInFrame < 2) {
this.boostCPU()
this.conf.nbCores = powFarm.nbWorkers
this.logger.info("Boost number of CPU cores "+powFarm.nbWorkers+" with only "+selfNbBlockInFrame+" block member in frame")
}
else if(testsPerSecond > ProverConstants.ECO_MODE_MINIMAL_TESTS_PER_SECONDS) {
if(powFarm.nbWorkers > 1) {
this.logger.info("Reducing number of CPU cores "+powFarm.nbWorkers)
this.reduceNbCores()
this.conf.nbCores = powFarm.nbWorkers
}
else if(this.conf.cpu > ProverConstants.ECO_MODE_MINIMAL_CPU){
let cpu:number = this.conf.cpu - 0.1
this.logger.info("Slowing down the CPU to "+cpu)
this.changeCPU(cpu)
}
}
}
return BlockDTO.fromJSONObject(proof) return BlockDTO.fromJSONObject(proof)
} }
})() })()
}; };
async reduceNbCores() {
const farm = await this.getWorker()
return farm.reduceNbCores()
}
async boostCPU() {
this.conf.cpu = 1.0
const farm = await this.getWorker()
return farm.boostCPU()
}
async changeCPU(cpu:number) { async changeCPU(cpu:number) {
this.conf.cpu = cpu; this.conf.cpu = Math.max(0.01, Math.min(1.0, cpu));
const farm = await this.getWorker() const farm = await this.getWorker()
return farm.changeCPU(cpu) return farm.changeCPU(cpu)
} }
......
...@@ -5,11 +5,15 @@ export const ProverConstants = { ...@@ -5,11 +5,15 @@ export const ProverConstants = {
MINIMAL_ZEROS_TO_SHOW_IN_LOGS: 3, MINIMAL_ZEROS_TO_SHOW_IN_LOGS: 3,
POW_MINIMAL_TO_SHOW: 2, POW_MINIMAL_TO_SHOW: 2,
DEFAULT_ECO_MODE: true,
DEFAULT_CPU: 0.6, DEFAULT_CPU: 0.6,
DEFAULT_PEER_ID: 1, DEFAULT_PEER_ID: 1,
MIN_PEER_ID: 1, MIN_PEER_ID: 1,
MAX_PEER_ID: 899, // Due to MAX_SAFE_INTEGER = 9007199254740991 (16 digits, and we use 11 digits for the nonce + 2 digits for core number => 3 digits for the peer, must be below 900) MAX_PEER_ID: 899, // Due to MAX_SAFE_INTEGER = 9007199254740991 (16 digits, and we use 11 digits for the nonce + 2 digits for core number => 3 digits for the peer, must be below 900)
ECO_MODE_MINIMAL_TESTS_PER_SECONDS: 300,
ECO_MODE_MINIMAL_CPU: 0.19,
NONCE_RANGE: 1000 * 1000 * 1000 * 100, NONCE_RANGE: 1000 * 1000 * 1000 * 100,
POW_MAXIMUM_ACCEPTABLE_HANDICAP: 64, POW_MAXIMUM_ACCEPTABLE_HANDICAP: 64,
......
...@@ -12,15 +12,12 @@ if(debug) { ...@@ -12,15 +12,12 @@ if(debug) {
export class PowEngine { export class PowEngine {
private nbWorkers:number
private cluster:PowCluster private cluster:PowCluster
readonly id:number readonly id:number
constructor(private conf:ConfDTO, logger:any) { constructor(private conf:ConfDTO, logger:any) {
// We use as much cores as available, but not more than CORES_MAXIMUM_USE_IN_PARALLEL // We use as much cores as available, but not more than CORES_MAXIMUM_USE_IN_PARALLEL
this.nbWorkers = conf.nbCores this.cluster = new PowCluster(conf.nbCores, logger)
this.cluster = new PowCluster(this.nbWorkers, logger)
this.id = this.cluster.clusterId this.id = this.cluster.clusterId
} }
...@@ -41,6 +38,14 @@ export class PowEngine { ...@@ -41,6 +38,14 @@ export class PowEngine {
return this.cluster.cancelWork() return this.cluster.cancelWork()
} }
reduceNbCores() {
return this.cluster.removeSlave()
}
boostCPU() {
return this.cluster.boostCPU()
}
setConf(value:any) { setConf(value:any) {
return this.cluster.changeConf(value) return this.cluster.changeConf(value)
} }
......
...@@ -35,6 +35,7 @@ export class Master { ...@@ -35,6 +35,7 @@ export class Master {
logger:any logger:any
onInfoCallback:any onInfoCallback:any
workersOnline:Promise<any>[] workersOnline:Promise<any>[]
maxNbCores:number = Math.min(ProverConstants.CORES_MAXIMUM_USE_IN_PARALLEL, require('os').cpus().length)
constructor(private nbCores:number, logger:any) { constructor(private nbCores:number, logger:any) {
this.clusterId = clusterId++ this.clusterId = clusterId++
...@@ -65,18 +66,7 @@ export class Master { ...@@ -65,18 +66,7 @@ export class Master {
// this.logger.debug(`ENGINE c#${this.clusterId}#${this.slavesMap[worker.id].index}:`, message) // this.logger.debug(`ENGINE c#${this.clusterId}#${this.slavesMap[worker.id].index}:`, message)
} }
/***************** createSlave(index:number) {
* CLUSTER METHODS
****************/
initCluster() {
// Setup master
cluster.setupMaster({
exec: __filename,
execArgv: [] // Do not try to debug forks
})
this.slaves = Array.from({ length: this.nbCores }).map((value, index) => {
const nodejsWorker = cluster.fork() const nodejsWorker = cluster.fork()
const worker = new PowWorker(nodejsWorker, message => { const worker = new PowWorker(nodejsWorker, message => {
this.onWorkerMessage(index, message) this.onWorkerMessage(index, message)
...@@ -107,6 +97,38 @@ export class Master { ...@@ -107,6 +97,38 @@ export class Master {
} }
this.slavesMap[nodejsWorker.id] = slave this.slavesMap[nodejsWorker.id] = slave
return slave return slave
}
boostCPU() {
if(this.nbWorkers < this.maxNbCores) {
while(this.nbWorkers < this.maxNbCores) {
this.slaves.push(this.createSlave(this.nbWorkers))
}
}
let conf:any = {cpu: 1}
this.changeConf(conf)
}
async removeSlave() {
let nb_workers = this.nbWorkers
await this.slaves[nb_workers-1].worker.kill()
this.slaves.pop()
this.logger.info('Remove slave number '+ (nb_workers-1))
}
/*****************
* CLUSTER METHODS
****************/
initCluster() {
// Setup master
cluster.setupMaster({
exec: __filename,
execArgv: [] // Do not try to debug forks
})
this.slaves = Array.from({ length: this.nbCores }).map((value, index) => {
return this.createSlave(index)
}) })
this.workersOnline = this.slaves.map((s) => s.online) this.workersOnline = this.slaves.map((s) => s.online)
......
...@@ -457,6 +457,8 @@ function commandLineConf(program:any, conf:any = {}) { ...@@ -457,6 +457,8 @@ function commandLineConf(program:any, conf:any = {}) {
conf = conf || {}; conf = conf || {};
const cli = { const cli = {
currency: program.currency, currency: program.currency,
ecoMode: program.ecoMode,
noEcoMode: program.noEcoMode,
cpu: program.cpu, cpu: program.cpu,
nbCores: program.nbCores, nbCores: program.nbCores,
prefix: program.prefix, prefix: program.prefix,
...@@ -499,6 +501,8 @@ function commandLineConf(program:any, conf:any = {}) { ...@@ -499,6 +501,8 @@ function commandLineConf(program:any, conf:any = {}) {
// Update the rest of the conf // Update the rest of the conf
if (cli.currency) conf.currency = cli.currency; if (cli.currency) conf.currency = cli.currency;
if (cli.server.port) conf.port = cli.server.port; if (cli.server.port) conf.port = cli.server.port;
if (cli.ecoMode) conf.ecoMode = true
if (cli.noEcoMode) conf.ecoMode = false
if (cli.cpu) conf.cpu = Math.max(0.01, Math.min(1.0, cli.cpu)); if (cli.cpu) conf.cpu = Math.max(0.01, Math.min(1.0, cli.cpu));
if (cli.prefix) conf.prefix = Math.max(ProverConstants.MIN_PEER_ID, Math.min(ProverConstants.MAX_PEER_ID, cli.prefix)); if (cli.prefix) conf.prefix = Math.max(ProverConstants.MIN_PEER_ID, Math.min(ProverConstants.MAX_PEER_ID, cli.prefix));
if (cli.logs.http) conf.httplogs = true; if (cli.logs.http) conf.httplogs = true;
......
...@@ -16,13 +16,15 @@ keyring from Key ...@@ -16,13 +16,15 @@ keyring from Key
***/ ***/
const intermediateProofs = []; const intermediateProofs = [];
const NB_CORES_FOR_COMPUTATION = 1 // For simple tests. Can be changed to test multiple cores. const NB_CORES_FOR_COMPUTATION = 2 // For simple tests. Can be changed to test multiple cores.
const prover = new BlockProver({ const prover = new BlockProver({
push: (data) => intermediateProofs.push(data), push: (data) => intermediateProofs.push(data),
conf: { conf: {
avgGenTime: 20,//1*60,
ecoMode: true,
nbCores: NB_CORES_FOR_COMPUTATION, nbCores: NB_CORES_FOR_COMPUTATION,
cpu: 1.0, // 80%, cpu: 0.8, // 80%,
pair: { pair: {
pub: 'HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd', pub: 'HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd',
sec: '51w4fEShBk1jCMauWu4mLpmDVfHksKmWcygpxriqCEZizbtERA6de4STKRkQBpxmMUwsKXRjSzuQ8ECwmqN1u2DP' sec: '51w4fEShBk1jCMauWu4mLpmDVfHksKmWcygpxriqCEZizbtERA6de4STKRkQBpxmMUwsKXRjSzuQ8ECwmqN1u2DP'
...@@ -34,6 +36,7 @@ const prover = new BlockProver({ ...@@ -34,6 +36,7 @@ const prover = new BlockProver({
const now = 1474382274 * 1000; const now = 1474382274 * 1000;
const MUST_START_WITH_A_ZERO = 16; const MUST_START_WITH_A_ZERO = 16;
const MUST_START_WITH_TWO_ZEROS = 32; const MUST_START_WITH_TWO_ZEROS = 32;
const MUST_START_WITH_A_ZERO_AND_A_NUMBER = 22
describe("Proof-of-work", function() { describe("Proof-of-work", function() {
...@@ -48,6 +51,21 @@ describe("Proof-of-work", function() { ...@@ -48,6 +51,21 @@ describe("Proof-of-work", function() {
intermediateProofs[intermediateProofs.length - 1].pow.should.have.property('hash').equal(block.hash); intermediateProofs[intermediateProofs.length - 1].pow.should.have.property('hash').equal(block.hash);
})); }));
it('should be reducing cpu when the PoW is too easy for the cpu', () => co(function*() {
prover.conf.nbCores = 2
prover.conf.cpu = 0.9
prover.conf.nbCores.should.equal(2)
prover.conf.cpu.should.equal(0.9)
for(let i=0; i<8; ++i) {
yield prover.prove({
issuer: 'HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd',
number: i+2,
now
}, MUST_START_WITH_A_ZERO_AND_A_NUMBER, now);
}
prover.conf.nbCores.should.equal(1)
prover.conf.cpu.should.be.below(0.9)
}));
// Too randomly successing test // Too randomly successing test
// it('should be able to cancel a proof-of-work on other PoW receival', () => co(function*() { // it('should be able to cancel a proof-of-work on other PoW receival', () => co(function*() {
// const now = 1474464489; // const now = 1474464489;
......