From 26e0dbbadc7f74cd30e692ec49b9577e0787dd41 Mon Sep 17 00:00:00 2001 From: Rod Vagg Date: Mon, 6 Jun 2022 17:05:00 +1000 Subject: [PATCH 1/2] feat: use new multiformats CID interface and exports Ref: https://github.com/multiformats/js-multiformats/pull/161 --- src/bitcoin-block.js | 16 ++++++------ src/bitcoin-tx.js | 30 ++++++++++++----------- src/bitcoin-witness-commitment.js | 18 ++++++++------ src/complete.js | 18 ++++++++------ src/interface.ts | 28 +++++++++++++-------- src/util.js | 10 +++++--- types/bitcoin-block.d.ts | 11 ++++----- types/bitcoin-block.d.ts.map | 2 +- types/bitcoin-tx.d.ts | 14 +++++------ types/bitcoin-tx.d.ts.map | 2 +- types/bitcoin-witness-commitment.d.ts | 11 +++++---- types/bitcoin-witness-commitment.d.ts.map | 2 +- types/complete.d.ts | 12 +++++---- types/complete.d.ts.map | 2 +- types/interface.d.ts | 28 ++++++++++++++------- types/interface.d.ts.map | 2 +- types/util.d.ts | 5 +++- types/util.d.ts.map | 2 +- 18 files changed, 124 insertions(+), 89 deletions(-) diff --git a/src/bitcoin-block.js b/src/bitcoin-block.js index b8f8d3f..40d6151 100644 --- a/src/bitcoin-block.js +++ b/src/bitcoin-block.js @@ -1,5 +1,6 @@ import { BitcoinBlock, fromHashHex } from 'bitcoin-block' -import { CID, bytes } from 'multiformats' +import { bytes } from 'multiformats' +import { create as createCID } from 'multiformats/cid' import * as dblSha2256 from './dbl-sha2-256.js' import { CODEC_BLOCK, CODEC_BLOCK_CODE, CODEC_TX_CODE } from './constants.js' @@ -8,9 +9,8 @@ import { CODEC_BLOCK, CODEC_BLOCK_CODE, CODEC_TX_CODE } from './constants.js' * @typedef {import('multiformats/codecs/interface').ByteView} ByteView */ -/** - * @typedef {import('./interface').BitcoinHeader} BitcoinHeader - */ +/** @typedef {import('./interface').BitcoinHeader} BitcoinHeader */ +/** @typedef {import('./interface').BitcoinBlockCID} BitcoinBlockCID */ /** * **`bitcoin-block` / `0xb0` codec**: Encodes an IPLD node representing a @@ -46,13 +46,13 @@ export function decode (data) { // insert links derived from native hash hex strings if (deserialized.previousblockhash) { const parentDigest = dblSha2256.digestFrom(fromHashHex(deserialized.previousblockhash)) - deserialized.parent = CID.create(1, CODEC_BLOCK_CODE, parentDigest) + deserialized.parent = createCID(1, CODEC_BLOCK_CODE, parentDigest) } else { // genesis deserialized.parent = null } const txDigest = dblSha2256.digestFrom(fromHashHex(deserialized.merkleroot)) - deserialized.tx = CID.create(1, CODEC_TX_CODE, txDigest) + deserialized.tx = createCID(1, CODEC_TX_CODE, txDigest) return deserialized } @@ -74,7 +74,7 @@ export const code = CODEC_BLOCK_CODE * The process of converting to a CID involves reversing the hash (to little-endian form), encoding as a `dbl-sha2-256` multihash and encoding as a `bitcoin-block` multicodec. This process is reversable, see {@link cidToHash}. * * @param {string} blockHash a string form of a block hash - * @returns {CID} a CID object representing this block identifier. + * @returns {BitcoinBlockCID} a CID object representing this block identifier. * @name BitcoinBlock.blockHashToCID() */ export function blockHashToCID (blockHash) { @@ -82,5 +82,5 @@ export function blockHashToCID (blockHash) { blockHash = bytes.toHex(blockHash) } const digest = dblSha2256.digestFrom(fromHashHex(blockHash)) - return CID.create(1, CODEC_BLOCK_CODE, digest) + return createCID(1, CODEC_BLOCK_CODE, digest) } diff --git a/src/bitcoin-tx.js b/src/bitcoin-tx.js index a1258fd..06b2b7e 100644 --- a/src/bitcoin-tx.js +++ b/src/bitcoin-tx.js @@ -1,5 +1,6 @@ import { BitcoinTransaction as BitcoinBlockTransaction, fromHashHex, merkle } from 'bitcoin-block' -import { CID, bytes } from 'multiformats' +import { bytes } from 'multiformats' +import { create as createCID, asCID } from 'multiformats/cid' import * as dblSha2256 from './dbl-sha2-256.js' import { CODEC_TX, CODEC_TX_CODE, CODEC_WITNESS_COMMITMENT_CODE } from './constants.js' @@ -11,6 +12,7 @@ import { CODEC_TX, CODEC_TX_CODE, CODEC_WITNESS_COMMITMENT_CODE } from './consta /** @typedef {import('bitcoin-block/interface').BlockPorcelain} BlockPorcelain */ /** @typedef {import('./interface').BitcoinTransaction} BitcoinTransaction */ /** @typedef {import('./interface').BitcoinTransactionMerkleNode} BitcoinTransactionMerkleNode */ +/** @typedef {import('./interface').BitcoinTxCID} BitcoinTxCID */ /** @ignore */ const NULL_HASH = new Uint8Array(32) @@ -46,11 +48,11 @@ function _encode (node, noWitness) { export function encode (node) { if (Array.isArray(node)) { const bytes = new Uint8Array(64) - const leftCid = CID.asCID(node[0]) + const leftCid = asCID(node[0]) if (leftCid != null) { bytes.set(leftCid.multihash.digest) } - const rightCid = CID.asCID(node[1]) + const rightCid = asCID(node[1]) if (rightCid == null) { throw new TypeError('Expected BitcoinTransactionMerkleNode to be [CID|null,CID]') } @@ -80,7 +82,7 @@ export function encodeNoWitness (node) { * * @param {BlockPorcelain} deserialized * @param {BitcoinBlockTransaction.HASH_NO_WITNESS} [noWitness] - * @returns {IterableIterator<{cid:CID, bytes:Uint8Array, transaction?:BitcoinBlockTransaction}>} + * @returns {IterableIterator<{cid:BitcoinTxCID, bytes:Uint8Array, transaction?:BitcoinBlockTransaction}>} * @private * @ignore */ @@ -109,7 +111,7 @@ function * _encodeAll (deserialized, noWitness) { (deserialized.tx[ii]) const { transaction, bytes } = _encode(tx, noWitness) const mh = dblSha2256.digest(bytes) - const cid = CID.create(1, CODEC_TX_CODE, mh) + const cid = createCID(1, CODEC_TX_CODE, mh) yield { cid, bytes, transaction } // base tx hashes.push(mh.digest) } @@ -117,7 +119,7 @@ function * _encodeAll (deserialized, noWitness) { for (const { hash, data } of merkle(hashes)) { if (data) { const mh = dblSha2256.digestFrom(hash) - const cid = CID.create(1, CODEC_TX_CODE, mh) + const cid = createCID(1, CODEC_TX_CODE, mh) const bytes = new Uint8Array(64) bytes.set(data[0], 0) bytes.set(data[1], 32) @@ -137,7 +139,7 @@ function * _encodeAll (deserialized, noWitness) { * * @name BitcoinTransaction.encodeAll() * @param {BlockPorcelain} obj - * @returns {IterableIterator<{cid:CID, bytes:Uint8Array, transaction?:BitcoinBlockTransaction}>} + * @returns {IterableIterator<{cid:BitcoinTxCID, bytes:Uint8Array, transaction?:BitcoinBlockTransaction}>} */ export function * encodeAll (obj) { yield * _encodeAll(obj) @@ -150,7 +152,7 @@ export function * encodeAll (obj) { * * @name BitcoinTransaction.encodeAllNoWitness() * @param {BlockPorcelain} obj - * @returns {IterableIterator<{cid:CID, bytes:Uint8Array, transaction?:BitcoinBlockTransaction}>} + * @returns {IterableIterator<{cid:BitcoinTxCID, bytes:Uint8Array, transaction?:BitcoinBlockTransaction}>} */ export function * encodeAllNoWitness (obj) { yield * _encodeAll(obj, BitcoinBlockTransaction.HASH_NO_WITNESS) @@ -211,8 +213,8 @@ export function decode (data) { } const leftMh = left != null ? dblSha2256.digestFrom(left) : null const rightMh = dblSha2256.digestFrom(right) - const leftCid = leftMh != null ? CID.create(1, CODEC_TX_CODE, leftMh) : null - const rightCid = CID.create(1, CODEC_TX_CODE, rightMh) + const leftCid = leftMh != null ? createCID(1, CODEC_TX_CODE, leftMh) : null + const rightCid = createCID(1, CODEC_TX_CODE, rightMh) return [leftCid, rightCid] } @@ -229,14 +231,14 @@ export function decode (data) { // witness commitment and we can't discriminate at this point -- we can only do that by trying to // load the witness commitment from the generated CID const witnessCommitmentMh = dblSha2256.digestFrom(witnessCommitment) - const witnessCommitmentCid = CID.create(1, CODEC_WITNESS_COMMITMENT_CODE, witnessCommitmentMh) + const witnessCommitmentCid = createCID(1, CODEC_WITNESS_COMMITMENT_CODE, witnessCommitmentMh) deserialized.witnessCommitment = witnessCommitmentCid } } for (const vin of deserialized.vin) { if (typeof vin.txid === 'string' && /^[0-9a-f]{64}$/.test(vin.txid)) { const txidMh = dblSha2256.digestFrom(fromHashHex(vin.txid)) - vin.tx = CID.create(1, CODEC_TX_CODE, txidMh) + vin.tx = createCID(1, CODEC_TX_CODE, txidMh) } } @@ -260,7 +262,7 @@ export const code = CODEC_TX_CODE * The process of converting to a CID involves reversing the hash (to little-endian form), encoding as a `dbl-sha2-256` multihash and encoding as a `bitcoin-tx` multicodec. This process is reversable, see {@link cidToHash}. * * @param {string} txHash a string form of a transaction hash - * @returns {CID} A CID (`multiformats.CID`) object representing this transaction identifier. + * @returns {BitcoinTxCID} A CID (`multiformats.CID`) object representing this transaction identifier. * @name BitcoinTransaction.txHashToCID() */ export function txHashToCID (txHash) { @@ -268,7 +270,7 @@ export function txHashToCID (txHash) { txHash = bytes.toHex(txHash) } const digest = dblSha2256.digestFrom(fromHashHex(txHash)) - return CID.create(1, CODEC_TX_CODE, digest) + return createCID(1, CODEC_TX_CODE, digest) } /** diff --git a/src/bitcoin-witness-commitment.js b/src/bitcoin-witness-commitment.js index c28d501..c034f9d 100644 --- a/src/bitcoin-witness-commitment.js +++ b/src/bitcoin-witness-commitment.js @@ -1,5 +1,5 @@ import { BitcoinTransaction } from 'bitcoin-block' -import { CID } from 'multiformats' +import { create as createCID, asCID } from 'multiformats/cid' import * as dblSha2256 from './dbl-sha2-256.js' import { CODEC_TX, CODEC_TX_CODE, CODEC_WITNESS_COMMITMENT, CODEC_WITNESS_COMMITMENT_CODE } from './constants.js' @@ -9,6 +9,8 @@ import { CODEC_TX, CODEC_TX_CODE, CODEC_WITNESS_COMMITMENT, CODEC_WITNESS_COMMIT */ /** @typedef {import('bitcoin-block/classes/Block').BlockPorcelain} BlockPorcelain */ /** @typedef {import('./interface').BitcoinWitnessCommitment} BitcoinWitnessCommitment */ +/** @typedef {import('./interface').BitcoinTxCID} BitcoinTxCID */ +/** @typedef {import('./interface').BitcoinWitnessCommitmentCID} BitcoinWitnessCommitmentCID */ /** @ignore */ const NULL_HASH = new Uint8Array(32) @@ -23,8 +25,8 @@ const NULL_HASH = new Uint8Array(32) /** * @param {import('bitcoin-block/classes/Block').BlockPorcelain} deserialized - * @param {CID|null} witnessMerkleRoot - * @returns {{cid:CID, bytes:Uint8Array}|null} + * @param {BitcoinTxCID|null} witnessMerkleRoot + * @returns {{cid:BitcoinWitnessCommitmentCID, bytes:Uint8Array}|null} * @ignore */ export function encodeWitnessCommitment (deserialized, witnessMerkleRoot) { @@ -32,7 +34,7 @@ export function encodeWitnessCommitment (deserialized, witnessMerkleRoot) { throw new TypeError('deserialized argument must be a Bitcoin block representation') } - if (witnessMerkleRoot !== null && !(witnessMerkleRoot instanceof Uint8Array) && !CID.asCID(witnessMerkleRoot)) { + if (witnessMerkleRoot !== null && !(witnessMerkleRoot instanceof Uint8Array) && !asCID(witnessMerkleRoot)) { throw new TypeError('witnessMerkleRoot must be a Uint8Array or CID') } @@ -45,7 +47,7 @@ export function encodeWitnessCommitment (deserialized, witnessMerkleRoot) { merkleRootHash = witnessMerkleRoot } else { // CID - const mrhcid = CID.asCID(witnessMerkleRoot) + const mrhcid = asCID(witnessMerkleRoot) if (mrhcid == null) { throw new TypeError('Expected witnessMerkleRoot to be a CID') } @@ -87,7 +89,7 @@ export function encodeWitnessCommitment (deserialized, witnessMerkleRoot) { } const mh = dblSha2256.digestFrom(hash) - const cid = CID.create(1, CODEC_WITNESS_COMMITMENT_CODE, mh) + const cid = createCID(1, CODEC_WITNESS_COMMITMENT_CODE, mh) return { cid, bytes } } @@ -112,7 +114,7 @@ export function encode (node) { if (!(node.nonce instanceof Uint8Array)) { throw new TypeError('bitcoin-witness-commitment must have a `nonce` Uint8Array') } - const witnessMerkleRoot = CID.asCID(node.witnessMerkleRoot) + const witnessMerkleRoot = asCID(node.witnessMerkleRoot) if (!witnessMerkleRoot) { throw new TypeError('bitcoin-witness-commitment must have a `witnessMerkleRoot` CID') } @@ -154,7 +156,7 @@ export function decode (data) { let witnessMerkleRoot = null if (!isNullHash(witnessHash)) { const witnessDigest = dblSha2256.digestFrom(witnessHash) - witnessMerkleRoot = CID.create(1, CODEC_TX_CODE, witnessDigest) + witnessMerkleRoot = createCID(1, CODEC_TX_CODE, witnessDigest) } return { witnessMerkleRoot, nonce } } diff --git a/src/complete.js b/src/complete.js index 75f2748..163c0af 100644 --- a/src/complete.js +++ b/src/complete.js @@ -1,4 +1,5 @@ -import { CID, bytes } from 'multiformats' +import { bytes } from 'multiformats' +import { create as createCID } from 'multiformats/cid' import { BitcoinBlock, BitcoinTransaction as BitcoinBlockTransaction } from 'bitcoin-block' import * as bitcoinBlockCodec from './bitcoin-block.js' import * as bitcoinTxCodec from './bitcoin-tx.js' @@ -13,17 +14,20 @@ const { toHex } = bytes /** @typedef {import('./interface').IPLDLoader} IPLDLoader */ /** @typedef {import('./interface').BitcoinTransaction} BitcoinTransaction */ /** @typedef {import('./interface').BitcoinTransactionMerkleNode} BitcoinTransactionMerkleNode */ +/** @typedef {import('./interface').BitcoinBlockCID} BitcoinBlockCID */ +/** @typedef {import('./interface').BitcoinTxCID} BitcoinTxCID */ +/** @typedef {import('./interface').BitcoinWitnessCommitmentCID} BitcoinWitnessCommitmentCID */ /** * @param {any} obj - * @returns {{cid:CID, bytes:Uint8Array}} + * @returns {{cid:BitcoinBlockCID, bytes:Uint8Array}} * @ignore */ function mkblock (obj) { const bytes = bitcoinBlockCodec.encode(obj) const mh = dblSha256.digest(bytes) return { - cid: CID.create(1, bitcoinBlockCodec.code, mh), + cid: createCID(1, bitcoinBlockCodec.code, mh), bytes } } @@ -38,7 +42,7 @@ function mkblock (obj) { * * @name Bitcoin.encodeAll() * @param {BlockPorcelain} block - * @returns {IterableIterator<{cid: CID, bytes: Uint8Array}>} + * @returns {IterableIterator<{cid: BitcoinBlockCID|BitcoinTxCID|BitcoinWitnessCommitmentCID, bytes: Uint8Array}>} */ export function * encodeAll (block) { if (typeof block !== 'object' || !Array.isArray(block.tx)) { @@ -135,7 +139,7 @@ export function * encodeAll (block) { * `bitcoin-tx` and `bitcoin-witness-commitment` CIDs. * * @param {IPLDLoader} loader an IPLD block loader function that takes a CID argument and returns a `Uint8Array` containing the binary block data for that CID - * @param {CID} blockCid a CID of type `bitcoin-block` pointing to the Bitcoin block header for the block to be assembled + * @param {BitcoinBlockCID} blockCid a CID of type `bitcoin-block` pointing to the Bitcoin block header for the block to be assembled * @returns {Promise<{deserialized:BlockPorcelain, bytes:Uint8Array}>} an object containing two properties, `deserialized` and `bytes` where `deserialized` contains a full JavaScript instantiation of the Bitcoin block graph and `bytes` contains a `Uint8Array` with the binary representation of the graph. * @name Bitcoin.assemble() */ @@ -146,7 +150,7 @@ export async function assemble (loader, blockCid) { */ const merkleCache = {} /** - * @param {CID} txCid + * @param {BitcoinTxCID} txCid * @returns {Promise} * @ignore */ @@ -178,7 +182,7 @@ export async function assemble (loader, blockCid) { })() /** - * @param {CID} txCid + * @param {BitcoinTxCID} txCid * @returns {AsyncIterableIterator} * @ignore */ diff --git a/src/interface.ts b/src/interface.ts index a983db6..78b2cde 100644 --- a/src/interface.ts +++ b/src/interface.ts @@ -1,35 +1,43 @@ import { TransactionInCoinbasePorcelain, TransactionInPorcelain } from 'bitcoin-block/classes/TransactionIn'; import { BlockHeaderPorcelain, TransactionPorcelain } from 'bitcoin-block/interface' -import { CID } from 'multiformats'; +import { CID } from 'multiformats/interface'; + +export type HASH_ALG_CODE = 0x56 +export type CODEC_BLOCK_CODE = 0xb0 +export type CODEC_TX_CODE = 0xb1 +export type CODEC_WITNESS_COMMITMENT_CODE = 0xb2 export type IPLDLoader = (cid:CID)=>Promise +export interface BitcoinBlockCID extends CID{} +export interface BitcoinTxCID extends CID{} +export interface BitcoinWitnessCommitmentCID extends CID{} + export interface BitcoinHeader extends BlockHeaderPorcelain { - parent: CID|null - tx: CID + parent: BitcoinBlockCID|null + tx: BitcoinTxCID } export interface BitcoinTransactionMerkleNode { - 0: CID|null - 1: CID + 0: BitcoinTxCID|null + 1: BitcoinTxCID } - export interface BitcoinTransactionInCoinbase extends TransactionInCoinbasePorcelain { - tx: CID + tx: BitcoinTxCID txinwitness: [string] } export interface BitcoinTransactionIn extends TransactionInPorcelain { - tx: CID + tx: BitcoinTxCID } export interface BitcoinTransaction extends TransactionPorcelain { - witnessCommitment?: CID + witnessCommitment?: BitcoinWitnessCommitmentCID vin: (BitcoinTransactionInCoinbase | BitcoinTransactionIn)[] } export interface BitcoinWitnessCommitment { - witnessMerkleRoot: CID|null + witnessMerkleRoot: BitcoinTxCID|null nonce: Uint8Array } diff --git a/src/util.js b/src/util.js index 6d4b3af..72932da 100644 --- a/src/util.js +++ b/src/util.js @@ -1,4 +1,4 @@ -import { CID } from 'multiformats/cid' +import { parse as parseCID, asCID } from 'multiformats/cid' import { BitcoinBlock, toHashHex } from 'bitcoin-block' import * as block from './bitcoin-block.js' import * as tx from './bitcoin-tx.js' @@ -6,6 +6,10 @@ import * as tx from './bitcoin-tx.js' export const blockHashToCID = block.blockHashToCID export const txHashToCID = tx.txHashToCID +/** + * @typedef {import('multiformats/interface').CID} CID + */ + /** @typedef {import('bitcoin-block/interface').BlockPorcelain} BlockPorcelain */ /** @@ -64,9 +68,9 @@ export function serializeFullBitcoinBytes (obj) { */ export function cidToHash (cid) { if (typeof cid === 'string') { - cid = CID.parse(cid) + cid = parseCID(cid) } - const acid = CID.asCID(cid) + const acid = asCID(cid) if (!acid) { throw new TypeError('Must provide a CID or a CID string') } diff --git a/types/bitcoin-block.d.ts b/types/bitcoin-block.d.ts index 1d53618..6df8d98 100644 --- a/types/bitcoin-block.d.ts +++ b/types/bitcoin-block.d.ts @@ -2,9 +2,8 @@ * @template T * @typedef {import('multiformats/codecs/interface').ByteView} ByteView */ -/** - * @typedef {import('./interface').BitcoinHeader} BitcoinHeader - */ +/** @typedef {import('./interface').BitcoinHeader} BitcoinHeader */ +/** @typedef {import('./interface').BitcoinBlockCID} BitcoinBlockCID */ /** * **`bitcoin-block` / `0xb0` codec**: Encodes an IPLD node representing a * Bitcoin header object into byte form. @@ -29,10 +28,10 @@ export function decode(data: ByteView): BitcoinHeader; * The process of converting to a CID involves reversing the hash (to little-endian form), encoding as a `dbl-sha2-256` multihash and encoding as a `bitcoin-block` multicodec. This process is reversable, see {@link cidToHash}. * * @param {string} blockHash a string form of a block hash - * @returns {CID} a CID object representing this block identifier. + * @returns {BitcoinBlockCID} a CID object representing this block identifier. * @name BitcoinBlock.blockHashToCID() */ -export function blockHashToCID(blockHash: string): CID; +export function blockHashToCID(blockHash: string): BitcoinBlockCID; /** * **`bitcoin-block` / `0xb0` codec**: the codec name * @name BitcoinBlock.name @@ -45,5 +44,5 @@ export const name: "bitcoin-block"; export const code: 176; export type ByteView = import('multiformats/codecs/interface').ByteView; export type BitcoinHeader = import('./interface').BitcoinHeader; -import { CID } from "multiformats"; +export type BitcoinBlockCID = import('./interface').BitcoinBlockCID; //# sourceMappingURL=bitcoin-block.d.ts.map \ No newline at end of file diff --git a/types/bitcoin-block.d.ts.map b/types/bitcoin-block.d.ts.map index c4ca329..6a5be1c 100644 --- a/types/bitcoin-block.d.ts.map +++ b/types/bitcoin-block.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"bitcoin-block.d.ts","sourceRoot":"","sources":["../src/bitcoin-block.js"],"names":[],"mappings":"AAKA;;;EAGE;AAEF;;GAEG;AAEH;;;;;;;GAOG;AACH,6BAJW,aAAa,GACX,SAAS,aAAa,CAAC,CASnC;AAED;;;;;;;GAOG;AACH,6BAJW,SAAS,aAAa,CAAC,GACrB,aAAa,CAsBzB;AAaD;;;;;;;;GAQG;AACH,0CAJW,MAAM,GACJ,GAAG,CASf;AA1BD;;;GAGG;AACH,mCAA+B;AAC/B;;;GAGG;AACH,uBAAoC;0BA7DvB,OAAO,+BAA+B,EAAE,QAAQ,CAAC,CAAC,CAAC;4BAInD,OAAO,aAAa,EAAE,aAAa"} \ No newline at end of file +{"version":3,"file":"bitcoin-block.d.ts","sourceRoot":"","sources":["../src/bitcoin-block.js"],"names":[],"mappings":"AAMA;;;EAGE;AAEF,mEAAmE;AACnE,uEAAuE;AAEvE;;;;;;;GAOG;AACH,6BAJW,aAAa,GACX,SAAS,aAAa,CAAC,CASnC;AAED;;;;;;;GAOG;AACH,6BAJW,SAAS,aAAa,CAAC,GACrB,aAAa,CAsBzB;AAaD;;;;;;;;GAQG;AACH,0CAJW,MAAM,GACJ,eAAe,CAS3B;AA1BD;;;GAGG;AACH,mCAA+B;AAC/B;;;GAGG;AACH,uBAAoC;0BA5DvB,OAAO,+BAA+B,EAAE,QAAQ,CAAC,CAAC,CAAC;4BAGlD,OAAO,aAAa,EAAE,aAAa;8BACnC,OAAO,aAAa,EAAE,eAAe"} \ No newline at end of file diff --git a/types/bitcoin-tx.d.ts b/types/bitcoin-tx.d.ts index 924f112..3b3dd3b 100644 --- a/types/bitcoin-tx.d.ts +++ b/types/bitcoin-tx.d.ts @@ -33,10 +33,10 @@ export function encodeNoWitness(node: BitcoinTransaction): ByteView} + * @returns {IterableIterator<{cid:BitcoinTxCID, bytes:Uint8Array, transaction?:BitcoinBlockTransaction}>} */ export function encodeAll(obj: BlockPorcelain): IterableIterator<{ - cid: CID; + cid: BitcoinTxCID; bytes: Uint8Array; transaction?: BitcoinBlockTransaction; }>; @@ -47,10 +47,10 @@ export function encodeAll(obj: BlockPorcelain): IterableIterator<{ * * @name BitcoinTransaction.encodeAllNoWitness() * @param {BlockPorcelain} obj - * @returns {IterableIterator<{cid:CID, bytes:Uint8Array, transaction?:BitcoinBlockTransaction}>} + * @returns {IterableIterator<{cid:BitcoinTxCID, bytes:Uint8Array, transaction?:BitcoinBlockTransaction}>} */ export function encodeAllNoWitness(obj: BlockPorcelain): IterableIterator<{ - cid: CID; + cid: BitcoinTxCID; bytes: Uint8Array; transaction?: BitcoinBlockTransaction; }>; @@ -74,10 +74,10 @@ export function decode(data: ByteView = import('multiformats/codecs/interface').ByteView; export type BlockPorcelain = import('bitcoin-block/classes/Block').BlockPorcelain; export type BitcoinWitnessCommitment = import('./interface').BitcoinWitnessCommitment; -import { CID } from "multiformats"; +export type BitcoinTxCID = import('./interface').BitcoinTxCID; +export type BitcoinWitnessCommitmentCID = import('./interface').BitcoinWitnessCommitmentCID; //# sourceMappingURL=bitcoin-witness-commitment.d.ts.map \ No newline at end of file diff --git a/types/bitcoin-witness-commitment.d.ts.map b/types/bitcoin-witness-commitment.d.ts.map index 1d587ec..32aeae7 100644 --- a/types/bitcoin-witness-commitment.d.ts.map +++ b/types/bitcoin-witness-commitment.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"bitcoin-witness-commitment.d.ts","sourceRoot":"","sources":["../src/bitcoin-witness-commitment.js"],"names":[],"mappings":"AAuBA;;;;;GAKG;AACH,sDALW,OAAO,6BAA6B,EAAE,cAAc,qBACpD,GAAG,GAAC,IAAI;SACD,GAAG;WAAQ,UAAU;SAkEtC;AAED;;;;;;;;;;;;GAYG;AACH,6BAHW,wBAAwB,GACtB,SAAS,wBAAwB,CAAC,CAuB9C;AAED;;;;;;;;;;;;GAYG;AACH,6BAHW,SAAS,wBAAwB,CAAC,GAChC,wBAAwB,CAkBpC;AAED;;;GAGG;AACH,gDAA4C;AAC5C;;;GAGG;AACH,uBAAiD;0BAnKpC,OAAO,+BAA+B,EAAE,QAAQ,CAAC,CAAC,CAAC;6BAElD,OAAO,6BAA6B,EAAE,cAAc;uCACpD,OAAO,aAAa,EAAE,wBAAwB"} \ No newline at end of file +{"version":3,"file":"bitcoin-witness-commitment.d.ts","sourceRoot":"","sources":["../src/bitcoin-witness-commitment.js"],"names":[],"mappings":"AAyBA;;;;;GAKG;AACH,sDALW,OAAO,6BAA6B,EAAE,cAAc,qBACpD,YAAY,GAAC,IAAI;SACV,2BAA2B;WAAQ,UAAU;SAkE9D;AAED;;;;;;;;;;;;GAYG;AACH,6BAHW,wBAAwB,GACtB,SAAS,wBAAwB,CAAC,CAuB9C;AAED;;;;;;;;;;;;GAYG;AACH,6BAHW,SAAS,wBAAwB,CAAC,GAChC,wBAAwB,CAkBpC;AAED;;;GAGG;AACH,gDAA4C;AAC5C;;;GAGG;AACH,uBAAiD;0BArKpC,OAAO,+BAA+B,EAAE,QAAQ,CAAC,CAAC,CAAC;6BAElD,OAAO,6BAA6B,EAAE,cAAc;uCACpD,OAAO,aAAa,EAAE,wBAAwB;2BAC9C,OAAO,aAAa,EAAE,YAAY;0CAClC,OAAO,aAAa,EAAE,2BAA2B"} \ No newline at end of file diff --git a/types/complete.d.ts b/types/complete.d.ts index 599fa2c..43fab27 100644 --- a/types/complete.d.ts +++ b/types/complete.d.ts @@ -8,10 +8,10 @@ * * @name Bitcoin.encodeAll() * @param {BlockPorcelain} block - * @returns {IterableIterator<{cid: CID, bytes: Uint8Array}>} + * @returns {IterableIterator<{cid: BitcoinBlockCID|BitcoinTxCID|BitcoinWitnessCommitmentCID, bytes: Uint8Array}>} */ export function encodeAll(block: BlockPorcelain): IterableIterator<{ - cid: CID; + cid: BitcoinBlockCID | BitcoinTxCID | BitcoinWitnessCommitmentCID; bytes: Uint8Array; }>; /** @@ -26,11 +26,11 @@ export function encodeAll(block: BlockPorcelain): IterableIterator<{ * `bitcoin-tx` and `bitcoin-witness-commitment` CIDs. * * @param {IPLDLoader} loader an IPLD block loader function that takes a CID argument and returns a `Uint8Array` containing the binary block data for that CID - * @param {CID} blockCid a CID of type `bitcoin-block` pointing to the Bitcoin block header for the block to be assembled + * @param {BitcoinBlockCID} blockCid a CID of type `bitcoin-block` pointing to the Bitcoin block header for the block to be assembled * @returns {Promise<{deserialized:BlockPorcelain, bytes:Uint8Array}>} an object containing two properties, `deserialized` and `bytes` where `deserialized` contains a full JavaScript instantiation of the Bitcoin block graph and `bytes` contains a `Uint8Array` with the binary representation of the graph. * @name Bitcoin.assemble() */ -export function assemble(loader: IPLDLoader, blockCid: CID): Promise<{ +export function assemble(loader: IPLDLoader, blockCid: BitcoinBlockCID): Promise<{ deserialized: BlockPorcelain; bytes: Uint8Array; }>; @@ -39,6 +39,8 @@ export type TransactionPorcelain = import('bitcoin-block/interface').Transaction export type IPLDLoader = import('./interface').IPLDLoader; export type BitcoinTransaction = import('./interface').BitcoinTransaction; export type BitcoinTransactionMerkleNode = import('./interface').BitcoinTransactionMerkleNode; -import { CID } from "multiformats"; +export type BitcoinBlockCID = import('./interface').BitcoinBlockCID; +export type BitcoinTxCID = import('./interface').BitcoinTxCID; +export type BitcoinWitnessCommitmentCID = import('./interface').BitcoinWitnessCommitmentCID; import { bytes } from "multiformats"; //# sourceMappingURL=complete.d.ts.map \ No newline at end of file diff --git a/types/complete.d.ts.map b/types/complete.d.ts.map index d8d77cd..ecfc2fd 100644 --- a/types/complete.d.ts.map +++ b/types/complete.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"complete.d.ts","sourceRoot":"","sources":["../src/complete.js"],"names":[],"mappings":"AA8BA;;;;;;;;;;;GAWG;AACH,iCAHW,cAAc,GACZ,iBAAiB;IAAC,GAAG,EAAE,GAAG,CAAC;IAAC,OAAO,UAAU,CAAA;CAAC,CAAC,CAmF3D;AAED;;;;;;;;;;;;;;;GAeG;AACH,iCALW,UAAU,YACV,GAAG,GACD,QAAQ;IAAC,YAAY,EAAC,cAAc,CAAC;IAAC,OAAM,UAAU,CAAA;CAAC,CAAC,CA+FpE;6BA/Na,OAAO,yBAAyB,EAAE,cAAc;mCAChD,OAAO,yBAAyB,EAAE,oBAAoB;yBACtD,OAAO,aAAa,EAAE,UAAU;iCAChC,OAAO,aAAa,EAAE,kBAAkB;2CACxC,OAAO,aAAa,EAAE,4BAA4B"} \ No newline at end of file +{"version":3,"file":"complete.d.ts","sourceRoot":"","sources":["../src/complete.js"],"names":[],"mappings":"AAkCA;;;;;;;;;;;GAWG;AACH,iCAHW,cAAc,GACZ,iBAAiB;IAAC,GAAG,EAAE,eAAe,GAAC,YAAY,GAAC,2BAA2B,CAAC;IAAC,OAAO,UAAU,CAAA;CAAC,CAAC,CAmFhH;AAED;;;;;;;;;;;;;;;GAeG;AACH,iCALW,UAAU,YACV,eAAe,GACb,QAAQ;IAAC,YAAY,EAAC,cAAc,CAAC;IAAC,OAAM,UAAU,CAAA;CAAC,CAAC,CA+FpE;6BAlOa,OAAO,yBAAyB,EAAE,cAAc;mCAChD,OAAO,yBAAyB,EAAE,oBAAoB;yBACtD,OAAO,aAAa,EAAE,UAAU;iCAChC,OAAO,aAAa,EAAE,kBAAkB;2CACxC,OAAO,aAAa,EAAE,4BAA4B;8BAClD,OAAO,aAAa,EAAE,eAAe;2BACrC,OAAO,aAAa,EAAE,YAAY;0CAClC,OAAO,aAAa,EAAE,2BAA2B"} \ No newline at end of file diff --git a/types/interface.d.ts b/types/interface.d.ts index 4f97da9..01e86fc 100644 --- a/types/interface.d.ts +++ b/types/interface.d.ts @@ -1,28 +1,38 @@ import { TransactionInCoinbasePorcelain, TransactionInPorcelain } from 'bitcoin-block/classes/TransactionIn'; import { BlockHeaderPorcelain, TransactionPorcelain } from 'bitcoin-block/interface'; -import { CID } from 'multiformats'; +import { CID } from 'multiformats/interface'; +export declare type HASH_ALG_CODE = 0x56; +export declare type CODEC_BLOCK_CODE = 0xb0; +export declare type CODEC_TX_CODE = 0xb1; +export declare type CODEC_WITNESS_COMMITMENT_CODE = 0xb2; export declare type IPLDLoader = (cid: CID) => Promise; +export interface BitcoinBlockCID extends CID { +} +export interface BitcoinTxCID extends CID { +} +export interface BitcoinWitnessCommitmentCID extends CID { +} export interface BitcoinHeader extends BlockHeaderPorcelain { - parent: CID | null; - tx: CID; + parent: BitcoinBlockCID | null; + tx: BitcoinTxCID; } export interface BitcoinTransactionMerkleNode { - 0: CID | null; - 1: CID; + 0: BitcoinTxCID | null; + 1: BitcoinTxCID; } export interface BitcoinTransactionInCoinbase extends TransactionInCoinbasePorcelain { - tx: CID; + tx: BitcoinTxCID; txinwitness: [string]; } export interface BitcoinTransactionIn extends TransactionInPorcelain { - tx: CID; + tx: BitcoinTxCID; } export interface BitcoinTransaction extends TransactionPorcelain { - witnessCommitment?: CID; + witnessCommitment?: BitcoinWitnessCommitmentCID; vin: (BitcoinTransactionInCoinbase | BitcoinTransactionIn)[]; } export interface BitcoinWitnessCommitment { - witnessMerkleRoot: CID | null; + witnessMerkleRoot: BitcoinTxCID | null; nonce: Uint8Array; } //# sourceMappingURL=interface.d.ts.map \ No newline at end of file diff --git a/types/interface.d.ts.map b/types/interface.d.ts.map index f16fee6..2afa2b3 100644 --- a/types/interface.d.ts.map +++ b/types/interface.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../src/interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7G,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AACpF,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEnC,oBAAY,UAAU,GAAG,CAAC,GAAG,EAAC,GAAG,KAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAEvD,MAAM,WAAW,aAAc,SAAQ,oBAAoB;IACzD,MAAM,EAAE,GAAG,GAAC,IAAI,CAAA;IAChB,EAAE,EAAE,GAAG,CAAA;CACR;AAED,MAAM,WAAW,4BAA4B;IAC3C,CAAC,EAAE,GAAG,GAAC,IAAI,CAAA;IACX,CAAC,EAAE,GAAG,CAAA;CACP;AAGD,MAAM,WAAW,4BAA6B,SAAQ,8BAA8B;IAClF,EAAE,EAAE,GAAG,CAAA;IACP,WAAW,EAAE,CAAC,MAAM,CAAC,CAAA;CACtB;AAED,MAAM,WAAW,oBAAqB,SAAQ,sBAAsB;IAClE,EAAE,EAAE,GAAG,CAAA;CACR;AAED,MAAM,WAAW,kBAAmB,SAAQ,oBAAoB;IAC9D,iBAAiB,CAAC,EAAE,GAAG,CAAA;IACvB,GAAG,EAAE,CAAC,4BAA4B,GAAG,oBAAoB,CAAC,EAAE,CAAA;CAC7D;AAED,MAAM,WAAW,wBAAwB;IACvC,iBAAiB,EAAE,GAAG,GAAC,IAAI,CAAA;IAC3B,KAAK,EAAE,UAAU,CAAA;CAClB"} \ No newline at end of file +{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../src/interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7G,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AACpF,OAAO,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAC;AAE7C,oBAAY,aAAa,GAAG,IAAI,CAAA;AAChC,oBAAY,gBAAgB,GAAG,IAAI,CAAA;AACnC,oBAAY,aAAa,GAAG,IAAI,CAAA;AAChC,oBAAY,6BAA6B,GAAG,IAAI,CAAA;AAEhD,oBAAY,UAAU,GAAG,CAAC,GAAG,EAAC,GAAG,KAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAEvD,MAAM,WAAW,eAAgB,SAAQ,GAAG,CAAC,gBAAgB,EAAE,aAAa,EAAE,CAAC,CAAC;CAAE;AAClF,MAAM,WAAW,YAAa,SAAQ,GAAG,CAAC,aAAa,EAAE,aAAa,EAAE,CAAC,CAAC;CAAE;AAC5E,MAAM,WAAW,2BAA4B,SAAQ,GAAG,CAAC,6BAA6B,EAAE,aAAa,EAAE,CAAC,CAAC;CAAE;AAE3G,MAAM,WAAW,aAAc,SAAQ,oBAAoB;IACzD,MAAM,EAAE,eAAe,GAAC,IAAI,CAAA;IAC5B,EAAE,EAAE,YAAY,CAAA;CACjB;AAED,MAAM,WAAW,4BAA4B;IAC3C,CAAC,EAAE,YAAY,GAAC,IAAI,CAAA;IACpB,CAAC,EAAE,YAAY,CAAA;CAChB;AAED,MAAM,WAAW,4BAA6B,SAAQ,8BAA8B;IAClF,EAAE,EAAE,YAAY,CAAA;IAChB,WAAW,EAAE,CAAC,MAAM,CAAC,CAAA;CACtB;AAED,MAAM,WAAW,oBAAqB,SAAQ,sBAAsB;IAClE,EAAE,EAAE,YAAY,CAAA;CACjB;AAED,MAAM,WAAW,kBAAmB,SAAQ,oBAAoB;IAC9D,iBAAiB,CAAC,EAAE,2BAA2B,CAAA;IAC/C,GAAG,EAAE,CAAC,4BAA4B,GAAG,oBAAoB,CAAC,EAAE,CAAA;CAC7D;AAED,MAAM,WAAW,wBAAwB;IACvC,iBAAiB,EAAE,YAAY,GAAC,IAAI,CAAA;IACpC,KAAK,EAAE,UAAU,CAAA;CAClB"} \ No newline at end of file diff --git a/types/util.d.ts b/types/util.d.ts index c9049bf..045d08a 100644 --- a/types/util.d.ts +++ b/types/util.d.ts @@ -1,3 +1,6 @@ +/** + * @typedef {import('multiformats/interface').CID} CID + */ /** @typedef {import('bitcoin-block/interface').BlockPorcelain} BlockPorcelain */ /** * Instantiate a full object form from a full Bitcoin block graph binary representation. This binary form is typically extracted from a Bitcoin network node, such as with the Bitcoin Core `bitcoin-cli` `getblock 0` command (which outputs hexadecimal form and therefore needs to be decoded prior to handing to this function). This full binary form can also be obtained from the utility {@link assemble} function which can construct the full graph form of a Bitcoin block from the full IPLD block graph. @@ -46,8 +49,8 @@ export function serializeFullBitcoinBytes(obj: BlockPorcelain): Uint8Array; export function cidToHash(cid: CID | string): string; export const blockHashToCID: typeof block.blockHashToCID; export const txHashToCID: typeof tx.txHashToCID; +export type CID = import('multiformats/interface').CID; export type BlockPorcelain = import('bitcoin-block/interface').BlockPorcelain; -import { CID } from "multiformats/cid"; import * as block from "./bitcoin-block.js"; import * as tx from "./bitcoin-tx.js"; //# sourceMappingURL=util.d.ts.map \ No newline at end of file diff --git a/types/util.d.ts.map b/types/util.d.ts.map index 8b95d14..24b16de 100644 --- a/types/util.d.ts.map +++ b/types/util.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.js"],"names":[],"mappings":"AAQA,iFAAiF;AAEjF;;;;;;;;;GASG;AACH,mDAJW,UAAU,GACR,cAAc,CAS1B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,+CAJW,cAAc,GACZ,UAAU,CAKtB;AAED;;;;;;;;;;;;GAYG;AACH,+BAJW,GAAG,GAAC,MAAM,GACR,MAAM,CAalB;AArED,yDAAkD;AAClD,gDAAyC;6BAE3B,OAAO,yBAAyB,EAAE,cAAc"} \ No newline at end of file +{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.js"],"names":[],"mappings":"AAQA;;GAEG;AAEH,iFAAiF;AAEjF;;;;;;;;;GASG;AACH,mDAJW,UAAU,GACR,cAAc,CAS1B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,+CAJW,cAAc,GACZ,UAAU,CAKtB;AAED;;;;;;;;;;;;GAYG;AACH,+BAJW,GAAG,GAAC,MAAM,GACR,MAAM,CAalB;AAzED,yDAAkD;AAClD,gDAAyC;kBAG5B,OAAO,wBAAwB,EAAE,GAAG;6BAGnC,OAAO,yBAAyB,EAAE,cAAc"} \ No newline at end of file From 2c6fbcbceb583e96de9be62b9e35e487afd9748c Mon Sep 17 00:00:00 2001 From: Rod Vagg Date: Wed, 7 Sep 2022 18:13:28 +1000 Subject: [PATCH 2/2] feat: multiformats@10 Link interface & ESM --- package.json | 4 ++-- src/bitcoin-block.js | 8 ++++---- src/bitcoin-tx.js | 20 ++++++++++---------- src/bitcoin-witness-commitment.js | 12 ++++++------ src/complete.js | 4 ++-- src/interface.ts | 10 +++++----- src/util.js | 10 +++++----- types/interface.d.ts | 10 +++++----- types/interface.d.ts.map | 2 +- types/util.d.ts | 8 ++++---- types/util.d.ts.map | 2 +- 11 files changed, 45 insertions(+), 45 deletions(-) diff --git a/package.json b/package.json index 902a7f2..75502e0 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "homepage": "https://github.com/ipld/js-bitcoin#readme", "dependencies": { "bitcoin-block": "^2.0.1", - "multiformats": "^9.6.4" + "multiformats": "^10.0.0-pre.2" }, "devDependencies": { "@ipld/car": "^4.1.2", @@ -161,4 +161,4 @@ "@semantic-release/git" ] } -} \ No newline at end of file +} diff --git a/src/bitcoin-block.js b/src/bitcoin-block.js index 40d6151..a4b9eff 100644 --- a/src/bitcoin-block.js +++ b/src/bitcoin-block.js @@ -1,6 +1,6 @@ import { BitcoinBlock, fromHashHex } from 'bitcoin-block' import { bytes } from 'multiformats' -import { create as createCID } from 'multiformats/cid' +import { CID } from 'multiformats/cid' import * as dblSha2256 from './dbl-sha2-256.js' import { CODEC_BLOCK, CODEC_BLOCK_CODE, CODEC_TX_CODE } from './constants.js' @@ -46,13 +46,13 @@ export function decode (data) { // insert links derived from native hash hex strings if (deserialized.previousblockhash) { const parentDigest = dblSha2256.digestFrom(fromHashHex(deserialized.previousblockhash)) - deserialized.parent = createCID(1, CODEC_BLOCK_CODE, parentDigest) + deserialized.parent = CID.create(1, CODEC_BLOCK_CODE, parentDigest) } else { // genesis deserialized.parent = null } const txDigest = dblSha2256.digestFrom(fromHashHex(deserialized.merkleroot)) - deserialized.tx = createCID(1, CODEC_TX_CODE, txDigest) + deserialized.tx = CID.create(1, CODEC_TX_CODE, txDigest) return deserialized } @@ -82,5 +82,5 @@ export function blockHashToCID (blockHash) { blockHash = bytes.toHex(blockHash) } const digest = dblSha2256.digestFrom(fromHashHex(blockHash)) - return createCID(1, CODEC_BLOCK_CODE, digest) + return CID.create(1, CODEC_BLOCK_CODE, digest) } diff --git a/src/bitcoin-tx.js b/src/bitcoin-tx.js index 06b2b7e..ab5e74e 100644 --- a/src/bitcoin-tx.js +++ b/src/bitcoin-tx.js @@ -1,6 +1,6 @@ import { BitcoinTransaction as BitcoinBlockTransaction, fromHashHex, merkle } from 'bitcoin-block' import { bytes } from 'multiformats' -import { create as createCID, asCID } from 'multiformats/cid' +import { CID } from 'multiformats/cid' import * as dblSha2256 from './dbl-sha2-256.js' import { CODEC_TX, CODEC_TX_CODE, CODEC_WITNESS_COMMITMENT_CODE } from './constants.js' @@ -48,11 +48,11 @@ function _encode (node, noWitness) { export function encode (node) { if (Array.isArray(node)) { const bytes = new Uint8Array(64) - const leftCid = asCID(node[0]) + const leftCid = CID.asCID(node[0]) if (leftCid != null) { bytes.set(leftCid.multihash.digest) } - const rightCid = asCID(node[1]) + const rightCid = CID.asCID(node[1]) if (rightCid == null) { throw new TypeError('Expected BitcoinTransactionMerkleNode to be [CID|null,CID]') } @@ -111,7 +111,7 @@ function * _encodeAll (deserialized, noWitness) { (deserialized.tx[ii]) const { transaction, bytes } = _encode(tx, noWitness) const mh = dblSha2256.digest(bytes) - const cid = createCID(1, CODEC_TX_CODE, mh) + const cid = CID.create(1, CODEC_TX_CODE, mh) yield { cid, bytes, transaction } // base tx hashes.push(mh.digest) } @@ -119,7 +119,7 @@ function * _encodeAll (deserialized, noWitness) { for (const { hash, data } of merkle(hashes)) { if (data) { const mh = dblSha2256.digestFrom(hash) - const cid = createCID(1, CODEC_TX_CODE, mh) + const cid = CID.create(1, CODEC_TX_CODE, mh) const bytes = new Uint8Array(64) bytes.set(data[0], 0) bytes.set(data[1], 32) @@ -213,8 +213,8 @@ export function decode (data) { } const leftMh = left != null ? dblSha2256.digestFrom(left) : null const rightMh = dblSha2256.digestFrom(right) - const leftCid = leftMh != null ? createCID(1, CODEC_TX_CODE, leftMh) : null - const rightCid = createCID(1, CODEC_TX_CODE, rightMh) + const leftCid = leftMh != null ? CID.create(1, CODEC_TX_CODE, leftMh) : null + const rightCid = CID.create(1, CODEC_TX_CODE, rightMh) return [leftCid, rightCid] } @@ -231,14 +231,14 @@ export function decode (data) { // witness commitment and we can't discriminate at this point -- we can only do that by trying to // load the witness commitment from the generated CID const witnessCommitmentMh = dblSha2256.digestFrom(witnessCommitment) - const witnessCommitmentCid = createCID(1, CODEC_WITNESS_COMMITMENT_CODE, witnessCommitmentMh) + const witnessCommitmentCid = CID.create(1, CODEC_WITNESS_COMMITMENT_CODE, witnessCommitmentMh) deserialized.witnessCommitment = witnessCommitmentCid } } for (const vin of deserialized.vin) { if (typeof vin.txid === 'string' && /^[0-9a-f]{64}$/.test(vin.txid)) { const txidMh = dblSha2256.digestFrom(fromHashHex(vin.txid)) - vin.tx = createCID(1, CODEC_TX_CODE, txidMh) + vin.tx = CID.create(1, CODEC_TX_CODE, txidMh) } } @@ -270,7 +270,7 @@ export function txHashToCID (txHash) { txHash = bytes.toHex(txHash) } const digest = dblSha2256.digestFrom(fromHashHex(txHash)) - return createCID(1, CODEC_TX_CODE, digest) + return CID.create(1, CODEC_TX_CODE, digest) } /** diff --git a/src/bitcoin-witness-commitment.js b/src/bitcoin-witness-commitment.js index c034f9d..3da05f3 100644 --- a/src/bitcoin-witness-commitment.js +++ b/src/bitcoin-witness-commitment.js @@ -1,5 +1,5 @@ import { BitcoinTransaction } from 'bitcoin-block' -import { create as createCID, asCID } from 'multiformats/cid' +import { CID } from 'multiformats/cid' import * as dblSha2256 from './dbl-sha2-256.js' import { CODEC_TX, CODEC_TX_CODE, CODEC_WITNESS_COMMITMENT, CODEC_WITNESS_COMMITMENT_CODE } from './constants.js' @@ -34,7 +34,7 @@ export function encodeWitnessCommitment (deserialized, witnessMerkleRoot) { throw new TypeError('deserialized argument must be a Bitcoin block representation') } - if (witnessMerkleRoot !== null && !(witnessMerkleRoot instanceof Uint8Array) && !asCID(witnessMerkleRoot)) { + if (witnessMerkleRoot !== null && !(witnessMerkleRoot instanceof Uint8Array) && !CID.asCID(witnessMerkleRoot)) { throw new TypeError('witnessMerkleRoot must be a Uint8Array or CID') } @@ -47,7 +47,7 @@ export function encodeWitnessCommitment (deserialized, witnessMerkleRoot) { merkleRootHash = witnessMerkleRoot } else { // CID - const mrhcid = asCID(witnessMerkleRoot) + const mrhcid = CID.asCID(witnessMerkleRoot) if (mrhcid == null) { throw new TypeError('Expected witnessMerkleRoot to be a CID') } @@ -89,7 +89,7 @@ export function encodeWitnessCommitment (deserialized, witnessMerkleRoot) { } const mh = dblSha2256.digestFrom(hash) - const cid = createCID(1, CODEC_WITNESS_COMMITMENT_CODE, mh) + const cid = CID.create(1, CODEC_WITNESS_COMMITMENT_CODE, mh) return { cid, bytes } } @@ -114,7 +114,7 @@ export function encode (node) { if (!(node.nonce instanceof Uint8Array)) { throw new TypeError('bitcoin-witness-commitment must have a `nonce` Uint8Array') } - const witnessMerkleRoot = asCID(node.witnessMerkleRoot) + const witnessMerkleRoot = CID.asCID(node.witnessMerkleRoot) if (!witnessMerkleRoot) { throw new TypeError('bitcoin-witness-commitment must have a `witnessMerkleRoot` CID') } @@ -156,7 +156,7 @@ export function decode (data) { let witnessMerkleRoot = null if (!isNullHash(witnessHash)) { const witnessDigest = dblSha2256.digestFrom(witnessHash) - witnessMerkleRoot = createCID(1, CODEC_TX_CODE, witnessDigest) + witnessMerkleRoot = CID.create(1, CODEC_TX_CODE, witnessDigest) } return { witnessMerkleRoot, nonce } } diff --git a/src/complete.js b/src/complete.js index 163c0af..cbe4afb 100644 --- a/src/complete.js +++ b/src/complete.js @@ -1,5 +1,5 @@ import { bytes } from 'multiformats' -import { create as createCID } from 'multiformats/cid' +import { CID } from 'multiformats/cid' import { BitcoinBlock, BitcoinTransaction as BitcoinBlockTransaction } from 'bitcoin-block' import * as bitcoinBlockCodec from './bitcoin-block.js' import * as bitcoinTxCodec from './bitcoin-tx.js' @@ -27,7 +27,7 @@ function mkblock (obj) { const bytes = bitcoinBlockCodec.encode(obj) const mh = dblSha256.digest(bytes) return { - cid: createCID(1, bitcoinBlockCodec.code, mh), + cid: CID.create(1, bitcoinBlockCodec.code, mh), bytes } } diff --git a/src/interface.ts b/src/interface.ts index 78b2cde..b5fa413 100644 --- a/src/interface.ts +++ b/src/interface.ts @@ -1,17 +1,17 @@ import { TransactionInCoinbasePorcelain, TransactionInPorcelain } from 'bitcoin-block/classes/TransactionIn'; import { BlockHeaderPorcelain, TransactionPorcelain } from 'bitcoin-block/interface' -import { CID } from 'multiformats/interface'; +import { Link } from 'multiformats/link'; export type HASH_ALG_CODE = 0x56 export type CODEC_BLOCK_CODE = 0xb0 export type CODEC_TX_CODE = 0xb1 export type CODEC_WITNESS_COMMITMENT_CODE = 0xb2 -export type IPLDLoader = (cid:CID)=>Promise +export type IPLDLoader = (cid:Link)=>Promise -export interface BitcoinBlockCID extends CID{} -export interface BitcoinTxCID extends CID{} -export interface BitcoinWitnessCommitmentCID extends CID{} +export interface BitcoinBlockCID extends Link{} +export interface BitcoinTxCID extends Link{} +export interface BitcoinWitnessCommitmentCID extends Link{} export interface BitcoinHeader extends BlockHeaderPorcelain { parent: BitcoinBlockCID|null diff --git a/src/util.js b/src/util.js index 72932da..6fd19d8 100644 --- a/src/util.js +++ b/src/util.js @@ -1,4 +1,4 @@ -import { parse as parseCID, asCID } from 'multiformats/cid' +import { CID } from 'multiformats/cid' import { BitcoinBlock, toHashHex } from 'bitcoin-block' import * as block from './bitcoin-block.js' import * as tx from './bitcoin-tx.js' @@ -7,7 +7,7 @@ export const blockHashToCID = block.blockHashToCID export const txHashToCID = tx.txHashToCID /** - * @typedef {import('multiformats/interface').CID} CID + * @typedef {import('multiformats/link').Link} Link */ /** @typedef {import('bitcoin-block/interface').BlockPorcelain} BlockPorcelain */ @@ -62,15 +62,15 @@ export function serializeFullBitcoinBytes (obj) { * Works for both block identifiers and transaction identifiers. * * @name Bitcoin.cidToHash() - * @param {CID|string} cid a CID + * @param {Link|string} cid a CID * @returns {string} a hexadecimal big-endian representation of the identifier. * @function */ export function cidToHash (cid) { if (typeof cid === 'string') { - cid = parseCID(cid) + cid = CID.parse(cid) } - const acid = asCID(cid) + const acid = CID.asCID(cid) if (!acid) { throw new TypeError('Must provide a CID or a CID string') } diff --git a/types/interface.d.ts b/types/interface.d.ts index 01e86fc..db826ee 100644 --- a/types/interface.d.ts +++ b/types/interface.d.ts @@ -1,16 +1,16 @@ import { TransactionInCoinbasePorcelain, TransactionInPorcelain } from 'bitcoin-block/classes/TransactionIn'; import { BlockHeaderPorcelain, TransactionPorcelain } from 'bitcoin-block/interface'; -import { CID } from 'multiformats/interface'; +import { Link } from 'multiformats/link'; export declare type HASH_ALG_CODE = 0x56; export declare type CODEC_BLOCK_CODE = 0xb0; export declare type CODEC_TX_CODE = 0xb1; export declare type CODEC_WITNESS_COMMITMENT_CODE = 0xb2; -export declare type IPLDLoader = (cid: CID) => Promise; -export interface BitcoinBlockCID extends CID { +export declare type IPLDLoader = (cid: Link) => Promise; +export interface BitcoinBlockCID extends Link { } -export interface BitcoinTxCID extends CID { +export interface BitcoinTxCID extends Link { } -export interface BitcoinWitnessCommitmentCID extends CID { +export interface BitcoinWitnessCommitmentCID extends Link { } export interface BitcoinHeader extends BlockHeaderPorcelain { parent: BitcoinBlockCID | null; diff --git a/types/interface.d.ts.map b/types/interface.d.ts.map index 2afa2b3..32fedfc 100644 --- a/types/interface.d.ts.map +++ b/types/interface.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../src/interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7G,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AACpF,OAAO,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAC;AAE7C,oBAAY,aAAa,GAAG,IAAI,CAAA;AAChC,oBAAY,gBAAgB,GAAG,IAAI,CAAA;AACnC,oBAAY,aAAa,GAAG,IAAI,CAAA;AAChC,oBAAY,6BAA6B,GAAG,IAAI,CAAA;AAEhD,oBAAY,UAAU,GAAG,CAAC,GAAG,EAAC,GAAG,KAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAEvD,MAAM,WAAW,eAAgB,SAAQ,GAAG,CAAC,gBAAgB,EAAE,aAAa,EAAE,CAAC,CAAC;CAAE;AAClF,MAAM,WAAW,YAAa,SAAQ,GAAG,CAAC,aAAa,EAAE,aAAa,EAAE,CAAC,CAAC;CAAE;AAC5E,MAAM,WAAW,2BAA4B,SAAQ,GAAG,CAAC,6BAA6B,EAAE,aAAa,EAAE,CAAC,CAAC;CAAE;AAE3G,MAAM,WAAW,aAAc,SAAQ,oBAAoB;IACzD,MAAM,EAAE,eAAe,GAAC,IAAI,CAAA;IAC5B,EAAE,EAAE,YAAY,CAAA;CACjB;AAED,MAAM,WAAW,4BAA4B;IAC3C,CAAC,EAAE,YAAY,GAAC,IAAI,CAAA;IACpB,CAAC,EAAE,YAAY,CAAA;CAChB;AAED,MAAM,WAAW,4BAA6B,SAAQ,8BAA8B;IAClF,EAAE,EAAE,YAAY,CAAA;IAChB,WAAW,EAAE,CAAC,MAAM,CAAC,CAAA;CACtB;AAED,MAAM,WAAW,oBAAqB,SAAQ,sBAAsB;IAClE,EAAE,EAAE,YAAY,CAAA;CACjB;AAED,MAAM,WAAW,kBAAmB,SAAQ,oBAAoB;IAC9D,iBAAiB,CAAC,EAAE,2BAA2B,CAAA;IAC/C,GAAG,EAAE,CAAC,4BAA4B,GAAG,oBAAoB,CAAC,EAAE,CAAA;CAC7D;AAED,MAAM,WAAW,wBAAwB;IACvC,iBAAiB,EAAE,YAAY,GAAC,IAAI,CAAA;IACpC,KAAK,EAAE,UAAU,CAAA;CAClB"} \ No newline at end of file +{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../src/interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7G,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AACpF,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,oBAAY,aAAa,GAAG,IAAI,CAAA;AAChC,oBAAY,gBAAgB,GAAG,IAAI,CAAA;AACnC,oBAAY,aAAa,GAAG,IAAI,CAAA;AAChC,oBAAY,6BAA6B,GAAG,IAAI,CAAA;AAEhD,oBAAY,UAAU,GAAG,CAAC,GAAG,EAAC,IAAI,KAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAExD,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,CAAE,SAAQ,IAAI,CAAC,CAAC,EAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC,CAAC;CAAE;AACnH,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,CAAE,SAAQ,IAAI,CAAC,CAAC,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC,CAAC;CAAE;AAC7G,MAAM,WAAW,2BAA2B,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,CAAE,SAAQ,IAAI,CAAC,CAAC,EAAE,6BAA6B,EAAE,aAAa,EAAE,CAAC,CAAC;CAAE;AAE5I,MAAM,WAAW,aAAc,SAAQ,oBAAoB;IACzD,MAAM,EAAE,eAAe,GAAC,IAAI,CAAA;IAC5B,EAAE,EAAE,YAAY,CAAA;CACjB;AAED,MAAM,WAAW,4BAA4B;IAC3C,CAAC,EAAE,YAAY,GAAC,IAAI,CAAA;IACpB,CAAC,EAAE,YAAY,CAAA;CAChB;AAED,MAAM,WAAW,4BAA6B,SAAQ,8BAA8B;IAClF,EAAE,EAAE,YAAY,CAAA;IAChB,WAAW,EAAE,CAAC,MAAM,CAAC,CAAA;CACtB;AAED,MAAM,WAAW,oBAAqB,SAAQ,sBAAsB;IAClE,EAAE,EAAE,YAAY,CAAA;CACjB;AAED,MAAM,WAAW,kBAAmB,SAAQ,oBAAoB;IAC9D,iBAAiB,CAAC,EAAE,2BAA2B,CAAA;IAC/C,GAAG,EAAE,CAAC,4BAA4B,GAAG,oBAAoB,CAAC,EAAE,CAAA;CAC7D;AAED,MAAM,WAAW,wBAAwB;IACvC,iBAAiB,EAAE,YAAY,GAAC,IAAI,CAAA;IACpC,KAAK,EAAE,UAAU,CAAA;CAClB"} \ No newline at end of file diff --git a/types/util.d.ts b/types/util.d.ts index 045d08a..cf3899b 100644 --- a/types/util.d.ts +++ b/types/util.d.ts @@ -1,5 +1,5 @@ /** - * @typedef {import('multiformats/interface').CID} CID + * @typedef {import('multiformats/link').Link} Link */ /** @typedef {import('bitcoin-block/interface').BlockPorcelain} BlockPorcelain */ /** @@ -42,14 +42,14 @@ export function serializeFullBitcoinBytes(obj: BlockPorcelain): Uint8Array; * Works for both block identifiers and transaction identifiers. * * @name Bitcoin.cidToHash() - * @param {CID|string} cid a CID + * @param {Link|string} cid a CID * @returns {string} a hexadecimal big-endian representation of the identifier. * @function */ -export function cidToHash(cid: CID | string): string; +export function cidToHash(cid: Link | string): string; export const blockHashToCID: typeof block.blockHashToCID; export const txHashToCID: typeof tx.txHashToCID; -export type CID = import('multiformats/interface').CID; +export type Link = import('multiformats/link').Link; export type BlockPorcelain = import('bitcoin-block/interface').BlockPorcelain; import * as block from "./bitcoin-block.js"; import * as tx from "./bitcoin-tx.js"; diff --git a/types/util.d.ts.map b/types/util.d.ts.map index 24b16de..4ed2f6a 100644 --- a/types/util.d.ts.map +++ b/types/util.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.js"],"names":[],"mappings":"AAQA;;GAEG;AAEH,iFAAiF;AAEjF;;;;;;;;;GASG;AACH,mDAJW,UAAU,GACR,cAAc,CAS1B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,+CAJW,cAAc,GACZ,UAAU,CAKtB;AAED;;;;;;;;;;;;GAYG;AACH,+BAJW,GAAG,GAAC,MAAM,GACR,MAAM,CAalB;AAzED,yDAAkD;AAClD,gDAAyC;kBAG5B,OAAO,wBAAwB,EAAE,GAAG;6BAGnC,OAAO,yBAAyB,EAAE,cAAc"} \ No newline at end of file +{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.js"],"names":[],"mappings":"AAQA;;GAEG;AAEH,iFAAiF;AAEjF;;;;;;;;;GASG;AACH,mDAJW,UAAU,GACR,cAAc,CAS1B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,+CAJW,cAAc,GACZ,UAAU,CAKtB;AAED;;;;;;;;;;;;GAYG;AACH,+BAJW,IAAI,GAAC,MAAM,GACT,MAAM,CAalB;AAzED,yDAAkD;AAClD,gDAAyC;mBAG5B,OAAO,mBAAmB,EAAE,IAAI;6BAG/B,OAAO,yBAAyB,EAAE,cAAc"} \ No newline at end of file