75 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| var native = require('../lib/native.js');
 | |
| var crypto = require('crypto');
 | |
| 
 | |
| native
 | |
| 	._hashcash({
 | |
| 		alg: 'SHA-256',
 | |
| 		nonce: '00',
 | |
| 		needle: '0000',
 | |
| 		start: 0,
 | |
| 		end: 2
 | |
| 	})
 | |
| 	.then(function(hashcash) {
 | |
| 		if ('00:76de' !== hashcash) {
 | |
| 			throw new Error('hashcash algorthim changed');
 | |
| 		}
 | |
| 		console.info('PASS: known hash solves correctly');
 | |
| 
 | |
| 		return native
 | |
| 			._hashcash({
 | |
| 				alg: 'SHA-256',
 | |
| 				nonce: '10',
 | |
| 				needle: '',
 | |
| 				start: 0,
 | |
| 				end: 2
 | |
| 			})
 | |
| 			.then(function(hashcash) {
 | |
| 				if ('10:00' !== hashcash) {
 | |
| 					throw new Error('hashcash algorthim changed');
 | |
| 				}
 | |
| 				console.info('PASS: empty hash solves correctly');
 | |
| 
 | |
| 				var now = Date.now();
 | |
| 				var nonce = '20';
 | |
| 				var needle = crypto
 | |
| 					.randomBytes(3)
 | |
| 					.toString('hex')
 | |
| 					.slice(0, 5);
 | |
| 				native
 | |
| 					._hashcash({
 | |
| 						alg: 'SHA-256',
 | |
| 						nonce: nonce,
 | |
| 						needle: needle,
 | |
| 						start: 0,
 | |
| 						end: Math.ceil(needle.length / 2)
 | |
| 					})
 | |
| 					.then(function(hashcash) {
 | |
| 						var later = Date.now();
 | |
| 						var parts = hashcash.split(':');
 | |
| 						var answer = parts[1];
 | |
| 						if (parts[0] !== nonce) {
 | |
| 							throw new Error('incorrect nonce');
 | |
| 						}
 | |
| 						var haystack = crypto
 | |
| 							.createHash('sha256')
 | |
| 							.update(Buffer.from(nonce + answer, 'hex'))
 | |
| 							.digest()
 | |
| 							.slice(0, Math.ceil(needle.length / 2));
 | |
| 						if (
 | |
| 							-1 === haystack.indexOf(Buffer.from(needle, 'hex'))
 | |
| 						) {
 | |
| 							throw new Error('incorrect solution');
 | |
| 						}
 | |
| 						if (later - now > 2000) {
 | |
| 							throw new Error('took too long to solve');
 | |
| 						}
 | |
| 						console.info(
 | |
| 							'PASS: rando hash solves correctly (and in good time - %dms)',
 | |
| 							later - now
 | |
| 						);
 | |
| 					});
 | |
| 			});
 | |
| 	});
 |