init
This commit is contained in:
+12
@@ -0,0 +1,12 @@
|
||||
declare enum HashPrefix {
|
||||
TRANSACTION_ID = 1415073280,
|
||||
TRANSACTION_NODE = 1397638144,
|
||||
INNER_NODE = 1296649728,
|
||||
LEAF_NODE = 1296846336,
|
||||
TRANSACTION_SIGN = 1398036480,
|
||||
TRANSACTION_SIGN_TESTNET = 1937012736,
|
||||
TRANSACTION_MULTISIGN = 1397576704,
|
||||
LEDGER = 1280791040
|
||||
}
|
||||
export default HashPrefix;
|
||||
//# sourceMappingURL=hash-prefix.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"hash-prefix.d.ts","sourceRoot":"","sources":["../../../../src/common/hashes/hash-prefix.ts"],"names":[],"mappings":"AAaA,aAAK,UAAU;IAEb,cAAc,aAAa;IAG3B,gBAAgB,aAAa;IAG7B,UAAU,aAAa;IAGvB,SAAS,aAAa;IAGtB,gBAAgB,aAAa;IAG7B,wBAAwB,aAAa;IAGrC,qBAAqB,aAAa;IAGlC,MAAM,aAAa;CACpB;AAED,eAAe,UAAU,CAAA"}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
var HashPrefix;
|
||||
(function (HashPrefix) {
|
||||
HashPrefix[HashPrefix["TRANSACTION_ID"] = 1415073280] = "TRANSACTION_ID";
|
||||
HashPrefix[HashPrefix["TRANSACTION_NODE"] = 1397638144] = "TRANSACTION_NODE";
|
||||
HashPrefix[HashPrefix["INNER_NODE"] = 1296649728] = "INNER_NODE";
|
||||
HashPrefix[HashPrefix["LEAF_NODE"] = 1296846336] = "LEAF_NODE";
|
||||
HashPrefix[HashPrefix["TRANSACTION_SIGN"] = 1398036480] = "TRANSACTION_SIGN";
|
||||
HashPrefix[HashPrefix["TRANSACTION_SIGN_TESTNET"] = 1937012736] = "TRANSACTION_SIGN_TESTNET";
|
||||
HashPrefix[HashPrefix["TRANSACTION_MULTISIGN"] = 1397576704] = "TRANSACTION_MULTISIGN";
|
||||
HashPrefix[HashPrefix["LEDGER"] = 1280791040] = "LEDGER";
|
||||
})(HashPrefix || (HashPrefix = {}));
|
||||
exports.default = HashPrefix;
|
||||
//# sourceMappingURL=hash-prefix.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"hash-prefix.js","sourceRoot":"","sources":["../../../../src/common/hashes/hash-prefix.ts"],"names":[],"mappings":";;AAaA,IAAK,UAwBJ;AAxBD,WAAK,UAAU;IAEb,wEAA2B,CAAA;IAG3B,4EAA6B,CAAA;IAG7B,gEAAuB,CAAA;IAGvB,8DAAsB,CAAA;IAGtB,4EAA6B,CAAA;IAG7B,4FAAqC,CAAA;IAGrC,sFAAkC,CAAA;IAGlC,wDAAmB,CAAA;AACrB,CAAC,EAxBI,UAAU,KAAV,UAAU,QAwBd;AAED,kBAAe,UAAU,CAAA"}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
export declare const computeBinaryTransactionHash: (txBlobHex: string) => string;
|
||||
export declare const computeTransactionHash: (txJSON: any) => string;
|
||||
export declare const computeBinaryTransactionSigningHash: (txBlobHex: string) => string;
|
||||
export declare const computeAccountLedgerObjectID: (address: string) => string;
|
||||
export declare const computeSignerListLedgerObjectID: (address: string) => string;
|
||||
export declare const computeOrderID: (address: string, sequence: number) => string;
|
||||
export declare const computeTrustlineHash: (address1: string, address2: string, currency: string) => string;
|
||||
export declare const computeTransactionTreeHash: (transactions: any[]) => string;
|
||||
export declare const computeStateTreeHash: (entries: any[]) => string;
|
||||
export declare const computeLedgerHash: (ledgerHeader: any) => string;
|
||||
export declare const computeEscrowHash: (address: any, sequence: any) => string;
|
||||
export declare const computePaymentChannelHash: (address: any, dstAddress: any, sequence: any) => string;
|
||||
//# sourceMappingURL=index.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/common/hashes/index.ts"],"names":[],"mappings":"AA6DA,eAAO,MAAM,4BAA4B,cAAe,MAAM,KAAG,MAGhE,CAAA;AAED,eAAO,MAAM,sBAAsB,WAAY,GAAG,KAAG,MAEpD,CAAA;AAUD,eAAO,MAAM,mCAAmC,cACnC,MAAM,KAChB,MAGF,CAAA;AAeD,eAAO,MAAM,4BAA4B,YAAa,MAAM,KAAG,MAE9D,CAAA;AAeD,eAAO,MAAM,+BAA+B,YAAa,MAAM,KAAG,MAIjE,CAAA;AAeD,eAAO,MAAM,cAAc,YAAa,MAAM,YAAY,MAAM,KAAG,MAGlE,CAAA;AAED,eAAO,MAAM,oBAAoB,aACrB,MAAM,YACN,MAAM,YACN,MAAM,KACf,MAcF,CAAA;AAED,eAAO,MAAM,0BAA0B,iBAAkB,GAAG,EAAE,KAAG,MAYhE,CAAA;AAED,eAAO,MAAM,oBAAoB,YAAa,GAAG,EAAE,KAAG,MASrD,CAAA;AAGD,eAAO,MAAM,iBAAiB,yBAAmB,MAchD,CAAA;AAED,eAAO,MAAM,iBAAiB,mCAAwB,MAIrD,CAAA;AAED,eAAO,MAAM,yBAAyB,oDAInC,MAOF,CAAA"}
|
||||
+129
@@ -0,0 +1,129 @@
|
||||
"use strict";
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.computePaymentChannelHash = exports.computeEscrowHash = exports.computeLedgerHash = exports.computeStateTreeHash = exports.computeTransactionTreeHash = exports.computeTrustlineHash = exports.computeOrderID = exports.computeSignerListLedgerObjectID = exports.computeAccountLedgerObjectID = exports.computeBinaryTransactionSigningHash = exports.computeTransactionHash = exports.computeBinaryTransactionHash = void 0;
|
||||
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
||||
const ripple_address_codec_1 = require("ripple-address-codec");
|
||||
const sha512Half_1 = __importDefault(require("./sha512Half"));
|
||||
const hash_prefix_1 = __importDefault(require("./hash-prefix"));
|
||||
const shamap_1 = require("./shamap");
|
||||
const ripple_binary_codec_1 = require("ripple-binary-codec");
|
||||
const ledgerspaces_1 = __importDefault(require("./ledgerspaces"));
|
||||
const padLeftZero = (string, length) => {
|
||||
return Array(length - string.length + 1).join('0') + string;
|
||||
};
|
||||
const intToHex = (integer, byteLength) => {
|
||||
return padLeftZero(Number(integer).toString(16), byteLength * 2);
|
||||
};
|
||||
const bytesToHex = (bytes) => {
|
||||
return Buffer.from(bytes).toString('hex');
|
||||
};
|
||||
const bigintToHex = (integerString, byteLength) => {
|
||||
const hex = new bignumber_js_1.default(integerString).toString(16);
|
||||
return padLeftZero(hex, byteLength * 2);
|
||||
};
|
||||
const ledgerSpaceHex = (name) => {
|
||||
return intToHex(ledgerspaces_1.default[name].charCodeAt(0), 2);
|
||||
};
|
||||
const addressToHex = (address) => {
|
||||
return Buffer.from(ripple_address_codec_1.decodeAccountID(address)).toString('hex');
|
||||
};
|
||||
const currencyToHex = (currency) => {
|
||||
if (currency.length === 3) {
|
||||
const bytes = new Array(20 + 1).join('0').split('').map(parseFloat);
|
||||
bytes[12] = currency.charCodeAt(0) & 0xff;
|
||||
bytes[13] = currency.charCodeAt(1) & 0xff;
|
||||
bytes[14] = currency.charCodeAt(2) & 0xff;
|
||||
return bytesToHex(bytes);
|
||||
}
|
||||
return currency;
|
||||
};
|
||||
const addLengthPrefix = (hex) => {
|
||||
const length = hex.length / 2;
|
||||
if (length <= 192) {
|
||||
return bytesToHex([length]) + hex;
|
||||
}
|
||||
else if (length <= 12480) {
|
||||
const x = length - 193;
|
||||
return bytesToHex([193 + (x >>> 8), x & 0xff]) + hex;
|
||||
}
|
||||
else if (length <= 918744) {
|
||||
const x = length - 12481;
|
||||
return bytesToHex([241 + (x >>> 16), (x >>> 8) & 0xff, x & 0xff]) + hex;
|
||||
}
|
||||
throw new Error('Variable integer overflow.');
|
||||
};
|
||||
exports.computeBinaryTransactionHash = (txBlobHex) => {
|
||||
const prefix = hash_prefix_1.default.TRANSACTION_ID.toString(16).toUpperCase();
|
||||
return sha512Half_1.default(prefix + txBlobHex);
|
||||
};
|
||||
exports.computeTransactionHash = (txJSON) => {
|
||||
return exports.computeBinaryTransactionHash(ripple_binary_codec_1.encode(txJSON));
|
||||
};
|
||||
exports.computeBinaryTransactionSigningHash = (txBlobHex) => {
|
||||
const prefix = hash_prefix_1.default.TRANSACTION_SIGN.toString(16).toUpperCase();
|
||||
return sha512Half_1.default(prefix + txBlobHex);
|
||||
};
|
||||
exports.computeAccountLedgerObjectID = (address) => {
|
||||
return sha512Half_1.default(ledgerSpaceHex('account') + addressToHex(address));
|
||||
};
|
||||
exports.computeSignerListLedgerObjectID = (address) => {
|
||||
return sha512Half_1.default(ledgerSpaceHex('signerList') + addressToHex(address) + '00000000');
|
||||
};
|
||||
exports.computeOrderID = (address, sequence) => {
|
||||
const prefix = '00' + intToHex(ledgerspaces_1.default.offer.charCodeAt(0), 1);
|
||||
return sha512Half_1.default(prefix + addressToHex(address) + intToHex(sequence, 4));
|
||||
};
|
||||
exports.computeTrustlineHash = (address1, address2, currency) => {
|
||||
const address1Hex = addressToHex(address1);
|
||||
const address2Hex = addressToHex(address2);
|
||||
const swap = new bignumber_js_1.default(address1Hex, 16).isGreaterThan(new bignumber_js_1.default(address2Hex, 16));
|
||||
const lowAddressHex = swap ? address2Hex : address1Hex;
|
||||
const highAddressHex = swap ? address1Hex : address2Hex;
|
||||
const prefix = ledgerSpaceHex('rippleState');
|
||||
return sha512Half_1.default(prefix + lowAddressHex + highAddressHex + currencyToHex(currency));
|
||||
};
|
||||
exports.computeTransactionTreeHash = (transactions) => {
|
||||
const shamap = new shamap_1.SHAMap();
|
||||
transactions.forEach((txJSON) => {
|
||||
const txBlobHex = ripple_binary_codec_1.encode(txJSON);
|
||||
const metaHex = ripple_binary_codec_1.encode(txJSON.metaData);
|
||||
const txHash = exports.computeBinaryTransactionHash(txBlobHex);
|
||||
const data = addLengthPrefix(txBlobHex) + addLengthPrefix(metaHex);
|
||||
shamap.addItem(txHash, data, shamap_1.NodeType.TRANSACTION_METADATA);
|
||||
});
|
||||
return shamap.hash;
|
||||
};
|
||||
exports.computeStateTreeHash = (entries) => {
|
||||
const shamap = new shamap_1.SHAMap();
|
||||
entries.forEach((ledgerEntry) => {
|
||||
const data = ripple_binary_codec_1.encode(ledgerEntry);
|
||||
shamap.addItem(ledgerEntry.index, data, shamap_1.NodeType.ACCOUNT_STATE);
|
||||
});
|
||||
return shamap.hash;
|
||||
};
|
||||
exports.computeLedgerHash = (ledgerHeader) => {
|
||||
const prefix = hash_prefix_1.default.LEDGER.toString(16).toUpperCase();
|
||||
return sha512Half_1.default(prefix +
|
||||
intToHex(ledgerHeader.ledger_index, 4) +
|
||||
bigintToHex(ledgerHeader.total_coins, 8) +
|
||||
ledgerHeader.parent_hash +
|
||||
ledgerHeader.transaction_hash +
|
||||
ledgerHeader.account_hash +
|
||||
intToHex(ledgerHeader.parent_close_time, 4) +
|
||||
intToHex(ledgerHeader.close_time, 4) +
|
||||
intToHex(ledgerHeader.close_time_resolution, 1) +
|
||||
intToHex(ledgerHeader.close_flags, 1));
|
||||
};
|
||||
exports.computeEscrowHash = (address, sequence) => {
|
||||
return sha512Half_1.default(ledgerSpaceHex('escrow') + addressToHex(address) + intToHex(sequence, 4));
|
||||
};
|
||||
exports.computePaymentChannelHash = (address, dstAddress, sequence) => {
|
||||
return sha512Half_1.default(ledgerSpaceHex('paychan') +
|
||||
addressToHex(address) +
|
||||
addressToHex(dstAddress) +
|
||||
intToHex(sequence, 4));
|
||||
};
|
||||
//# sourceMappingURL=index.js.map
|
||||
+1
File diff suppressed because one or more lines are too long
+21
@@ -0,0 +1,21 @@
|
||||
declare const _default: {
|
||||
account: string;
|
||||
dirNode: string;
|
||||
generatorMap: string;
|
||||
rippleState: string;
|
||||
offer: string;
|
||||
ownerDir: string;
|
||||
bookDir: string;
|
||||
contract: string;
|
||||
skipList: string;
|
||||
escrow: string;
|
||||
amendment: string;
|
||||
feeSettings: string;
|
||||
ticket: string;
|
||||
signerList: string;
|
||||
paychan: string;
|
||||
check: string;
|
||||
depositPreauth: string;
|
||||
};
|
||||
export default _default;
|
||||
//# sourceMappingURL=ledgerspaces.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ledgerspaces.d.ts","sourceRoot":"","sources":["../../../../src/common/hashes/ledgerspaces.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAUA,wBAkBC"}
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.default = {
|
||||
account: 'a',
|
||||
dirNode: 'd',
|
||||
generatorMap: 'g',
|
||||
rippleState: 'r',
|
||||
offer: 'o',
|
||||
ownerDir: 'O',
|
||||
bookDir: 'B',
|
||||
contract: 'c',
|
||||
skipList: 's',
|
||||
escrow: 'u',
|
||||
amendment: 'f',
|
||||
feeSettings: 'e',
|
||||
ticket: 'T',
|
||||
signerList: 'S',
|
||||
paychan: 'x',
|
||||
check: 'C',
|
||||
depositPreauth: 'p'
|
||||
};
|
||||
//# sourceMappingURL=ledgerspaces.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ledgerspaces.js","sourceRoot":"","sources":["../../../../src/common/hashes/ledgerspaces.ts"],"names":[],"mappings":";;AAUA,kBAAe;IACb,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,GAAG;IACZ,YAAY,EAAE,GAAG;IACjB,WAAW,EAAE,GAAG;IAChB,KAAK,EAAE,GAAG;IACV,QAAQ,EAAE,GAAG;IACb,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG;IACb,QAAQ,EAAE,GAAG;IACb,MAAM,EAAE,GAAG;IACX,SAAS,EAAE,GAAG;IACd,WAAW,EAAE,GAAG;IAChB,MAAM,EAAE,GAAG;IACX,UAAU,EAAE,GAAG;IACf,OAAO,EAAE,GAAG;IACZ,KAAK,EAAE,GAAG;IACV,cAAc,EAAE,GAAG;CACpB,CAAA"}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
declare const sha512Half: (hex: string) => string;
|
||||
export default sha512Half;
|
||||
//# sourceMappingURL=sha512Half.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"sha512Half.d.ts","sourceRoot":"","sources":["../../../../src/common/hashes/sha512Half.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,UAAU,QAAS,MAAM,KAAG,MAMjC,CAAA;AAED,eAAe,UAAU,CAAA"}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const crypto_1 = require("crypto");
|
||||
const sha512Half = (hex) => {
|
||||
return crypto_1.createHash('sha512')
|
||||
.update(Buffer.from(hex, 'hex'))
|
||||
.digest('hex')
|
||||
.toUpperCase()
|
||||
.slice(0, 64);
|
||||
};
|
||||
exports.default = sha512Half;
|
||||
//# sourceMappingURL=sha512Half.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"sha512Half.js","sourceRoot":"","sources":["../../../../src/common/hashes/sha512Half.ts"],"names":[],"mappings":";;AAAA,mCAAiC;AAEjC,MAAM,UAAU,GAAG,CAAC,GAAW,EAAU,EAAE;IACzC,OAAO,mBAAU,CAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;SAC/B,MAAM,CAAC,KAAK,CAAC;SACb,WAAW,EAAE;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AACjB,CAAC,CAAA;AAED,kBAAe,UAAU,CAAA"}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
export declare enum NodeType {
|
||||
INNER = 1,
|
||||
TRANSACTION_NO_METADATA = 2,
|
||||
TRANSACTION_METADATA = 3,
|
||||
ACCOUNT_STATE = 4
|
||||
}
|
||||
export declare abstract class Node {
|
||||
constructor();
|
||||
addItem(_tag: string, _node: Node): void;
|
||||
get hash(): string | void;
|
||||
}
|
||||
export declare class InnerNode extends Node {
|
||||
leaves: {
|
||||
[slot: number]: Node;
|
||||
};
|
||||
type: NodeType;
|
||||
depth: number;
|
||||
empty: boolean;
|
||||
constructor(depth?: number);
|
||||
addItem(tag: string, node: Node): void;
|
||||
setNode(slot: number, node: Node): void;
|
||||
getNode(slot: number): Node;
|
||||
get hash(): string;
|
||||
}
|
||||
export declare class Leaf extends Node {
|
||||
tag: string;
|
||||
type: NodeType;
|
||||
data: string;
|
||||
constructor(tag: string, data: string, type: NodeType);
|
||||
get hash(): string | void;
|
||||
}
|
||||
export declare class SHAMap {
|
||||
root: InnerNode;
|
||||
constructor();
|
||||
addItem(tag: string, data: string, type: NodeType): void;
|
||||
get hash(): string;
|
||||
}
|
||||
//# sourceMappingURL=shamap.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"shamap.d.ts","sourceRoot":"","sources":["../../../../src/common/hashes/shamap.ts"],"names":[],"mappings":"AAKA,oBAAY,QAAQ;IAClB,KAAK,IAAI;IACT,uBAAuB,IAAI;IAC3B,oBAAoB,IAAI;IACxB,aAAa,IAAI;CAClB;AAED,8BAAsB,IAAI;;IAQjB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,IAAI;IAK/C,IAAW,IAAI,IAAI,MAAM,GAAG,IAAI,CAE/B;CACF;AAED,qBAAa,SAAU,SAAQ,IAAI;IAC1B,MAAM,EAAE;QAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAC,CAAA;IAC9B,IAAI,EAAE,QAAQ,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,OAAO,CAAA;gBAOF,KAAK,GAAE,MAAU;IAc7B,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI;IAqCtC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI;IAavC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOlC,IAAW,IAAI,IAAI,MAAM,CAQxB;CACF;AAED,qBAAa,IAAK,SAAQ,IAAI;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,QAAQ,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;gBASA,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ;IAO5D,IAAW,IAAI,IAAI,MAAM,GAAG,IAAI,CAiB/B;CACF;AAED,qBAAa,MAAM;IACV,IAAI,EAAE,SAAS,CAAA;;IAUf,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI;IAI/D,IAAW,IAAI,IAAI,MAAM,CAExB;CACF"}
|
||||
+121
@@ -0,0 +1,121 @@
|
||||
"use strict";
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.SHAMap = exports.Leaf = exports.InnerNode = exports.Node = exports.NodeType = void 0;
|
||||
const hash_prefix_1 = __importDefault(require("./hash-prefix"));
|
||||
const sha512Half_1 = __importDefault(require("./sha512Half"));
|
||||
const HEX_ZERO = '0000000000000000000000000000000000000000000000000000000000000000';
|
||||
var NodeType;
|
||||
(function (NodeType) {
|
||||
NodeType[NodeType["INNER"] = 1] = "INNER";
|
||||
NodeType[NodeType["TRANSACTION_NO_METADATA"] = 2] = "TRANSACTION_NO_METADATA";
|
||||
NodeType[NodeType["TRANSACTION_METADATA"] = 3] = "TRANSACTION_METADATA";
|
||||
NodeType[NodeType["ACCOUNT_STATE"] = 4] = "ACCOUNT_STATE";
|
||||
})(NodeType = exports.NodeType || (exports.NodeType = {}));
|
||||
class Node {
|
||||
constructor() { }
|
||||
addItem(_tag, _node) {
|
||||
throw new Error('Called unimplemented virtual method SHAMapTreeNode#addItem.');
|
||||
}
|
||||
get hash() {
|
||||
throw new Error('Called unimplemented virtual method SHAMapTreeNode#hash.');
|
||||
}
|
||||
}
|
||||
exports.Node = Node;
|
||||
class InnerNode extends Node {
|
||||
constructor(depth = 0) {
|
||||
super();
|
||||
this.leaves = {};
|
||||
this.type = NodeType.INNER;
|
||||
this.depth = depth;
|
||||
this.empty = true;
|
||||
}
|
||||
addItem(tag, node) {
|
||||
const existingNode = this.getNode(parseInt(tag[this.depth], 16));
|
||||
if (existingNode) {
|
||||
if (existingNode instanceof InnerNode) {
|
||||
existingNode.addItem(tag, node);
|
||||
}
|
||||
else if (existingNode instanceof Leaf) {
|
||||
if (existingNode.tag === tag) {
|
||||
throw new Error('Tried to add a node to a SHAMap that was already in there.');
|
||||
}
|
||||
else {
|
||||
const newInnerNode = new InnerNode(this.depth + 1);
|
||||
newInnerNode.addItem(existingNode.tag, existingNode);
|
||||
newInnerNode.addItem(tag, node);
|
||||
this.setNode(parseInt(tag[this.depth], 16), newInnerNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
this.setNode(parseInt(tag[this.depth], 16), node);
|
||||
}
|
||||
}
|
||||
setNode(slot, node) {
|
||||
if (slot < 0 || slot > 15) {
|
||||
throw new Error('Invalid slot: slot must be between 0-15.');
|
||||
}
|
||||
this.leaves[slot] = node;
|
||||
this.empty = false;
|
||||
}
|
||||
getNode(slot) {
|
||||
if (slot < 0 || slot > 15) {
|
||||
throw new Error('Invalid slot: slot must be between 0-15.');
|
||||
}
|
||||
return this.leaves[slot];
|
||||
}
|
||||
get hash() {
|
||||
if (this.empty)
|
||||
return HEX_ZERO;
|
||||
let hex = '';
|
||||
for (let i = 0; i < 16; i++) {
|
||||
hex += this.leaves[i] ? this.leaves[i].hash : HEX_ZERO;
|
||||
}
|
||||
const prefix = hash_prefix_1.default.INNER_NODE.toString(16);
|
||||
return sha512Half_1.default(prefix + hex);
|
||||
}
|
||||
}
|
||||
exports.InnerNode = InnerNode;
|
||||
class Leaf extends Node {
|
||||
constructor(tag, data, type) {
|
||||
super();
|
||||
this.tag = tag;
|
||||
this.type = type;
|
||||
this.data = data;
|
||||
}
|
||||
get hash() {
|
||||
switch (this.type) {
|
||||
case NodeType.ACCOUNT_STATE: {
|
||||
const leafPrefix = hash_prefix_1.default.LEAF_NODE.toString(16);
|
||||
return sha512Half_1.default(leafPrefix + this.data + this.tag);
|
||||
}
|
||||
case NodeType.TRANSACTION_NO_METADATA: {
|
||||
const txIDPrefix = hash_prefix_1.default.TRANSACTION_ID.toString(16);
|
||||
return sha512Half_1.default(txIDPrefix + this.data);
|
||||
}
|
||||
case NodeType.TRANSACTION_METADATA: {
|
||||
const txNodePrefix = hash_prefix_1.default.TRANSACTION_NODE.toString(16);
|
||||
return sha512Half_1.default(txNodePrefix + this.data + this.tag);
|
||||
}
|
||||
default:
|
||||
throw new Error('Tried to hash a SHAMap node of unknown type.');
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.Leaf = Leaf;
|
||||
class SHAMap {
|
||||
constructor() {
|
||||
this.root = new InnerNode(0);
|
||||
}
|
||||
addItem(tag, data, type) {
|
||||
this.root.addItem(tag, new Leaf(tag, data, type));
|
||||
}
|
||||
get hash() {
|
||||
return this.root.hash;
|
||||
}
|
||||
}
|
||||
exports.SHAMap = SHAMap;
|
||||
//# sourceMappingURL=shamap.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"shamap.js","sourceRoot":"","sources":["../../../../src/common/hashes/shamap.ts"],"names":[],"mappings":"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"}
|
||||
Reference in New Issue
Block a user