/*! * layout.js - blockchain data layout for bcoin * Copyright (c) 2014-2017, Christopher Jeffrey (MIT License). * https://github.com/bcoin-org/bcoin */ 'use strict'; /* * Database Layout: * R -> tip hash * O -> chain options * e[hash] -> entry * h[hash] -> height * H[height] -> hash * n[hash] -> next hash * p[hash] -> tip index * b[hash] -> block * t[hash] -> extended tx * c[hash] -> coins * u[hash] -> undo coins * v -> versionbits deployments * v[bit][hash] -> versionbits state * T[addr-hash][hash] -> dummy (tx by address) * C[addr-hash][hash][index] -> dummy (coin by address) * W+T[witaddr-hash][hash] -> dummy (tx by address) * W+C[witaddr-hash][hash][index] -> dummy (coin by address) */ var layout = { binary: true, R: new Buffer([0x52]), O: new Buffer([0x4f]), V: new Buffer([0x76]), e: function e(hash) { return pair(0x65, hash); }, h: function h(hash) { return pair(0x68, hash); }, H: function H(height) { return ipair(0x48, height); }, n: function n(hash) { return pair(0x6e, hash); }, p: function p(hash) { return pair(0x70, hash); }, b: function b(hash) { return pair(0x62, hash); }, t: function t(hash) { return pair(0x74, hash); }, c: function c(hash) { return pair(0x63, hash); }, u: function u(hash) { return pair(0x75, hash); }, v: function v(bit, hash) { var key = new Buffer(1 + 1 + 32); key[0] = 0x76; key[1] = bit; write(key, hash, 2); return key; }, vv: function vv(key) { return [key[1], key.toString('hex', 2, 34)]; }, T: function T(address, hash) { var len = address.length; var key; if (typeof address === 'string') len /= 2; if (len === 32) { key = new Buffer(65); key[0] = 0xab; // W + T write(key, address, 1); write(key, hash, 33); } else { key = new Buffer(53); key[0] = 0x54; // T write(key, address, 1); write(key, hash, 21); } return key; }, C: function C(address, hash, index) { var len = address.length; var key; if (typeof address === 'string') len /= 2; if (len === 32) { key = new Buffer(69); key[0] = 0x9a; // W + C write(key, address, 1); write(key, hash, 33); key.writeUInt32BE(index, 65, true); } else { key = new Buffer(57); key[0] = 0x43; // C write(key, address, 1); write(key, hash, 21); key.writeUInt32BE(index, 53, true); } return key; }, pp: function aa(key) { return key.toString('hex', 1, 33); }, Cc: function Cc(key) { var hash, index; if (key.length === 69) { hash = key.toString('hex', 33, 65); index = key.readUInt32BE(65, 0); } else { hash = key.toString('hex', 21, 53); index = key.readUInt32BE(53, 0); } return [hash, index]; }, Tt: function Tt(key) { return key.length === 65 ? key.toString('hex', 33, 65) : key.toString('hex', 21, 53); } }; /* * Helpers */ function write(data, str, off) { if (Buffer.isBuffer(str)) return str.copy(data, off); data.write(str, off, 'hex'); } function pair(prefix, hash) { var key = new Buffer(33); key[0] = prefix; write(key, hash, 1); return key; } function ipair(prefix, num) { var key = new Buffer(5); key[0] = prefix; key.writeUInt32BE(num, 1, true); return key; } /* * Expose */ module.exports = layout;