UNPKG

17.8 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const client_common_1 = require("@neo-one/client-common");
4const errors_1 = require("../errors");
5const ScriptContainer_1 = require("../ScriptContainer");
6const utils_1 = require("../utils");
7const Witness_1 = require("../Witness");
8const UnsignedConsensusPayload_1 = require("./UnsignedConsensusPayload");
9class ConsensusPayload extends UnsignedConsensusPayload_1.UnsignedConsensusPayload {
10 constructor({ version, previousHash, blockIndex, validatorIndex, timestamp, consensusMessage, script, }) {
11 super({
12 version,
13 previousHash,
14 blockIndex,
15 validatorIndex,
16 timestamp,
17 consensusMessage,
18 });
19 this.toKeyString = utils_1.utils.toKeyString(this.constructor, () => this.hashHex);
20 this.equals = utils_1.utils.equals(this.constructor, this, (other) => client_common_1.common.uInt256Equal(this.hash, other.hash));
21 this.getScriptHashesForVerifying = utils_1.utils.lazyAsync(async ({ getValidators, currentBlockHash }) => {
22 if (!client_common_1.common.uInt256Equal(this.previousHash, currentBlockHash)) {
23 throw new errors_1.VerifyError('Previous hash not equal to current block hash');
24 }
25 const validators = await getValidators();
26 if (validators.length <= this.validatorIndex) {
27 throw new errors_1.VerifyError('Invalid validator index');
28 }
29 return new Set([client_common_1.common.uInt160ToHex(client_common_1.crypto.getVerificationScriptHash(validators[this.validatorIndex]))]);
30 });
31 this.hashInternal = utils_1.utils.lazy(() => client_common_1.crypto.hash256(this.message));
32 this.hashHexInternal = utils_1.utils.lazy(() => client_common_1.common.uInt256ToHex(this.hash));
33 this.messageInternal = utils_1.utils.lazy(() => this.serializeUnsigned());
34 this.script = script;
35 }
36 static sign(payload, key) {
37 return new ConsensusPayload({
38 version: payload.version,
39 previousHash: payload.previousHash,
40 blockIndex: payload.blockIndex,
41 validatorIndex: payload.validatorIndex,
42 timestamp: payload.timestamp,
43 consensusMessage: payload.consensusMessage,
44 script: client_common_1.crypto.createWitness(payload.serializeWire(), key, Witness_1.Witness),
45 });
46 }
47 static deserializeWireBase(options) {
48 const { reader } = options;
49 const { version, previousHash, blockIndex, validatorIndex, timestamp, consensusMessage, } = super.deserializeUnsignedConsensusPayloadWireBase(options);
50 if (reader.readUInt8() !== 1) {
51 throw new client_common_1.InvalidFormatError(`Expected BinaryReader\'s readUInt8(0) to be 1. Received: ${reader.readUInt8()}`);
52 }
53 const script = Witness_1.Witness.deserializeWireBase(options);
54 return new this({
55 version,
56 previousHash,
57 blockIndex,
58 validatorIndex,
59 timestamp,
60 consensusMessage,
61 script,
62 });
63 }
64 static deserializeWire(options) {
65 return this.deserializeWireBase({
66 context: options.context,
67 reader: new utils_1.BinaryReader(options.buffer),
68 });
69 }
70 get hash() {
71 return this.hashInternal();
72 }
73 get hashHex() {
74 return this.hashHexInternal();
75 }
76 get message() {
77 return this.messageInternal();
78 }
79 serializeUnsigned() {
80 const writer = new client_common_1.BinaryWriter();
81 super.serializeWireBase(writer);
82 return writer.toBuffer();
83 }
84 serializeWireBase(writer) {
85 super.serializeWireBase(writer);
86 writer.writeUInt8(1);
87 this.script.serializeWireBase(writer);
88 }
89 async verify({ verifyScript, getValidators, currentBlockHash, currentIndex, }) {
90 if (this.blockIndex !== currentIndex + 1) {
91 throw new errors_1.VerifyError('Invalid block index.');
92 }
93 const scriptHashes = await this.getScriptHashesForVerifying({
94 getValidators,
95 currentBlockHash,
96 });
97 const scriptContainer = {
98 type: ScriptContainer_1.ScriptContainerType.Consensus,
99 value: this,
100 };
101 const results = await Promise.all([...scriptHashes].map(async (hash) => verifyScript({
102 scriptContainer,
103 hash: client_common_1.common.hexToUInt160(hash),
104 witness: this.script,
105 })));
106 results.forEach(({ failureMessage }) => {
107 if (failureMessage !== undefined) {
108 throw new errors_1.VerifyError(failureMessage);
109 }
110 });
111 }
112}
113exports.ConsensusPayload = ConsensusPayload;
114
115//# sourceMappingURL=data:application/json;charset=utf8;base64,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TyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBRTtZQUNyQyxJQUFJLGNBQWMsS0FBSyxTQUFTLEVBQUU7Z0JBQ2hDLE1BQU0sSUFBSSxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2FBQ3ZDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUExSkQsNENBMEpDIiwiZmlsZSI6Im5lby1vbmUtbm9kZS1jb3JlL3NyYy9wYXlsb2FkL0NvbnNlbnN1c1BheWxvYWQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCaW5hcnlXcml0ZXIsXG4gIGNvbW1vbixcbiAgY3J5cHRvLFxuICBFQ1BvaW50LFxuICBJbnZhbGlkRm9ybWF0RXJyb3IsXG4gIFByaXZhdGVLZXksXG4gIFVJbnQyNTYsXG4gIFVJbnQyNTZIZXgsXG59IGZyb20gJ0BuZW8tb25lL2NsaWVudC1jb21tb24nO1xuaW1wb3J0IHsgRXF1YWxzLCBFcXVhdGFibGVLZXkgfSBmcm9tICcuLi9FcXVhdGFibGUnO1xuaW1wb3J0IHsgVmVyaWZ5RXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgU2NyaXB0Q29udGFpbmVyVHlwZSB9IGZyb20gJy4uL1NjcmlwdENvbnRhaW5lcic7XG5pbXBvcnQgeyBEZXNlcmlhbGl6ZVdpcmVCYXNlT3B0aW9ucywgRGVzZXJpYWxpemVXaXJlT3B0aW9ucywgU2VyaWFsaXphYmxlV2lyZSB9IGZyb20gJy4uL1NlcmlhbGl6YWJsZSc7XG5pbXBvcnQgeyBCaW5hcnlSZWFkZXIsIHV0aWxzIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgVmVyaWZ5U2NyaXB0IH0gZnJvbSAnLi4vdm0nO1xuaW1wb3J0IHsgV2l0bmVzcyB9IGZyb20gJy4uL1dpdG5lc3MnO1xuaW1wb3J0IHsgVW5zaWduZWRDb25zZW5zdXNQYXlsb2FkLCBVbnNpZ25lZENvbnNlbnN1c1BheWxvYWRBZGQgfSBmcm9tICcuL1Vuc2lnbmVkQ29uc2Vuc3VzUGF5bG9hZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uc2Vuc3VzUGF5bG9hZEFkZCBleHRlbmRzIFVuc2lnbmVkQ29uc2Vuc3VzUGF5bG9hZEFkZCB7XG4gIHJlYWRvbmx5IHNjcmlwdDogV2l0bmVzcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25zZW5zdXNQYXlsb2FkR2V0U2NyaXB0SGFzaGVzRm9yVmVyaWZ5aW5nT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGdldFZhbGlkYXRvcnM6ICgpID0+IFByb21pc2U8cmVhZG9ubHkgRUNQb2ludFtdPjtcbiAgcmVhZG9ubHkgY3VycmVudEJsb2NrSGFzaDogVUludDI1Njtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25zZW5zdXNQYXlsb2FkVmVyaWZ5T3B0aW9ucyBleHRlbmRzIENvbnNlbnN1c1BheWxvYWRHZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmdPcHRpb25zIHtcbiAgcmVhZG9ubHkgY3VycmVudEluZGV4OiBudW1iZXI7XG4gIHJlYWRvbmx5IHZlcmlmeVNjcmlwdDogVmVyaWZ5U2NyaXB0O1xufVxuXG5leHBvcnQgY2xhc3MgQ29uc2Vuc3VzUGF5bG9hZCBleHRlbmRzIFVuc2lnbmVkQ29uc2Vuc3VzUGF5bG9hZFxuICBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZVdpcmU8Q29uc2Vuc3VzUGF5bG9hZD4sIEVxdWF0YWJsZUtleSB7XG4gIHB1YmxpYyBzdGF0aWMgc2lnbihwYXlsb2FkOiBVbnNpZ25lZENvbnNlbnN1c1BheWxvYWQsIGtleTogUHJpdmF0ZUtleSk6IENvbnNlbnN1c1BheWxvYWQge1xuICAgIHJldHVybiBuZXcgQ29uc2Vuc3VzUGF5bG9hZCh7XG4gICAgICB2ZXJzaW9uOiBwYXlsb2FkLnZlcnNpb24sXG4gICAgICBwcmV2aW91c0hhc2g6IHBheWxvYWQucHJldmlvdXNIYXNoLFxuICAgICAgYmxvY2tJbmRleDogcGF5bG9hZC5ibG9ja0luZGV4LFxuICAgICAgdmFsaWRhdG9ySW5kZXg6IHBheWxvYWQudmFsaWRhdG9ySW5kZXgsXG4gICAgICB0aW1lc3RhbXA6IHBheWxvYWQudGltZXN0YW1wLFxuICAgICAgY29uc2Vuc3VzTWVzc2FnZTogcGF5bG9hZC5jb25zZW5zdXNNZXNzYWdlLFxuICAgICAgc2NyaXB0OiBjcnlwdG8uY3JlYXRlV2l0bmVzcyhwYXlsb2FkLnNlcmlhbGl6ZVdpcmUoKSwga2V5LCBXaXRuZXNzKSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemVXaXJlQmFzZShvcHRpb25zOiBEZXNlcmlhbGl6ZVdpcmVCYXNlT3B0aW9ucyk6IENvbnNlbnN1c1BheWxvYWQge1xuICAgIGNvbnN0IHsgcmVhZGVyIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHtcbiAgICAgIHZlcnNpb24sXG4gICAgICBwcmV2aW91c0hhc2gsXG4gICAgICBibG9ja0luZGV4LFxuICAgICAgdmFsaWRhdG9ySW5kZXgsXG4gICAgICB0aW1lc3RhbXAsXG4gICAgICBjb25zZW5zdXNNZXNzYWdlLFxuICAgIH0gPSBzdXBlci5kZXNlcmlhbGl6ZVVuc2lnbmVkQ29uc2Vuc3VzUGF5bG9hZFdpcmVCYXNlKG9wdGlvbnMpO1xuICAgIGlmIChyZWFkZXIucmVhZFVJbnQ4KCkgIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRm9ybWF0RXJyb3IoYEV4cGVjdGVkIEJpbmFyeVJlYWRlclxcJ3MgcmVhZFVJbnQ4KDApIHRvIGJlIDEuIFJlY2VpdmVkOiAke3JlYWRlci5yZWFkVUludDgoKX1gKTtcbiAgICB9XG4gICAgY29uc3Qgc2NyaXB0ID0gV2l0bmVzcy5kZXNlcmlhbGl6ZVdpcmVCYXNlKG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIG5ldyB0aGlzKHtcbiAgICAgIHZlcnNpb24sXG4gICAgICBwcmV2aW91c0hhc2gsXG4gICAgICBibG9ja0luZGV4LFxuICAgICAgdmFsaWRhdG9ySW5kZXgsXG4gICAgICB0aW1lc3RhbXAsXG4gICAgICBjb25zZW5zdXNNZXNzYWdlLFxuICAgICAgc2NyaXB0LFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZVdpcmUob3B0aW9uczogRGVzZXJpYWxpemVXaXJlT3B0aW9ucyk6IENvbnNlbnN1c1BheWxvYWQge1xuICAgIHJldHVybiB0aGlzLmRlc2VyaWFsaXplV2lyZUJhc2Uoe1xuICAgICAgY29udGV4dDogb3B0aW9ucy5jb250ZXh0LFxuICAgICAgcmVhZGVyOiBuZXcgQmluYXJ5UmVhZGVyKG9wdGlvbnMuYnVmZmVyKSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBzY3JpcHQ6IFdpdG5lc3M7XG4gIHB1YmxpYyByZWFkb25seSB0b0tleVN0cmluZyA9IHV0aWxzLnRvS2V5U3RyaW5nKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIENvbnNlbnN1c1BheWxvYWQsICgpID0+IHRoaXMuaGFzaEhleCk7XG4gIHB1YmxpYyByZWFkb25seSBlcXVhbHM6IEVxdWFscyA9IHV0aWxzLmVxdWFscyh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBDb25zZW5zdXNQYXlsb2FkLCB0aGlzLCAob3RoZXIpID0+XG4gICAgY29tbW9uLnVJbnQyNTZFcXVhbCh0aGlzLmhhc2gsIG90aGVyLmhhc2gpLFxuICApO1xuICBwdWJsaWMgcmVhZG9ubHkgZ2V0U2NyaXB0SGFzaGVzRm9yVmVyaWZ5aW5nID0gdXRpbHMubGF6eUFzeW5jKFxuICAgIGFzeW5jICh7IGdldFZhbGlkYXRvcnMsIGN1cnJlbnRCbG9ja0hhc2ggfTogQ29uc2Vuc3VzUGF5bG9hZEdldFNjcmlwdEhhc2hlc0ZvclZlcmlmeWluZ09wdGlvbnMpID0+IHtcbiAgICAgIGlmICghY29tbW9uLnVJbnQyNTZFcXVhbCh0aGlzLnByZXZpb3VzSGFzaCwgY3VycmVudEJsb2NrSGFzaCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZlcmlmeUVycm9yKCdQcmV2aW91cyBoYXNoIG5vdCBlcXVhbCB0byBjdXJyZW50IGJsb2NrIGhhc2gnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBhd2FpdCBnZXRWYWxpZGF0b3JzKCk7XG4gICAgICBpZiAodmFsaWRhdG9ycy5sZW5ndGggPD0gdGhpcy52YWxpZGF0b3JJbmRleCkge1xuICAgICAgICB0aHJvdyBuZXcgVmVyaWZ5RXJyb3IoJ0ludmFsaWQgdmFsaWRhdG9yIGluZGV4Jyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgU2V0KFtjb21tb24udUludDE2MFRvSGV4KGNyeXB0by5nZXRWZXJpZmljYXRpb25TY3JpcHRIYXNoKHZhbGlkYXRvcnNbdGhpcy52YWxpZGF0b3JJbmRleF0pKV0pO1xuICAgIH0sXG4gICk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGFzaEludGVybmFsID0gdXRpbHMubGF6eSgoKSA9PiBjcnlwdG8uaGFzaDI1Nih0aGlzLm1lc3NhZ2UpKTtcbiAgcHJpdmF0ZSByZWFkb25seSBoYXNoSGV4SW50ZXJuYWwgPSB1dGlscy5sYXp5KCgpID0+IGNvbW1vbi51SW50MjU2VG9IZXgodGhpcy5oYXNoKSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZUludGVybmFsID0gdXRpbHMubGF6eSgoKSA9PiB0aGlzLnNlcmlhbGl6ZVVuc2lnbmVkKCkpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih7XG4gICAgdmVyc2lvbixcbiAgICBwcmV2aW91c0hhc2gsXG4gICAgYmxvY2tJbmRleCxcbiAgICB2YWxpZGF0b3JJbmRleCxcbiAgICB0aW1lc3RhbXAsXG4gICAgY29uc2Vuc3VzTWVzc2FnZSxcbiAgICBzY3JpcHQsXG4gIH06IENvbnNlbnN1c1BheWxvYWRBZGQpIHtcbiAgICBzdXBlcih7XG4gICAgICB2ZXJzaW9uLFxuICAgICAgcHJldmlvdXNIYXNoLFxuICAgICAgYmxvY2tJbmRleCxcbiAgICAgIHZhbGlkYXRvckluZGV4LFxuICAgICAgdGltZXN0YW1wLFxuICAgICAgY29uc2Vuc3VzTWVzc2FnZSxcbiAgICB9KTtcblxuICAgIHRoaXMuc2NyaXB0ID0gc2NyaXB0O1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNoKCk6IFVJbnQyNTYge1xuICAgIHJldHVybiB0aGlzLmhhc2hJbnRlcm5hbCgpO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNoSGV4KCk6IFVJbnQyNTZIZXgge1xuICAgIHJldHVybiB0aGlzLmhhc2hIZXhJbnRlcm5hbCgpO1xuICB9XG5cbiAgcHVibGljIGdldCBtZXNzYWdlKCk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUludGVybmFsKCk7XG4gIH1cblxuICBwdWJsaWMgc2VyaWFsaXplVW5zaWduZWQoKTogQnVmZmVyIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgc3VwZXIuc2VyaWFsaXplV2lyZUJhc2Uod3JpdGVyKTtcblxuICAgIHJldHVybiB3cml0ZXIudG9CdWZmZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXJpYWxpemVXaXJlQmFzZSh3cml0ZXI6IEJpbmFyeVdyaXRlcik6IHZvaWQge1xuICAgIHN1cGVyLnNlcmlhbGl6ZVdpcmVCYXNlKHdyaXRlcik7XG4gICAgd3JpdGVyLndyaXRlVUludDgoMSk7XG4gICAgdGhpcy5zY3JpcHQuc2VyaWFsaXplV2lyZUJhc2Uod3JpdGVyKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB2ZXJpZnkoe1xuICAgIHZlcmlmeVNjcmlwdCxcbiAgICBnZXRWYWxpZGF0b3JzLFxuICAgIGN1cnJlbnRCbG9ja0hhc2gsXG4gICAgY3VycmVudEluZGV4LFxuICB9OiBDb25zZW5zdXNQYXlsb2FkVmVyaWZ5T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmJsb2NrSW5kZXggIT09IGN1cnJlbnRJbmRleCArIDEpIHtcbiAgICAgIHRocm93IG5ldyBWZXJpZnlFcnJvcignSW52YWxpZCBibG9jayBpbmRleC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBzY3JpcHRIYXNoZXMgPSBhd2FpdCB0aGlzLmdldFNjcmlwdEhhc2hlc0ZvclZlcmlmeWluZyh7XG4gICAgICBnZXRWYWxpZGF0b3JzLFxuICAgICAgY3VycmVudEJsb2NrSGFzaCxcbiAgICB9KTtcblxuICAgIGNvbnN0IHNjcmlwdENvbnRhaW5lcjoge1xuICAgICAgdHlwZTogU2NyaXB0Q29udGFpbmVyVHlwZS5Db25zZW5zdXM7XG4gICAgICB2YWx1ZTogQ29uc2Vuc3VzUGF5bG9hZDtcbiAgICB9ID0ge1xuICAgICAgdHlwZTogU2NyaXB0Q29udGFpbmVyVHlwZS5Db25zZW5zdXMsXG4gICAgICB2YWx1ZTogdGhpcyxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgWy4uLnNjcmlwdEhhc2hlc10ubWFwKGFzeW5jIChoYXNoKSA9PlxuICAgICAgICB2ZXJpZnlTY3JpcHQoe1xuICAgICAgICAgIHNjcmlwdENvbnRhaW5lcixcbiAgICAgICAgICBoYXNoOiBjb21tb24uaGV4VG9VSW50MTYwKGhhc2gpLFxuICAgICAgICAgIHdpdG5lc3M6IHRoaXMuc2NyaXB0LFxuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIHJlc3VsdHMuZm9yRWFjaCgoeyBmYWlsdXJlTWVzc2FnZSB9KSA9PiB7XG4gICAgICBpZiAoZmFpbHVyZU1lc3NhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVmVyaWZ5RXJyb3IoZmFpbHVyZU1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iXX0=