UNPKG

19.3 kBJavaScriptView Raw
1import { common, crypto, InvalidFormatError, IOHelper, JSONHelper, } from '@neo-one/client-common-esnext-esm';
2import { UnsignedBlockError } from './errors';
3import { createSerializeWire } from './Serializable';
4import { utils } from './utils';
5import { Witness } from './Witness';
6export class BlockBase {
7 constructor({ version = 0, previousHash, merkleRoot, timestamp, index, consensusData, nextConsensus, script, hash, }) {
8 // tslint:disable-next-line no-any
9 this.equals = utils.equals(this.constructor, this, (other) => common.uInt256Equal(this.hash, other.hash));
10 this.toKeyString = utils.toKeyString(BlockBase, () => this.hashHex);
11 this.getScriptHashesForVerifying = utils.lazyAsync(async ({ getHeader }) => {
12 if (this.index === 0) {
13 return new Set([common.uInt160ToHex(crypto.toScriptHash(this.script.verification))]);
14 }
15 const previousHeader = await getHeader({
16 hashOrIndex: this.previousHash,
17 });
18 return new Set([common.uInt160ToHex(previousHeader.nextConsensus)]);
19 });
20 this.serializeUnsigned = createSerializeWire(this.serializeUnsignedBase.bind(this));
21 this.serializeWire = createSerializeWire(this.serializeWireBase.bind(this));
22 this.hashHexInternal = utils.lazy(() => common.uInt256ToHex(this.hash));
23 this.messageInternal = utils.lazy(() => this.serializeUnsigned());
24 this.sizeInternal = utils.lazy(() => IOHelper.sizeOfUInt32LE +
25 IOHelper.sizeOfUInt256 +
26 IOHelper.sizeOfUInt256 +
27 IOHelper.sizeOfUInt32LE +
28 IOHelper.sizeOfUInt32LE +
29 IOHelper.sizeOfUInt64LE +
30 IOHelper.sizeOfUInt160 +
31 IOHelper.sizeOfUInt8 +
32 this.script.size +
33 this.sizeExclusive());
34 this.sizeExclusive = () => 0;
35 this.version = version;
36 this.previousHash = previousHash;
37 this.merkleRoot = merkleRoot;
38 this.timestamp = timestamp;
39 this.index = index;
40 this.consensusData = consensusData;
41 this.nextConsensus = nextConsensus;
42 this.scriptInternal = script;
43 const hashIn = hash;
44 this.hashInternal = hashIn === undefined ? utils.lazy(() => crypto.hash256(this.message)) : () => hashIn;
45 }
46 static deserializeBlockBaseWireBase(options) {
47 const { reader } = options;
48 const version = reader.readUInt32LE();
49 const previousHash = reader.readUInt256();
50 const merkleRoot = reader.readUInt256();
51 const timestamp = reader.readUInt32LE();
52 const index = reader.readUInt32LE();
53 const consensusData = reader.readUInt64LE();
54 const nextConsensus = reader.readUInt160();
55 if (reader.readUInt8() !== 1) {
56 throw new InvalidFormatError();
57 }
58 const script = Witness.deserializeWireBase(options);
59 return {
60 version,
61 previousHash,
62 merkleRoot,
63 timestamp,
64 index,
65 consensusData,
66 nextConsensus,
67 script,
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 get size() {
80 return this.sizeInternal();
81 }
82 get script() {
83 if (this.scriptInternal === undefined) {
84 throw new UnsignedBlockError(common.uInt256ToString(this.hash));
85 }
86 return this.scriptInternal;
87 }
88 serializeUnsignedBase(writer) {
89 writer.writeUInt32LE(this.version);
90 writer.writeUInt256(this.previousHash);
91 writer.writeUInt256(this.merkleRoot);
92 writer.writeUInt32LE(this.timestamp);
93 writer.writeUInt32LE(this.index);
94 writer.writeUInt64LE(this.consensusData);
95 writer.writeUInt160(this.nextConsensus);
96 }
97 serializeWireBase(writer) {
98 this.serializeUnsignedBase(writer);
99 writer.writeUInt8(1);
100 this.script.serializeWireBase(writer);
101 }
102 serializeBlockBaseJSON(context) {
103 return {
104 version: this.version,
105 hash: JSONHelper.writeUInt256(this.hash),
106 size: this.size,
107 previousblockhash: JSONHelper.writeUInt256(this.previousHash),
108 merkleroot: JSONHelper.writeUInt256(this.merkleRoot),
109 time: this.timestamp,
110 index: this.index,
111 nonce: JSONHelper.writeUInt64LE(this.consensusData),
112 nextconsensus: crypto.scriptHashToAddress({
113 addressVersion: context.addressVersion,
114 scriptHash: this.nextConsensus,
115 }),
116 script: this.script.serializeJSON(context),
117 confirmations: 0,
118 };
119 }
120}
121
122//# sourceMappingURL=data:application/json;charset=utf8;base64,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TUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUM7WUFDMUMsYUFBYSxFQUFFLENBQUM7U0FDakIsQ0FBQztJQUNKLENBQUM7Q0FHRiIsImZpbGUiOiJuZW8tb25lLW5vZGUtY29yZS9zcmMvQmxvY2tCYXNlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQmluYXJ5V3JpdGVyLFxuICBCbG9ja0Jhc2VKU09OLFxuICBjb21tb24sXG4gIGNyeXB0byxcbiAgSW52YWxpZEZvcm1hdEVycm9yLFxuICBJT0hlbHBlcixcbiAgSlNPTkhlbHBlcixcbiAgVUludDE2MCxcbiAgVUludDI1NixcbiAgVUludDI1NkhleCxcbn0gZnJvbSAnQG5lby1vbmUvY2xpZW50LWNvbW1vbi1lc25leHQtZXNtJztcbmltcG9ydCBCTiBmcm9tICdibi5qcyc7XG5pbXBvcnQgeyBFcXVhbHMsIEVxdWF0YWJsZUtleSB9IGZyb20gJy4vRXF1YXRhYmxlJztcbmltcG9ydCB7IFVuc2lnbmVkQmxvY2tFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IEhlYWRlciwgSGVhZGVyS2V5IH0gZnJvbSAnLi9IZWFkZXInO1xuaW1wb3J0IHsgY3JlYXRlU2VyaWFsaXplV2lyZSwgRGVzZXJpYWxpemVXaXJlQmFzZU9wdGlvbnMsIFNlcmlhbGl6ZUpTT05Db250ZXh0LCBTZXJpYWxpemVXaXJlIH0gZnJvbSAnLi9TZXJpYWxpemFibGUnO1xuaW1wb3J0IHsgdXRpbHMgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IFdpdG5lc3MgfSBmcm9tICcuL1dpdG5lc3MnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJsb2NrR2V0U2NyaXB0SGFzaGVzRm9yVmVyaWZ5aW5nT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGdldEhlYWRlcjogKGtleTogSGVhZGVyS2V5KSA9PiBQcm9taXNlPEhlYWRlcj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmxvY2tCYXNlQWRkIHtcbiAgcmVhZG9ubHkgdmVyc2lvbj86IG51bWJlcjtcbiAgcmVhZG9ubHkgcHJldmlvdXNIYXNoOiBVSW50MjU2O1xuICByZWFkb25seSBtZXJrbGVSb290OiBVSW50MjU2O1xuICByZWFkb25seSB0aW1lc3RhbXA6IG51bWJlcjtcbiAgcmVhZG9ubHkgaW5kZXg6IG51bWJlcjtcbiAgcmVhZG9ubHkgY29uc2Vuc3VzRGF0YTogQk47XG4gIHJlYWRvbmx5IG5leHRDb25zZW5zdXM6IFVJbnQxNjA7XG4gIHJlYWRvbmx5IHNjcmlwdD86IFdpdG5lc3M7XG4gIHJlYWRvbmx5IGhhc2g/OiBVSW50MjU2O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmxvY2tCYXNlIGltcGxlbWVudHMgRXF1YXRhYmxlS2V5IHtcbiAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZUJsb2NrQmFzZVdpcmVCYXNlKG9wdGlvbnM6IERlc2VyaWFsaXplV2lyZUJhc2VPcHRpb25zKTogQmxvY2tCYXNlQWRkIHtcbiAgICBjb25zdCB7IHJlYWRlciB9ID0gb3B0aW9ucztcblxuICAgIGNvbnN0IHZlcnNpb24gPSByZWFkZXIucmVhZFVJbnQzMkxFKCk7XG4gICAgY29uc3QgcHJldmlvdXNIYXNoID0gcmVhZGVyLnJlYWRVSW50MjU2KCk7XG4gICAgY29uc3QgbWVya2xlUm9vdCA9IHJlYWRlci5yZWFkVUludDI1NigpO1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IHJlYWRlci5yZWFkVUludDMyTEUoKTtcbiAgICBjb25zdCBpbmRleCA9IHJlYWRlci5yZWFkVUludDMyTEUoKTtcbiAgICBjb25zdCBjb25zZW5zdXNEYXRhID0gcmVhZGVyLnJlYWRVSW50NjRMRSgpO1xuICAgIGNvbnN0IG5leHRDb25zZW5zdXMgPSByZWFkZXIucmVhZFVJbnQxNjAoKTtcbiAgICBpZiAocmVhZGVyLnJlYWRVSW50OCgpICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEZvcm1hdEVycm9yKCk7XG4gICAgfVxuICAgIGNvbnN0IHNjcmlwdCA9IFdpdG5lc3MuZGVzZXJpYWxpemVXaXJlQmFzZShvcHRpb25zKTtcblxuICAgIHJldHVybiB7XG4gICAgICB2ZXJzaW9uLFxuICAgICAgcHJldmlvdXNIYXNoLFxuICAgICAgbWVya2xlUm9vdCxcbiAgICAgIHRpbWVzdGFtcCxcbiAgICAgIGluZGV4LFxuICAgICAgY29uc2Vuc3VzRGF0YSxcbiAgICAgIG5leHRDb25zZW5zdXMsXG4gICAgICBzY3JpcHQsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uOiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSBwcmV2aW91c0hhc2g6IFVJbnQyNTY7XG4gIHB1YmxpYyByZWFkb25seSBtZXJrbGVSb290OiBVSW50MjU2O1xuICBwdWJsaWMgcmVhZG9ubHkgdGltZXN0YW1wOiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSBpbmRleDogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgY29uc2Vuc3VzRGF0YTogQk47XG4gIHB1YmxpYyByZWFkb25seSBuZXh0Q29uc2Vuc3VzOiBVSW50MTYwO1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tYW55XG4gIHB1YmxpYyByZWFkb25seSBlcXVhbHM6IEVxdWFscyA9IHV0aWxzLmVxdWFscyh0aGlzLmNvbnN0cnVjdG9yIGFzIGFueSwgdGhpcywgKG90aGVyOiBhbnkpID0+XG4gICAgY29tbW9uLnVJbnQyNTZFcXVhbCh0aGlzLmhhc2gsIG90aGVyLmhhc2gpLFxuICApO1xuICBwdWJsaWMgcmVhZG9ubHkgdG9LZXlTdHJpbmcgPSB1dGlscy50b0tleVN0cmluZyhCbG9ja0Jhc2UsICgpID0+IHRoaXMuaGFzaEhleCk7XG4gIHB1YmxpYyByZWFkb25seSBnZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmcgPSB1dGlscy5sYXp5QXN5bmMoXG4gICAgYXN5bmMgKHsgZ2V0SGVhZGVyIH06IEJsb2NrR2V0U2NyaXB0SGFzaGVzRm9yVmVyaWZ5aW5nT3B0aW9ucykgPT4ge1xuICAgICAgaWYgKHRoaXMuaW5kZXggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQoW2NvbW1vbi51SW50MTYwVG9IZXgoY3J5cHRvLnRvU2NyaXB0SGFzaCh0aGlzLnNjcmlwdC52ZXJpZmljYXRpb24pKV0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcmV2aW91c0hlYWRlciA9IGF3YWl0IGdldEhlYWRlcih7XG4gICAgICAgIGhhc2hPckluZGV4OiB0aGlzLnByZXZpb3VzSGFzaCxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbmV3IFNldChbY29tbW9uLnVJbnQxNjBUb0hleChwcmV2aW91c0hlYWRlci5uZXh0Q29uc2Vuc3VzKV0pO1xuICAgIH0sXG4gICk7XG4gIHB1YmxpYyByZWFkb25seSBzZXJpYWxpemVVbnNpZ25lZDogU2VyaWFsaXplV2lyZSA9IGNyZWF0ZVNlcmlhbGl6ZVdpcmUodGhpcy5zZXJpYWxpemVVbnNpZ25lZEJhc2UuYmluZCh0aGlzKSk7XG4gIHB1YmxpYyByZWFkb25seSBzZXJpYWxpemVXaXJlOiBTZXJpYWxpemVXaXJlID0gY3JlYXRlU2VyaWFsaXplV2lyZSh0aGlzLnNlcmlhbGl6ZVdpcmVCYXNlLmJpbmQodGhpcykpO1xuICBwcml2YXRlIHJlYWRvbmx5IGhhc2hJbnRlcm5hbDogKCkgPT4gVUludDI1NjtcbiAgcHJpdmF0ZSByZWFkb25seSBoYXNoSGV4SW50ZXJuYWwgPSB1dGlscy5sYXp5KCgpID0+IGNvbW1vbi51SW50MjU2VG9IZXgodGhpcy5oYXNoKSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZUludGVybmFsID0gdXRpbHMubGF6eSgoKSA9PiB0aGlzLnNlcmlhbGl6ZVVuc2lnbmVkKCkpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNjcmlwdEludGVybmFsOiBXaXRuZXNzIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IHNpemVJbnRlcm5hbCA9IHV0aWxzLmxhenkoXG4gICAgKCkgPT5cbiAgICAgIElPSGVscGVyLnNpemVPZlVJbnQzMkxFICtcbiAgICAgIElPSGVscGVyLnNpemVPZlVJbnQyNTYgK1xuICAgICAgSU9IZWxwZXIuc2l6ZU9mVUludDI1NiArXG4gICAgICBJT0hlbHBlci5zaXplT2ZVSW50MzJMRSArXG4gICAgICBJT0hlbHBlci5zaXplT2ZVSW50MzJMRSArXG4gICAgICBJT0hlbHBlci5zaXplT2ZVSW50NjRMRSArXG4gICAgICBJT0hlbHBlci5zaXplT2ZVSW50MTYwICtcbiAgICAgIElPSGVscGVyLnNpemVPZlVJbnQ4ICtcbiAgICAgIHRoaXMuc2NyaXB0LnNpemUgK1xuICAgICAgdGhpcy5zaXplRXhjbHVzaXZlKCksXG4gICk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHtcbiAgICB2ZXJzaW9uID0gMCxcbiAgICBwcmV2aW91c0hhc2gsXG4gICAgbWVya2xlUm9vdCxcbiAgICB0aW1lc3RhbXAsXG4gICAgaW5kZXgsXG4gICAgY29uc2Vuc3VzRGF0YSxcbiAgICBuZXh0Q29uc2Vuc3VzLFxuICAgIHNjcmlwdCxcbiAgICBoYXNoLFxuICB9OiBCbG9ja0Jhc2VBZGQpIHtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgIHRoaXMucHJldmlvdXNIYXNoID0gcHJldmlvdXNIYXNoO1xuICAgIHRoaXMubWVya2xlUm9vdCA9IG1lcmtsZVJvb3Q7XG4gICAgdGhpcy50aW1lc3RhbXAgPSB0aW1lc3RhbXA7XG4gICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgIHRoaXMuY29uc2Vuc3VzRGF0YSA9IGNvbnNlbnN1c0RhdGE7XG4gICAgdGhpcy5uZXh0Q29uc2Vuc3VzID0gbmV4dENvbnNlbnN1cztcbiAgICB0aGlzLnNjcmlwdEludGVybmFsID0gc2NyaXB0O1xuICAgIGNvbnN0IGhhc2hJbiA9IGhhc2g7XG4gICAgdGhpcy5oYXNoSW50ZXJuYWwgPSBoYXNoSW4gPT09IHVuZGVmaW5lZCA/IHV0aWxzLmxhenkoKCkgPT4gY3J5cHRvLmhhc2gyNTYodGhpcy5tZXNzYWdlKSkgOiAoKSA9PiBoYXNoSW47XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc2goKTogVUludDI1NiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzaEludGVybmFsKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc2hIZXgoKTogVUludDI1NkhleCB7XG4gICAgcmV0dXJuIHRoaXMuaGFzaEhleEludGVybmFsKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1lc3NhZ2UoKTogQnVmZmVyIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSW50ZXJuYWwoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNpemVJbnRlcm5hbCgpO1xuICB9XG5cbiAgcHVibGljIGdldCBzY3JpcHQoKTogV2l0bmVzcyB7XG4gICAgaWYgKHRoaXMuc2NyaXB0SW50ZXJuYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFVuc2lnbmVkQmxvY2tFcnJvcihjb21tb24udUludDI1NlRvU3RyaW5nKHRoaXMuaGFzaCkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNjcmlwdEludGVybmFsO1xuICB9XG5cbiAgcHVibGljIHNlcmlhbGl6ZVVuc2lnbmVkQmFzZSh3cml0ZXI6IEJpbmFyeVdyaXRlcik6IHZvaWQge1xuICAgIHdyaXRlci53cml0ZVVJbnQzMkxFKHRoaXMudmVyc2lvbik7XG4gICAgd3JpdGVyLndyaXRlVUludDI1Nih0aGlzLnByZXZpb3VzSGFzaCk7XG4gICAgd3JpdGVyLndyaXRlVUludDI1Nih0aGlzLm1lcmtsZVJvb3QpO1xuICAgIHdyaXRlci53cml0ZVVJbnQzMkxFKHRoaXMudGltZXN0YW1wKTtcbiAgICB3cml0ZXIud3JpdGVVSW50MzJMRSh0aGlzLmluZGV4KTtcbiAgICB3cml0ZXIud3JpdGVVSW50NjRMRSh0aGlzLmNvbnNlbnN1c0RhdGEpO1xuICAgIHdyaXRlci53cml0ZVVJbnQxNjAodGhpcy5uZXh0Q29uc2Vuc3VzKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXJpYWxpemVXaXJlQmFzZSh3cml0ZXI6IEJpbmFyeVdyaXRlcik6IHZvaWQge1xuICAgIHRoaXMuc2VyaWFsaXplVW5zaWduZWRCYXNlKHdyaXRlcik7XG4gICAgd3JpdGVyLndyaXRlVUludDgoMSk7XG4gICAgdGhpcy5zY3JpcHQuc2VyaWFsaXplV2lyZUJhc2Uod3JpdGVyKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXJpYWxpemVCbG9ja0Jhc2VKU09OKGNvbnRleHQ6IFNlcmlhbGl6ZUpTT05Db250ZXh0KTogQmxvY2tCYXNlSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgIGhhc2g6IEpTT05IZWxwZXIud3JpdGVVSW50MjU2KHRoaXMuaGFzaCksXG4gICAgICBzaXplOiB0aGlzLnNpemUsXG4gICAgICBwcmV2aW91c2Jsb2NraGFzaDogSlNPTkhlbHBlci53cml0ZVVJbnQyNTYodGhpcy5wcmV2aW91c0hhc2gpLFxuICAgICAgbWVya2xlcm9vdDogSlNPTkhlbHBlci53cml0ZVVJbnQyNTYodGhpcy5tZXJrbGVSb290KSxcbiAgICAgIHRpbWU6IHRoaXMudGltZXN0YW1wLFxuICAgICAgaW5kZXg6IHRoaXMuaW5kZXgsXG4gICAgICBub25jZTogSlNPTkhlbHBlci53cml0ZVVJbnQ2NExFKHRoaXMuY29uc2Vuc3VzRGF0YSksXG4gICAgICBuZXh0Y29uc2Vuc3VzOiBjcnlwdG8uc2NyaXB0SGFzaFRvQWRkcmVzcyh7XG4gICAgICAgIGFkZHJlc3NWZXJzaW9uOiBjb250ZXh0LmFkZHJlc3NWZXJzaW9uLFxuICAgICAgICBzY3JpcHRIYXNoOiB0aGlzLm5leHRDb25zZW5zdXMsXG4gICAgICB9KSxcblxuICAgICAgc2NyaXB0OiB0aGlzLnNjcmlwdC5zZXJpYWxpemVKU09OKGNvbnRleHQpLFxuICAgICAgY29uZmlybWF0aW9uczogMCxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNpemVFeGNsdXNpdmU6ICgpID0+IG51bWJlciA9ICgpID0+IDA7XG59XG4iXX0=