/* global assert, JSBI, pow */ const { calcTarget, incrementNonce, bufferToBase64, bigIntToUint8Array, greaterThan, } = pow; describe('Proof of Work', () => { describe('#incrementNonce', () => { it('should increment a Uint8Array nonce correctly', () => { const arr1Before = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0]); const arr1After = incrementNonce(arr1Before); assert.strictEqual(arr1After[0], 0); assert.strictEqual(arr1After[1], 0); assert.strictEqual(arr1After[2], 0); assert.strictEqual(arr1After[3], 0); assert.strictEqual(arr1After[4], 0); assert.strictEqual(arr1After[5], 0); assert.strictEqual(arr1After[6], 0); assert.strictEqual(arr1After[7], 1); }); it('should increment a Uint8Array nonce correctly in a loop', () => { let arr = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0]); assert.deepEqual( incrementNonce(arr), new Uint8Array([0, 0, 0, 0, 0, 0, 0, 1]) ); arr = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0]); for (let i = 0; i <= 255; i += 1) { arr = incrementNonce(arr); } assert.deepEqual(arr, new Uint8Array([0, 0, 0, 0, 0, 0, 1, 0])); arr = new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255]); assert.deepEqual( incrementNonce(arr), new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0]) ); }); }); describe('#calcTarget', () => { it('should calculate a correct difficulty target', () => { // These values will need to be updated if we adjust the difficulty settings let payloadLen = 625; const ttl = 86400000; let expectedTarget = new Uint8Array([0, 4, 119, 164, 35, 224, 222, 64]); let actualTarget = calcTarget(ttl, payloadLen, 10); assert.deepEqual(actualTarget, expectedTarget); payloadLen = 6597; expectedTarget = new Uint8Array([0, 0, 109, 145, 174, 146, 124, 3]); actualTarget = calcTarget(ttl, payloadLen, 10); assert.deepEqual(actualTarget, expectedTarget); }); }); describe('#greaterThan', () => { it('should correclty compare two Uint8Arrays', () => { let arr1 = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1]); let arr2 = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1]); assert.isFalse(greaterThan(arr1, arr2)); arr1 = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 2]); arr2 = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1]); assert.isTrue(greaterThan(arr1, arr2)); arr1 = new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255, 255, 255]); arr2 = new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255, 255, 254]); assert.isTrue(greaterThan(arr1, arr2)); arr1 = new Uint8Array([254, 255, 255, 255, 255, 255, 255, 255, 255, 255]); arr2 = new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255, 255, 255]); assert.isFalse(greaterThan(arr1, arr2)); arr1 = new Uint8Array([0]); arr2 = new Uint8Array([0, 0]); assert.isFalse(greaterThan(arr1, arr2)); }); }); describe('#bufferToBase64', () => { it('should correclty convert a Uint8Array to a base64 string', () => { let arr = new Uint8Array([1, 2, 3]); let expected = 'AQID'; assert.strictEqual(bufferToBase64(arr), expected); arr = new Uint8Array([123, 25, 3, 121, 45, 87, 24, 111]); expected = 'exkDeS1XGG8='; assert.strictEqual(bufferToBase64(arr), expected); arr = new Uint8Array([]); expected = ''; assert.strictEqual(bufferToBase64(arr), expected); }); }); describe('#bigIntToUint8Array', () => { it('should correclty convert a BigInteger to a Uint8Array', () => { let bigInt = JSBI.BigInt(Number.MAX_SAFE_INTEGER); let expected = new Uint8Array([0, 31, 255, 255, 255, 255, 255, 255]); assert.deepEqual(bigIntToUint8Array(bigInt), expected); bigInt = JSBI.BigInt('0'); expected = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0]); assert.deepEqual(bigIntToUint8Array(bigInt), expected); bigInt = JSBI.BigInt('255'); expected = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 255]); assert.deepEqual(bigIntToUint8Array(bigInt), expected); bigInt = JSBI.BigInt('256'); expected = new Uint8Array([0, 0, 0, 0, 0, 0, 1, 0]); assert.deepEqual(bigIntToUint8Array(bigInt), expected); }); }); });