const { ShaMap } = require('../dist/shamap.js') const { binary, HashPrefix } = require('../dist/coretypes') const { coreTypes } = require('../dist/types') const { loadFixture } = require('./utils') function now () { return (Number(Date.now())) / 1000 } const ZERO = '0000000000000000000000000000000000000000000000000000000000000000' function makeItem (indexArg) { let str = indexArg while (str.length < 64) { str += '0' } const index = coreTypes.Hash256.from(str) const item = { toBytesSink (sink) { index.toBytesSink(sink) }, hashPrefix () { return Buffer.from([1, 3, 3, 7]) } } return [index, item] } describe('ShaMap', () => { now() test('hashes to zero when empty', () => { const map = new ShaMap() expect(map.hash().toHex()).toBe(ZERO) }) test('creates the same hash no matter which order items are added', () => { let map = new ShaMap() const items = [ '0', '1', '11', '7000DE445E22CB9BB7E1717589FA858736BAA5FD192310E20000000000000000', '7000DE445E22CB9BB7E1717589FA858736BAA5FD192310E21000000000000000', '7000DE445E22CB9BB7E1717589FA858736BAA5FD192310E22000000000000000', '7000DE445E22CB9BB7E1717589FA858736BAA5FD192310E23000000000000000', '12', '122' ] items.forEach(i => map.addItem(...makeItem(i))) const h1 = map.hash() expect(h1.eq(h1)).toBe(true) map = new ShaMap() items.reverse().forEach(i => map.addItem(...makeItem(i))) expect(map.hash()).toStrictEqual(h1) }) function factory (fixture) { test(`recreate account state hash from ${fixture}`, () => { const map = new ShaMap() const ledger = loadFixture(fixture) // const t = now(); const leafNodePrefix = HashPrefix.accountStateEntry ledger.accountState.map((e, i) => { if (i > 1000 & (i % 1000) === 0) { console.log(e.index) console.log(i) } const bytes = binary.serializeObject(e) return { index: coreTypes.Hash256.from(e.index), hashPrefix () { return leafNodePrefix }, toBytesSink (sink) { sink.put(bytes) } } }).forEach(so => map.addItem(so.index, so)) expect(map.hash().toHex()).toBe(ledger.account_hash) // console.log('took seconds: ', (now() - t)); }) } factory('ledger-full-38129.json') factory('ledger-full-40000.json') // factory('ledger-4320277.json'); // factory('14280680.json'); })