diff --git a/backend/src/api/disk-cache.ts b/backend/src/api/disk-cache.ts index 0774f0904..ec14ca076 100644 --- a/backend/src/api/disk-cache.ts +++ b/backend/src/api/disk-cache.ts @@ -9,6 +9,8 @@ import { TransactionExtended } from '../mempool.interfaces'; import { Common } from './common'; class DiskCache { + private cacheSchemaVersion = 1; + private static FILE_NAME = config.MEMPOOL.CACHE_DIR + '/cache.json'; private static FILE_NAMES = config.MEMPOOL.CACHE_DIR + '/cache{number}.json'; private static CHUNK_FILES = 25; @@ -57,6 +59,13 @@ class DiskCache { } } + wipeCache() { + fs.unlinkSync(DiskCache.FILE_NAME); + for (let i = 1; i < DiskCache.CHUNK_FILES; i++) { + fs.unlinkSync(DiskCache.FILE_NAMES.replace('{number}', i.toString())); + } + } + loadMempoolCache() { if (!fs.existsSync(DiskCache.FILE_NAME)) { return; @@ -67,6 +76,11 @@ class DiskCache { if (cacheData) { logger.info('Restoring mempool and blocks data from disk cache'); data = JSON.parse(cacheData); + if (data.cacheSchemaVersion === undefined || data.cacheSchemaVersion !== this.cacheSchemaVersion) { + logger.notice('Disk cache contains an outdated schema version. Clearing it and skipping the cache loading.'); + return this.wipeCache(); + } + if (data.mempoolArray) { for (const tx of data.mempoolArray) { data.mempool[tx.txid] = tx; diff --git a/frontend/src/app/docs/api-docs/api-docs-data.ts b/frontend/src/app/docs/api-docs/api-docs-data.ts index c876a67ae..eb98c6596 100644 --- a/frontend/src/app/docs/api-docs/api-docs-data.ts +++ b/frontend/src/app/docs/api-docs/api-docs-data.ts @@ -2672,48 +2672,216 @@ export const restApiDocsData = [ fragment: "get-blocks", title: "GET Blocks", description: { - default: "Returns details on the past 10 blocks. If :startHeight is specified, the past 10 blocks before (and including) :startHeight are returned." + default: "Returns details on the past 15 blocks with fee and mining details in an extras field. If :startHeight is specified, the past 15 blocks before (and including) :startHeight are returned." }, - urlString: "/blocks[/:startHeight]", - showConditions: bitcoinNetworks.concat(liquidNetworks).concat(["bisq"]), + urlString: "/v1/blocks[/:startHeight]", + showConditions: bitcoinNetworks, showJsExamples: showJsExamplesDefault, codeExample: { - bisq: { + default: { codeTemplate: { - curl: `/api/blocks/%{1}/%{2}`, + curl: `/api/v1/blocks/%{1}`, commonJS: ` const { %{0}: { blocks } } = mempoolJS(); - const getBlocks = await blocks.getBlocks({ index: %{1}, length: %{2} }); + const getBlocks = await blocks.getBlocks({ startHeight: %{1} }); document.getElementById("result").textContent = JSON.stringify(getBlocks, undefined, 2); `, esModule: ` const { %{0}: { blocks } } = mempoolJS(); - const getBlocks = await blocks.getBlocks({ index: %{1}, length: %{2} }); + const getBlocks = await blocks.getBlocks({ startHeight: %{1} }); console.log(getBlocks); `, }, - codeSampleMainnet: emptyCodeSample, - codeSampleTestnet: emptyCodeSample, - codeSampleSignet: emptyCodeSample, - codeSampleLiquid: emptyCodeSample, - codeSampleBisq: { - esModule: ['0', '1'], - commonJS: ['0', '1'], - curl: ['0', '1'], + codeSampleMainnet: { + esModule: ['730000'], + commonJS: ['730000'], + curl: ['730000'], response: `[ { - height: 698771, - time: 1630636953000, - hash: "0000000000000000000a33c6ac863eee8c76ca72435f25d679609c0949ac9374", - previousBlockHash: "00000000000000000001e4184639e5600d3fb4c4e06c2a625e76804c4bc93cb1", - txs: [] - } + "id": "0000000000000000000384f28cb3b9cf4377a39cfd6c29ae9466951de38c0529", + "timestamp": 1648829449, + "height": 730000, + "version": 536870912, + "bits": 386521239, + "nonce": 3580664066, + "difficulty": 28587155782195.14, + "merkle_root": "efa344bcd6c0607f93b709515dd6dc5496178112d680338ebea459e3de7b4fbc", + "tx_count": 1627, + "size": 1210916, + "weight": 3993515, + "previousblockhash": "00000000000000000008b6f6fb83f8d74512ef1e0af29e642dd20daddd7d318f", + "extras": { + "coinbaseRaw": "0390230b1362696e616e63652f383038e0006f02cd583765fabe6d6d686355577affaad03015e732428a927a5d2d842471b350394139616bcb4401d804000000000000001a750000c9ad0000", + "medianFee": 11, + "feeRange": [ + 1, + 11, + 11, + 11, + 18, + 21, + 660 + ], + "reward": 641321983, + "totalFees": 16321983, + "avgFee": 10038, + "avgFeeRate": 16, + "pool": { + "id": 105, + "name": "Binance Pool", + "slug": "binancepool" + } + } + }, + { + "id": "00000000000000000008b6f6fb83f8d74512ef1e0af29e642dd20daddd7d318f", + "timestamp": 1648828946, + "height": 729999, + "version": 793796608, + "bits": 386521239, + "nonce": 3477019455, + "difficulty": 28587155782195.14, + "merkle_root": "d84f9cc1823bd069c505061b1f6faabd809d67ab5354e9f6234312dc4bdb1ecf", + "tx_count": 2574, + "size": 1481957, + "weight": 3993485, + "previousblockhash": "000000000000000000071e6c86c2175aa86817cae2a77acd95372b55c1103d89", + "extras": { + "coinbaseRaw": "038f230b1362696e616e63652f373739d8002900ca5de7a9fabe6d6dda31112c36c10a523154eae76847579755cd4ae558ee2e6f9f200b05dd32a0bf04000000000000006372000000020000", + "medianFee": 17, + "feeRange": [ + 2, + 11, + 14, + 17, + 19, + 28, + 502 + ], + "reward": 649090210, + "totalFees": 24090210, + "avgFee": 9362, + "avgFeeRate": 24, + "pool": { + "id": 105, + "name": "Binance Pool", + "slug": "binancepool" + } + } + }, + ... +]`, + }, + codeSampleTestnet: { + esModule: ['2091187'], + commonJS: ['2091187'], + curl: ['2091187'], + response: `[ + { + "id": "00000000000000533f63df886281a9fd74da163e84a21445153ff480e5f57970", + "timestamp": 1630641890, + "height": 2091187, + "version": 545259520, + "bits": 436273151, + "nonce": 309403673, + "difficulty": 16777216, + "merkle_root": "4d6df12a4af11bb928c7b2930e0a4d2c3e268c6dc6a07462943ad1c4b6b96468", + "tx_count": 26, + "size": 8390, + "weight": 22985, + "previousblockhash": "0000000000000079103da7d296e1480295df795b7379e7dffd27743e214b0b32", + "extras": { + "coinbaseRaw": "03b3e81f3a205468697320626c6f636b20776173206d696e65642077697468206120636172626f6e206e6567617469766520706f77657220736f75726365201209687a2009092009020de601d7986a040000", + "medianFee": 1, + "feeRange": [ + 1, + 1, + 1, + 1, + 5, + 56, + 5053 + ], + "reward": 10547567, + "totalFees": 781942, + "avgFee": 31277, + "avgFeeRate": 143, + "pool": { + "id": 137, + "name": "Unknown", + "slug": "unknown" + } + } + }, + ... ]` }, - }, + codeSampleSignet: { + esModule: ['53783'], + commonJS: ['53783'], + curl: ['53783'], + response: `[ + { + "id": "0000010eeacb878340bae34af4e13551413d76a172ec302f7e50b62cb45374f2", + "timestamp": 1630641504, + "height": 53783, + "version": 536870912, + "bits": 503404179, + "nonce": 11753379, + "difficulty": 0.002919030932507782, + "merkle_root": "3063ff3802c920eea68bdc9303957f3e7bfd0a03c93547fd7dad14b77a07d4e8", + "tx_count": 1, + "size": 343, + "weight": 1264, + "previousblockhash": "00000109a7ea774fcc2d173f9a1da9595a47ff401dac67ca9edea149954210fa", + "extras": { + "coinbaseRaw": "0317d200", + "medianFee": 0, + "feeRange": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "reward": 5000000000, + "totalFees": 0, + "avgFee": 0, + "avgFeeRate": 0, + "pool": { + "id": 137, + "name": "Unknown", + "slug": "unknown" + } + } + }, + ... +]` + }, + codeSampleLiquid: emptyCodeSample, + codeSampleLiquidTestnet: emptyCodeSample, + codeSampleBisq: emptyCodeSample, + } + } + }, + { + type: "endpoint", + category: "blocks", + httpRequestMethod: "GET", + fragment: "get-blocks", + title: "GET Blocks", + description: { + default: "Returns details on the past 10 blocks with fee and mining details in an extras field. If :startHeight is specified, the past 10 blocks before (and including) :startHeight are returned." + }, + urlString: "/blocks[/:startHeight]", + showConditions: liquidNetworks, + showJsExamples: showJsExamplesDefault, + codeExample: { default: { codeTemplate: { curl: `/api/blocks/%{1}`, @@ -2731,75 +2899,9 @@ export const restApiDocsData = [ console.log(getBlocks); `, }, - codeSampleMainnet: { - esModule: ['698777'], - commonJS: ['698777'], - curl: ['698777'], - response: `[ - { - id: "00000000000000000003002915e015c47610c55b6f0228ad62bfcc59b65e67b7", - height: 698777, - version: 536870916, - timestamp: 1630641711, - tx_count: 2327, - size: 1466537, - weight: 3999653, - merkle_root: "023e27dde144eedc65ff3b27c535ebc7dced6c49fe78f94cdf85cf2000608d2f", - previousblockhash: "0000000000000000000701a7f14e362d3f10aa524200db1710ce3bbf0c0f8b75", - mediantime: 1630636986, - nonce: 1926094388, - bits: 386923168, - difficulty: 17615033039278 - }, - ... -]` - }, - codeSampleTestnet: { - esModule: ['2091187'], - commonJS: ['2091187'], - curl: ['2091187'], - response: `[ - { - id: "00000000000000533f63df886281a9fd74da163e84a21445153ff480e5f57970", - height: 2091187, - version: 545259520, - timestamp: 1630641890, - tx_count: 26, - size: 8390, - weight: 22985, - merkle_root: "4d6df12a4af11bb928c7b2930e0a4d2c3e268c6dc6a07462943ad1c4b6b96468", - previousblockhash: "0000000000000079103da7d296e1480295df795b7379e7dffd27743e214b0b32", - mediantime: 1630639627, - nonce: 309403673, - bits: 436273151, - difficulty: 16777216 - }, - ... -]` - }, - codeSampleSignet: { - esModule: ['53783'], - commonJS: ['53783'], - curl: ['53783'], - response: `[ - { - id: "0000010eeacb878340bae34af4e13551413d76a172ec302f7e50b62cb45374f2", - height: 53783, - version: 536870912, - timestamp: 1630641504, - tx_count: 1, - size: 343, - weight: 1264, - merkle_root: "3063ff3802c920eea68bdc9303957f3e7bfd0a03c93547fd7dad14b77a07d4e8", - previousblockhash: "00000109a7ea774fcc2d173f9a1da9595a47ff401dac67ca9edea149954210fa", - mediantime: 1630638966, - nonce: 11753379, - bits: 503404179, - difficulty: 0 - }, - ... -]` - }, + codeSampleMainnet: emptyCodeSample, + codeSampleTestnet: emptyCodeSample, + codeSampleSignet: emptyCodeSample, codeSampleLiquid: { esModule: ['1472246'], commonJS: ['1472246'], @@ -2848,144 +2950,79 @@ export const restApiDocsData = [ type: "endpoint", category: "blocks", httpRequestMethod: "GET", - fragment: "get-blocks-extras", - title: "GET Blocks Extras", + fragment: "get-blocks", + title: "GET Blocks", description: { - default: "Returns details on the past 15 blocks with fee and mining details in an extras field. If :startHeight is specified, the past 15 blocks before (and including) :startHeight are returned." + default: "

Returns the past n blocks with BSQ transactions starting m blocks ago.

Assume a block height of 700,000. Query /blocks/0/10 for the past 10 blocks before 700,000 with BSQ transactions. Query /blocks/1000/10 for the past 10 blocks before 699,000 with BSQ transactions." }, - urlString: "/blocks-extras[/:startHeight]", - showConditions: bitcoinNetworks, - showJsExamples: showJsExamplesDefaultFalse, + urlString: "/blocks/:m/:n", + showConditions: ["bisq"], + showJsExamples: showJsExamplesDefault, codeExample: { default: { codeTemplate: { - curl: `/api/blocks-extras/%{1}`, - commonJS: ``, - esModule: `` - }, - codeSampleMainnet: { - esModule: [], - commonJS: [], - curl: ['736915'], - response: `[ - { - "extras": { - "reward": 629766074, - "coinbaseTx": { - "vin": [ - { - "scriptsig": "03933e0b215c204d41524120506f6f6c205c00000000be82a250e5ef942790d2542ca87d0000" - } - ], - "vout": [ - { - "scriptpubkey_address": "1A32KFEX7JNPmU1PVjrtiXRrTQcesT3Nf1", - "value": 629766074 - } - ] - }, - "coinbaseRaw": "03933e0b215c204d41524120506f6f6c205c00000000be82a250e5ef942790d2542ca87d0000", - "medianFee": 14, - "feeRange": [ - 1, - 1, - 4, - 14, - 15, - 20, - 364 - ], - "totalFees": 4766074, - "avgFee": 5043, - "avgFeeRate": 14, - "pool": { - "id": 115, - "name": "MARA Pool", - "slug": "marapool" - }, - "matchRate": 100 - }, - "id": "00000000000000000000a742ae476dbe2a58c48b193484945c52b05967f2d74c", - "height": 736915, - "version": 541065216, - "timestamp": 1652877171, - "bits": 386466234, - "nonce": 4069175824, - "difficulty": 31251101365711.12, - "merkle_root": "de54fd1adee9f010534e8efbf1244a01528e20dd283c8927026f5442c3e03459", - "tx_count": 946, - "size": 524907, - "weight": 1362339, - "previousblockhash": "000000000000000000070760a253405ca69498464d9f8e9fab2452cbbfc10cbe" - }, - { - "extras": { - "reward": 638804415, - "coinbaseTx": { - "vin": [ - { - "scriptsig": "03923e0bfabe6d6dc3e96cee3cb68ee52bd31fde8e1f4983a780ea836115788d81a559e03791071f01000000000000001065040008d708c7010000000000007a6d4683012f736c7573682f" - } - ], - "vout": [ - { - "scriptpubkey_address": "1CK6KHY6MHgYvmRQ4PAafKYDrg1ejbH1cE", - "value": 638804415 - } - ] - }, - "coinbaseRaw": "03923e0bfabe6d6dc3e96cee3cb68ee52bd31fde8e1f4983a780ea836115788d81a559e03791071f01000000000000001065040008d708c7010000000000007a6d4683012f736c7573682f", - "medianFee": 14, - "feeRange": [ - 1, - 1, - 2, - 14, - 15, - 20, - 347 - ], - "totalFees": 13804415, - "avgFee": 5287, - "avgFeeRate": 14, - "pool": { - "id": 43, - "name": "SlushPool", - "slug": "slushpool" - }, - "matchRate": 100 - }, - "id": "000000000000000000070760a253405ca69498464d9f8e9fab2452cbbfc10cbe", - "height": 736914, - "version": 555696132, - "timestamp": 1652876939, - "bits": 386466234, - "nonce": 3839610443, - "difficulty": 31251101365711.12, - "merkle_root": "dc6d15f641e7af26dbaf3ee37203155f8053a8755e85f4955d11ea0c54008b16", - "tx_count": 2612, - "size": 1450209, - "weight": 3931749, - "previousblockhash": "00000000000000000002b5b2afc1c62e61e53f966b965a9a8ce99112e24066ae" - }, - ... -]`, - }, - codeSampleTestnet: { - esModule: [], - commonJS: [], - curl: ['2226118'], - response: `[]` - }, - codeSampleSignet: { - esModule: [], - commonJS: [], - curl: ['88832'], - response: `[]` + curl: `/api/blocks/%{1}/%{2}`, + commonJS: ` + const { %{0}: { blocks } } = mempoolJS(); + + const getBlocks = await blocks.getBlocks({ index: %{1}, length: %{2} }); + + document.getElementById("result").textContent = JSON.stringify(getBlocks, undefined, 2); + `, + esModule: ` + const { %{0}: { blocks } } = mempoolJS(); + + const getBlocks = await blocks.getBlocks({ index: %{1}, length: %{2} }); + console.log(getBlocks); + `, }, + codeSampleMainnet: emptyCodeSample, + codeSampleTestnet: emptyCodeSample, + codeSampleSignet: emptyCodeSample, codeSampleLiquid: emptyCodeSample, codeSampleLiquidTestnet: emptyCodeSample, - codeSampleBisq: emptyCodeSample, + codeSampleBisq: { + esModule: ['0', '5'], + commonJS: ['0', '5'], + curl: ['0', '5'], + response: `[ + { + "height": 739030, + "time": 1654203258000, + "hash": "000000000000000000036bc04416ddeec264cbb977a9cd9e454897acb547b601", + "previousBlockHash": "00000000000000000000f49261617b589d76e5e70529ea1d4c16f3e19ddcb8ef", + "txs": [ ... ], + }, + { + "height": 739029, + "time": 1654203236000, + "hash": "00000000000000000000f49261617b589d76e5e70529ea1d4c16f3e19ddcb8ef", + "previousBlockHash": "00000000000000000008dd87e9486cd0d71c5d84e452432bab33c2a0cbaa31ce", + "txs": [ ... ], + }, + { + "height": 739025, + "time": 1654199569000, + "hash": "000000000000000000021e9ce82dec208af75807f92a9b1d9dae91f2b4d40e24", + "previousBlockHash": "00000000000000000002db644c025a76464b466d25900402452b07213b30c40b", + "txs": [ ... ] + }, + { + "height": 739023, + "time": 1654198597000, + "hash": "0000000000000000000702ce10250a46bea4155ca7acb869f3ea92c1e3a68bc5", + "previousBlockHash": "00000000000000000002b3d6c1adc5676262ded84181982f88dbd357b9f9d1ec", + "txs": [ ... ] + }, + { + "height": 739020, + "time": 1654197263000, + "hash": "000000000000000000046eb46ad941028381d3534c35658f9c80de0641dbbb31", + "previousBlockHash": "000000000000000000073f1c49b4c4895f3fa6b866d1e21ab8b22f3f9318b42f", + "txs": [ ... ] + } +]` + }, } } }, diff --git a/frontend/src/resources/screenshots/v2.4.0-dashboard.png b/frontend/src/resources/screenshots/v2.4.0-dashboard.png index 7fa95e441..472e6f615 100644 Binary files a/frontend/src/resources/screenshots/v2.4.0-dashboard.png and b/frontend/src/resources/screenshots/v2.4.0-dashboard.png differ