exonum-client-cis
Version:
Light Client for Exonum CIS Blockchain
94 lines (69 loc) • 2.8 kB
JavaScript
;
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();
});
}