1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- const { ShaMap } = require('../dist/shamap.js')
- const { binary, HashPrefix } = require('../dist/coretypes')
- const { coreTypes } = require('../dist/types')
- const { loadFixture } = require('./utils')
- const { Buffer } = require('buffer/')
- 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');
- })
|