UNPKG

bluzelle-binary-codec

Version:
71 lines (62 loc) 2.71 kB
'use strict';function _toConsumableArray(arr) {if (Array.isArray(arr)) {for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {arr2[i] = arr[i];}return arr2;} else {return Array.from(arr);}}var _ = require('lodash'); var BN = require('bn.js'); var assert = require('assert'); var types = require('./types');var STObject = types.STObject,Hash256 = types.Hash256;var _require = require('./shamap'),ShaMap = _require.ShaMap;var _require2 = require('./hash-prefixes'),HashPrefix = _require2.HashPrefix;var _require3 = require('./hashes'),Sha512Half = _require3.Sha512Half;var _require4 = require('./binary'),BinarySerializer = _require4.BinarySerializer,serializeObject = _require4.serializeObject; function computeHash(itemizer, itemsJson) { var map = new ShaMap(); itemsJson.forEach(function (item) {return map.addItem.apply(map, _toConsumableArray(itemizer(item)));}); return map.hash(); } function transactionItem(json) { assert(json.hash); var index = Hash256.from(json.hash); var item = { hashPrefix: function hashPrefix() { return HashPrefix.transaction; }, toBytesSink: function toBytesSink(sink) { var serializer = new BinarySerializer(sink); serializer.writeLengthEncoded(STObject.from(json)); serializer.writeLengthEncoded(STObject.from(json.metaData)); } }; return [index, item]; } function entryItem(json) { var index = Hash256.from(json.index); var bytes = serializeObject(json); var item = { hashPrefix: function hashPrefix() { return HashPrefix.accountStateEntry; }, toBytesSink: function toBytesSink(sink) { sink.put(bytes); } }; return [index, item]; } var transactionTreeHash = _.partial(computeHash, transactionItem); var accountStateHash = _.partial(computeHash, entryItem); function ledgerHash(header) { var hash = new Sha512Half(); hash.put(HashPrefix.ledgerHeader); assert(header.parent_close_time !== undefined); assert(header.close_flags !== undefined); types.UInt32.from(header.ledger_index).toBytesSink(hash); types.UInt64.from(new BN(header.total_coins)).toBytesSink(hash); types.Hash256.from(header.parent_hash).toBytesSink(hash); types.Hash256.from(header.transaction_hash).toBytesSink(hash); types.Hash256.from(header.account_hash).toBytesSink(hash); types.UInt32.from(header.parent_close_time).toBytesSink(hash); types.UInt32.from(header.close_time).toBytesSink(hash); types.UInt8.from(header.close_time_resolution).toBytesSink(hash); types.UInt8.from(header.close_flags).toBytesSink(hash); return hash.finish(); } module.exports = { accountStateHash: accountStateHash, transactionTreeHash: transactionTreeHash, ledgerHash: ledgerHash };