first commit
This commit is contained in:
19
.gitignore
vendored
Normal file
19
.gitignore
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
.DS_Store
|
||||
node_modules/
|
||||
dist/*
|
||||
dist
|
||||
build
|
||||
.vscode
|
||||
*.log
|
||||
*.rar
|
||||
*.zip
|
||||
.svn/*
|
||||
obj/*
|
||||
*.bak
|
||||
config.js
|
||||
**/env/prod.js
|
||||
note.txt
|
||||
term.txt
|
||||
/coverage
|
||||
coverage.json
|
||||
temp
|
||||
111
README.md
Normal file
111
README.md
Normal file
@@ -0,0 +1,111 @@
|
||||
## Create Genesis Block Proof with Node.js
|
||||
|
||||
|
||||
## setup
|
||||
|
||||
```js
|
||||
git clone https://github.com/nasa8x/node-genesis-block.git genesis-block
|
||||
cd genesis-block
|
||||
npm install
|
||||
```
|
||||
|
||||
## help
|
||||
|
||||
```js
|
||||
Options:
|
||||
-t TIME, --time=TIME the (unix) time when the genesisblock is created
|
||||
-z TIMESTAMP, --timestamp=TIMESTAMP
|
||||
the pszTimestamp found in the coinbase of the genesisblock
|
||||
-n NONCE, --nonce=NONCE
|
||||
the first value of the nonce that will be incremented
|
||||
when searching the genesis hash
|
||||
-a ALGORITHM, --algorithm=ALGORITHM
|
||||
the PoW algorithm: [x11|neoscrypt|quark|qubit|keccak|lyra2re]
|
||||
-p PUBKEY, --pubkey=PUBKEY
|
||||
the pubkey found in the output script
|
||||
-v VALUE, --value=VALUE
|
||||
the value in coins for the output, full value (exp. in bitcoin 5000000000 - To get other coins value: Block Value * 100000000)
|
||||
-b BITS, --bits=BITS
|
||||
the target in compact representation, associated to a difficulty of 1
|
||||
```
|
||||
|
||||
|
||||
## algorithms
|
||||
----------
|
||||
* x11
|
||||
* x13
|
||||
* x15
|
||||
* x16r
|
||||
* nist5
|
||||
* neoscrypt
|
||||
* scrypt
|
||||
* keccak
|
||||
* quark
|
||||
* bcrypt
|
||||
* skein
|
||||
* groestl
|
||||
* groestlmyriad
|
||||
* blake
|
||||
* fugue
|
||||
* qubit
|
||||
* hefty1
|
||||
* shavite3
|
||||
* cryptonight
|
||||
* boolberry
|
||||
* yescrypt
|
||||
* fresh
|
||||
|
||||
|
||||
## x11
|
||||
|
||||
```js
|
||||
node genesis -a x11 -z "Don't work for weekends, work for our goals - 18/Jan/2018." -p "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"
|
||||
|
||||
// result:
|
||||
algorithm: x11
|
||||
pzTimestamp: Don't work for weekends, work for our goals - 18/Jan/2018.
|
||||
pubkey: 04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f
|
||||
bits: 504365040
|
||||
time: 1521537891
|
||||
merkle root hash: 77fc7d6cfbc4ec91703444a515955092d4b7c04dbb8f23be59deb42a39ec0057
|
||||
Searching for genesis hash...
|
||||
nonce: 1827816
|
||||
genesis hash: 0000084e98003628c45719136940cf7068805f4024419a51d6259fb676c299da
|
||||
|
||||
```
|
||||
|
||||
|
||||
## Genesis Block Proof of Work for Keccak Algorithms.
|
||||
|
||||
```js
|
||||
python gen.py -a keccak -t 1517542208 -z "Don't work for weekends, work for our goals - 18/Jan/2018." -p "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"
|
||||
|
||||
```
|
||||
|
||||
## Genesis Block Proof of Work for NeoScrypt Algorithms.
|
||||
|
||||
```js
|
||||
python gen.py -a neoscript -t 1517542208 -z "Don't work for weekends, work for our goals - 18/Jan/2018." -p "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"
|
||||
|
||||
```
|
||||
|
||||
## Genesis Block Proof of Work for Qubit Algorithms.
|
||||
|
||||
```js
|
||||
python gen.py -a qubit -t 1517542208 -z "Don't work for weekends, work for our goals - 18/Jan/2018." -p "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"
|
||||
|
||||
```
|
||||
|
||||
## Genesis Block Proof of Work for Quark Algorithms.
|
||||
|
||||
```js
|
||||
python gen.py -a quark -t 1517542208 -z "Don't work for weekends, work for our goals - 18/Jan/2018." -p "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"
|
||||
|
||||
```
|
||||
|
||||
## Genesis Block Proof of Work for Lyra2re Algorithms.
|
||||
|
||||
```js
|
||||
python gen.py -a lyra2re -t 1517542208 -z "Don't work for weekends, work for our goals - 18/Jan/2018." -p "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"
|
||||
|
||||
```
|
||||
162
genesis.js
Normal file
162
genesis.js
Normal file
@@ -0,0 +1,162 @@
|
||||
|
||||
|
||||
var $ = require("./utils");
|
||||
var Hash = require('multi-hashing');
|
||||
|
||||
var defaults = {
|
||||
//the (unix) time when the genesisblock is created
|
||||
time: Math.round((new Date()).getTime() / 1000),
|
||||
//the pszTimestamp found in the coinbase of the genesisblock
|
||||
timestamp: "Don't work for weekends, work for our goals.",
|
||||
//the first value of the nonce that will be incremented when searching the genesis hash
|
||||
nonce: 1,
|
||||
//the PoW algorithm: [x11|x13|x15|geek|quark|keccak|qubit|neoscrypt|lyra2re...]
|
||||
algorithm: 'geek',
|
||||
//the pubkey found in the output script
|
||||
pubkey: '04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f',
|
||||
//the value in coins for the output, full value (exp. in bitcoin 5000000000 - To get other coins value: Block Value * 100000000)
|
||||
value: 5000000000,
|
||||
//the target in compact representation, associated to a difficulty of 1
|
||||
bits: 0x1e0ffff0,
|
||||
locktime: 0
|
||||
}
|
||||
|
||||
const argv = require('yargs')
|
||||
.alias('t', 'time')
|
||||
.alias('z', 'timestamp')
|
||||
.alias('n', 'nonce')
|
||||
.alias('a', 'algorithm')
|
||||
.alias('p', 'pubkey')
|
||||
.alias('v', 'value')
|
||||
.alias('b', 'bits')
|
||||
.alias('l', 'locktime')
|
||||
.alias('h', 'help')
|
||||
.help()
|
||||
.command('*', 'create genesis block', () => { }, (argv) => {
|
||||
//console.log(argv);
|
||||
var options = Object.assign({}, defaults, argv);
|
||||
//console.log(options);
|
||||
|
||||
var merkle_root = $.sha256d(createTx(options));
|
||||
var genesisblock = createBlock(merkle_root, options);
|
||||
console.log("---------------");
|
||||
console.log("algorithm: %s", options.algorithm);
|
||||
console.log("pzTimestamp: %s", options.timestamp);
|
||||
console.log("pubkey: %s", options.pubkey);
|
||||
console.log("bits: %s", options.bits);
|
||||
console.log("time: %s", options.time);
|
||||
console.log("merkle root hash: %s", $.reverseBuffer(merkle_root).toString('hex'));
|
||||
|
||||
PoW(genesisblock, options);
|
||||
//console.log("genesis block: %s", genesisblock.toString('hex'));
|
||||
// console.log($.reverseBuffer(hash_merkle_root).toString('hex'));
|
||||
|
||||
})
|
||||
.argv;
|
||||
|
||||
|
||||
function createInputScript(options) {
|
||||
var tz = options.timestamp;
|
||||
var psz_prefix = tz.length > 76 ? '4c' : '';
|
||||
var script_prefix = '04ffff001d0104' + psz_prefix + Buffer.from(String.fromCharCode(tz.length)).toString('hex');
|
||||
return Buffer.from(script_prefix + Buffer.from(tz).toString('hex'), 'hex');
|
||||
}
|
||||
|
||||
function createOutputScript(options) {
|
||||
return Buffer.from('41' + options.pubkey + 'ac', 'hex');
|
||||
}
|
||||
|
||||
|
||||
function createTx(options) {
|
||||
|
||||
var input = createInputScript(options);
|
||||
var out = createOutputScript(options);
|
||||
|
||||
var size = 4 // tx version
|
||||
+ 1 // number of inputs
|
||||
+ 32 // hash of previous output
|
||||
+ 4 // previous output's index
|
||||
+ 1 // 1 byte for the size of scriptSig
|
||||
+ input.length
|
||||
+ 4 // size of sequence
|
||||
+ 1 // number of outputs
|
||||
+ 8 // 8 bytes for coin value
|
||||
+ 1 // 1 byte to represent size of the pubkey Script
|
||||
+ out.length
|
||||
+ 4; // 4 bytes for lock time
|
||||
|
||||
|
||||
var tx = Buffer.alloc(size);
|
||||
var position = 0;
|
||||
tx.writeIntLE(1, position, true);
|
||||
tx.writeIntLE(1, position += 4, true);
|
||||
tx.write(new Buffer(32).toString('hex'), position += 1, 32, 'hex');
|
||||
tx.writeInt32LE(0xFFFFFFFF, position += 32, true);
|
||||
tx.writeIntLE(input.length, position += 4, true);
|
||||
tx.write(input.toString('hex'), position += 1, input.length, "hex");
|
||||
tx.writeInt32LE(0xFFFFFFFF, position += input.length, true);
|
||||
tx.writeIntLE(1, position += 4);
|
||||
tx.write(Buffer.from($.numToBytes(options.value)).toString('hex'), position += 1, 8, 'hex'); // 50 * coin
|
||||
tx.writeInt32LE(0x43, position += 8);
|
||||
//tx.write(input.toString('hex'), position += 1, input.length, "hex");
|
||||
tx.write(out.toString('hex'), position += 1, out.length, "hex");
|
||||
tx.writeIntLE(options.locktime, position += out.length);
|
||||
|
||||
|
||||
//console.log(tx.toString('hex'));
|
||||
|
||||
return tx;
|
||||
|
||||
};
|
||||
|
||||
|
||||
function createBlock(merkleRoot, options) {
|
||||
|
||||
var block = Buffer.alloc(80);
|
||||
var position = 0;
|
||||
|
||||
block.writeIntLE(1, position); //version
|
||||
block.write(new Buffer(32).toString('hex'), position += 4, 32, 'hex'); //previousblockhash
|
||||
block.write(merkleRoot.toString('hex'), position += 32, 32, 'hex');
|
||||
block.writeInt32LE(options.time, position += 32);
|
||||
//block.write(Buffer.from($.numToBytes(options.time)).toString('hex'), position += 32, 4, 'hex');
|
||||
|
||||
block.writeInt32LE(options.bits, position += 4);
|
||||
//block.write(Buffer.from($.numToBytes(options.bits)).toString('hex'), position += 4, 4, 'hex');
|
||||
|
||||
block.writeIntLE(options.nonce, position += 4);
|
||||
|
||||
return block;
|
||||
|
||||
};
|
||||
|
||||
function PoW(data, options) {
|
||||
|
||||
console.log('Searching for genesis hash...');
|
||||
var nonce = options.nonce;
|
||||
|
||||
//var target = $.numToBytes((options.bits & 0xffffff) * 2 ** (8 * ((options.bits >> 24) - 3)));
|
||||
// console.log('' + target.toString('hex'));
|
||||
|
||||
while (true) {
|
||||
|
||||
var hash = $.reverseBuffer(Hash[options.algorithm](data)).toString('hex');
|
||||
// var hash2 = $.reverseBuffer(hash).toString('hex');
|
||||
// var val = parseInt(hash2, 16);
|
||||
|
||||
if (hash.match(/^00000/)) {
|
||||
console.log("nonce: %s", nonce);
|
||||
console.log("genesis hash: %s", hash);
|
||||
return;
|
||||
} else {
|
||||
|
||||
nonce += 1;
|
||||
// if (nonce % 2000 == 0) {
|
||||
// console.log("nonce: %s | hash: %s ", nonce, hash.toString('hex'));
|
||||
// }
|
||||
data.writeInt32LE(nonce, data.length - 4);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
399
package-lock.json
generated
Normal file
399
package-lock.json
generated
Normal file
@@ -0,0 +1,399 @@
|
||||
{
|
||||
"name": "genesis-block",
|
||||
"version": "1.0.0",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"ansi-regex": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
|
||||
"integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
|
||||
},
|
||||
"bignumber.js": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-6.0.0.tgz",
|
||||
"integrity": "sha512-x247jIuy60/+FtMRvscqfxtVHQf8AGx2hm9c6btkgC0x/hp9yt+teISNhvF8WlwRkCc5yF2fDECH8SIMe8j+GA=="
|
||||
},
|
||||
"bindings": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz",
|
||||
"integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw=="
|
||||
},
|
||||
"bn.js": {
|
||||
"version": "4.11.8",
|
||||
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
|
||||
"integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="
|
||||
},
|
||||
"bytebuffer": {
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz",
|
||||
"integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=",
|
||||
"requires": {
|
||||
"long": "3.2.0"
|
||||
}
|
||||
},
|
||||
"camelcase": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
|
||||
"integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
|
||||
},
|
||||
"cliui": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/cliui/-/cliui-4.0.0.tgz",
|
||||
"integrity": "sha512-nY3W5Gu2racvdDk//ELReY+dHjb9PlIcVDFXP72nVIhq2Gy3LuVXYwJoPVudwQnv1shtohpgkdCKT2YaKY0CKw==",
|
||||
"requires": {
|
||||
"string-width": "2.1.1",
|
||||
"strip-ansi": "4.0.0",
|
||||
"wrap-ansi": "2.1.0"
|
||||
}
|
||||
},
|
||||
"code-point-at": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
|
||||
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
|
||||
},
|
||||
"cross-spawn": {
|
||||
"version": "5.1.0",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
|
||||
"integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
|
||||
"requires": {
|
||||
"lru-cache": "4.1.2",
|
||||
"shebang-command": "1.2.0",
|
||||
"which": "1.3.0"
|
||||
}
|
||||
},
|
||||
"crypto": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz",
|
||||
"integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig=="
|
||||
},
|
||||
"decamelize": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
|
||||
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
|
||||
},
|
||||
"execa": {
|
||||
"version": "0.7.0",
|
||||
"resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
|
||||
"integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
|
||||
"requires": {
|
||||
"cross-spawn": "5.1.0",
|
||||
"get-stream": "3.0.0",
|
||||
"is-stream": "1.1.0",
|
||||
"npm-run-path": "2.0.2",
|
||||
"p-finally": "1.0.0",
|
||||
"signal-exit": "3.0.2",
|
||||
"strip-eof": "1.0.0"
|
||||
}
|
||||
},
|
||||
"find-up": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
|
||||
"integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
|
||||
"requires": {
|
||||
"locate-path": "2.0.0"
|
||||
}
|
||||
},
|
||||
"get-caller-file": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
|
||||
"integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U="
|
||||
},
|
||||
"get-stream": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
|
||||
"integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
|
||||
},
|
||||
"invert-kv": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
|
||||
"integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY="
|
||||
},
|
||||
"is-fullwidth-code-point": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
|
||||
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
|
||||
},
|
||||
"is-stream": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
|
||||
"integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
|
||||
},
|
||||
"isexe": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
|
||||
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
|
||||
},
|
||||
"lcid": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
|
||||
"integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
|
||||
"requires": {
|
||||
"invert-kv": "1.0.0"
|
||||
}
|
||||
},
|
||||
"locate-path": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
|
||||
"integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
|
||||
"requires": {
|
||||
"p-locate": "2.0.0",
|
||||
"path-exists": "3.0.0"
|
||||
}
|
||||
},
|
||||
"long": {
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz",
|
||||
"integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s="
|
||||
},
|
||||
"lru-cache": {
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz",
|
||||
"integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==",
|
||||
"requires": {
|
||||
"pseudomap": "1.0.2",
|
||||
"yallist": "2.1.2"
|
||||
}
|
||||
},
|
||||
"mem": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
|
||||
"integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
|
||||
"requires": {
|
||||
"mimic-fn": "1.2.0"
|
||||
}
|
||||
},
|
||||
"mimic-fn": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
|
||||
"integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
|
||||
},
|
||||
"multi-hashing": {
|
||||
"version": "git+https://github.com/nasa8x/node-multi-hashing.git#d04972dd1dfa014f18a6c032199bf7239ed98d5f",
|
||||
"requires": {
|
||||
"bignumber.js": "6.0.0",
|
||||
"bindings": "1.3.0",
|
||||
"bn.js": "4.11.8",
|
||||
"bytebuffer": "5.0.1",
|
||||
"nan": "2.10.0",
|
||||
"yargs": "11.0.0"
|
||||
}
|
||||
},
|
||||
"nan": {
|
||||
"version": "2.10.0",
|
||||
"resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
|
||||
"integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA=="
|
||||
},
|
||||
"npm-run-path": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
|
||||
"integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
|
||||
"requires": {
|
||||
"path-key": "2.0.1"
|
||||
}
|
||||
},
|
||||
"number-is-nan": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
|
||||
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
|
||||
},
|
||||
"os-locale": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
|
||||
"integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
|
||||
"requires": {
|
||||
"execa": "0.7.0",
|
||||
"lcid": "1.0.0",
|
||||
"mem": "1.1.0"
|
||||
}
|
||||
},
|
||||
"p-finally": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
|
||||
"integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
|
||||
},
|
||||
"p-limit": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz",
|
||||
"integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==",
|
||||
"requires": {
|
||||
"p-try": "1.0.0"
|
||||
}
|
||||
},
|
||||
"p-locate": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
|
||||
"integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
|
||||
"requires": {
|
||||
"p-limit": "1.2.0"
|
||||
}
|
||||
},
|
||||
"p-try": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
|
||||
"integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
|
||||
},
|
||||
"path-exists": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
|
||||
"integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
|
||||
},
|
||||
"path-key": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
|
||||
"integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
|
||||
},
|
||||
"pseudomap": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
|
||||
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
|
||||
},
|
||||
"require-directory": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
|
||||
"integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
|
||||
},
|
||||
"require-main-filename": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
|
||||
"integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
|
||||
},
|
||||
"set-blocking": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
|
||||
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
|
||||
},
|
||||
"shebang-command": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
|
||||
"integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
|
||||
"requires": {
|
||||
"shebang-regex": "1.0.0"
|
||||
}
|
||||
},
|
||||
"shebang-regex": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
|
||||
"integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
|
||||
},
|
||||
"signal-exit": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
|
||||
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
|
||||
},
|
||||
"string-width": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
|
||||
"integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
|
||||
"requires": {
|
||||
"is-fullwidth-code-point": "2.0.0",
|
||||
"strip-ansi": "4.0.0"
|
||||
}
|
||||
},
|
||||
"strip-ansi": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
|
||||
"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
|
||||
"requires": {
|
||||
"ansi-regex": "3.0.0"
|
||||
}
|
||||
},
|
||||
"strip-eof": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
|
||||
"integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
|
||||
},
|
||||
"which": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
|
||||
"integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
|
||||
"requires": {
|
||||
"isexe": "2.0.0"
|
||||
}
|
||||
},
|
||||
"which-module": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
|
||||
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
|
||||
},
|
||||
"wrap-ansi": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
|
||||
"integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
|
||||
"requires": {
|
||||
"string-width": "1.0.2",
|
||||
"strip-ansi": "3.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"ansi-regex": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
|
||||
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
|
||||
},
|
||||
"is-fullwidth-code-point": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
|
||||
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
|
||||
"requires": {
|
||||
"number-is-nan": "1.0.1"
|
||||
}
|
||||
},
|
||||
"string-width": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
|
||||
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
|
||||
"requires": {
|
||||
"code-point-at": "1.1.0",
|
||||
"is-fullwidth-code-point": "1.0.0",
|
||||
"strip-ansi": "3.0.1"
|
||||
}
|
||||
},
|
||||
"strip-ansi": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
|
||||
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
|
||||
"requires": {
|
||||
"ansi-regex": "2.1.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"y18n": {
|
||||
"version": "3.2.1",
|
||||
"resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
|
||||
"integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
|
||||
},
|
||||
"yallist": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
|
||||
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
|
||||
},
|
||||
"yargs": {
|
||||
"version": "11.0.0",
|
||||
"resolved": "https://registry.npmjs.org/yargs/-/yargs-11.0.0.tgz",
|
||||
"integrity": "sha512-Rjp+lMYQOWtgqojx1dEWorjCofi1YN7AoFvYV7b1gx/7dAAeuI4kN5SZiEvr0ZmsZTOpDRcCqrpI10L31tFkBw==",
|
||||
"requires": {
|
||||
"cliui": "4.0.0",
|
||||
"decamelize": "1.2.0",
|
||||
"find-up": "2.1.0",
|
||||
"get-caller-file": "1.0.2",
|
||||
"os-locale": "2.1.0",
|
||||
"require-directory": "2.1.1",
|
||||
"require-main-filename": "1.0.1",
|
||||
"set-blocking": "2.0.0",
|
||||
"string-width": "2.1.1",
|
||||
"which-module": "2.0.0",
|
||||
"y18n": "3.2.1",
|
||||
"yargs-parser": "9.0.2"
|
||||
}
|
||||
},
|
||||
"yargs-parser": {
|
||||
"version": "9.0.2",
|
||||
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz",
|
||||
"integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=",
|
||||
"requires": {
|
||||
"camelcase": "4.1.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
27
package.json
Normal file
27
package.json
Normal file
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"name": "genesis-block",
|
||||
"version": "1.0.0",
|
||||
"description": "Create Genesis Block Proof of Work for Bitcoin, Dash, Litecoin, Zcash...",
|
||||
"main": "genesis.js",
|
||||
"scripts": {
|
||||
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/nasa8x/node-genesis-block.git"
|
||||
},
|
||||
"keywords": [
|
||||
"genesisblock"
|
||||
],
|
||||
"author": "Nasa8x",
|
||||
"license": "MIT",
|
||||
"bugs": {
|
||||
"url": "https://github.com/nasa8x/node-genesis-block/issues"
|
||||
},
|
||||
"homepage": "https://github.com/nasa8x/node-genesis-block#readme",
|
||||
"dependencies": {
|
||||
"multi-hashing": "https://github.com/nasa8x/node-multi-hashing.git",
|
||||
"crypto": "^1.0.1"
|
||||
}
|
||||
}
|
||||
71
utils.js
Normal file
71
utils.js
Normal file
@@ -0,0 +1,71 @@
|
||||
"use strict";
|
||||
var crypto = require('crypto');
|
||||
|
||||
function swapHex(value) {
|
||||
let s = value.toString(16);
|
||||
s = s.replace(/^(.(..)*)$/, "0$1");
|
||||
var a = s.match(/../g);
|
||||
a.reverse();
|
||||
var s2 = a.join("");
|
||||
return s2;
|
||||
}
|
||||
|
||||
function numToBytes(num, bytes) {
|
||||
if (bytes === undefined) bytes = 8;
|
||||
if (bytes == 0) return [];
|
||||
else return [num % 256].concat(numToBytes(Math.floor(num / 256), bytes - 1));
|
||||
}
|
||||
|
||||
function numToVarInt(num) {
|
||||
if (num < 253) return [num];
|
||||
else if (num < 65536) return [253].concat(numToBytes(num, 2));
|
||||
else if (num < 4294967296) return [254].concat(numToBytes(num, 4));
|
||||
else return [253].concat(numToBytes(num, 8));
|
||||
}
|
||||
|
||||
function hexToBytes(hex) {
|
||||
for (var bytes = [], c = 0; c < hex.length; c += 2)
|
||||
bytes.push(parseInt(hex.substr(c, 2), 16));
|
||||
return bytes;
|
||||
}
|
||||
|
||||
function bytesToHex(bytes) {
|
||||
for (var hex = [], i = 0; i < bytes.length; i++) {
|
||||
hex.push((bytes[i] >>> 4).toString(16));
|
||||
hex.push((bytes[i] & 0xf).toString(16));
|
||||
}
|
||||
return hex.join("");
|
||||
}
|
||||
function bytesLen(num) {
|
||||
return Math.ceil(num.toString(2).length / 8);
|
||||
}
|
||||
|
||||
|
||||
function sha256(buffer) {
|
||||
var hash1 = crypto.createHash('sha256');
|
||||
hash1.update(buffer);
|
||||
return hash1.digest();
|
||||
};
|
||||
|
||||
function sha256d(buffer) {
|
||||
return sha256(sha256(buffer));
|
||||
};
|
||||
|
||||
function reverseBuffer(buff) {
|
||||
var reversed = Buffer.alloc(buff.length);
|
||||
for (var i = buff.length - 1; i >= 0; i--)
|
||||
reversed[buff.length - i - 1] = buff[i];
|
||||
return reversed;
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
swapHex,
|
||||
numToBytes,
|
||||
numToVarInt,
|
||||
hexToBytes,
|
||||
bytesToHex,
|
||||
bytesLen,
|
||||
sha256,
|
||||
sha256d,
|
||||
reverseBuffer
|
||||
};
|
||||
Reference in New Issue
Block a user