UNPKG

exonum-client-cis

Version:

Light Client for Exonum CIS Blockchain

94 lines (69 loc) 2.8 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.verifyBlock = verifyBlock; exports.protocol = void 0; var Long = _interopRequireWildcard(require("long")); var protocol = _interopRequireWildcard(require("../../proto/protocol.js")); exports.protocol = protocol; var _convert = require("../types/convert"); var _crypto = require("../crypto"); /** * Validate block and each precommit in block * @param {Object} data * @param {Array} validators * @return {Promise} */ function verifyBlock(data, validators) { return new Promise(function (resolve) { var block = { prev_hash: { data: (0, _convert.hexadecimalToUint8Array)(data.block.prev_hash) }, tx_hash: { data: (0, _convert.hexadecimalToUint8Array)(data.block.tx_hash) }, state_hash: { data: (0, _convert.hexadecimalToUint8Array)(data.block.state_hash) } }; var blockHash; if (data.block.proposer_id !== 0) { block.proposer_id = data.block.proposer_id; } if (data.block.height !== 0) { block.height = data.block.height; } if (data.block.tx_count !== 0) { block.tx_count = data.block.tx_count; } var message = protocol.exonum.Block.create(block); var buffer = new Uint8Array(protocol.exonum.Block.encode(message).finish()); blockHash = (0, _crypto.hash)(buffer); for (var i = 0; i < data.precommits.length; i++) { var precommit = data.precommits[i]; var _buffer = (0, _convert.hexadecimalToUint8Array)(precommit); var singedMsg = protocol.exonum.consensus.SignedMessage.decode(new Uint8Array(_buffer)); var _message = protocol.exonum.consensus.ExonumMessage.decode(singedMsg.payload); _message = _message.precommit; var plain = protocol.exonum.consensus.Precommit.toObject(_message); if (Long.fromValue(plain.height).compare(Long.fromValue(data.block.height)) !== 0) { throw new Error('Precommit height is not match with block height'); } if ((0, _convert.uint8ArrayToHexadecimal)(plain.block_hash.data) !== blockHash) { throw new Error('Precommit block hash is not match with calculated block hash'); } var publicKey = validators[plain.validator || 0]; if ((0, _convert.uint8ArrayToHexadecimal)(singedMsg.author.data) !== publicKey) { throw new Error('Precommit public key is not match with buffer'); } var signature = (0, _convert.uint8ArrayToHexadecimal)(singedMsg.signature.data); if (!(0, _crypto.verifySignature)(signature, publicKey, singedMsg.payload)) { throw new Error('Precommit signature is wrong'); } } resolve(); }); }