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