Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: use new multiformats CID interface and exports #7

Draft
wants to merge 2 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -161,4 +161,4 @@
"@semantic-release/git"
]
}
}
}
10 changes: 5 additions & 5 deletions src/bitcoin-block.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { BitcoinBlock, fromHashHex } from 'bitcoin-block'
import { CID, bytes } from 'multiformats'
import { bytes } from 'multiformats'
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'

Expand All @@ -8,9 +9,8 @@ import { CODEC_BLOCK, CODEC_BLOCK_CODE, CODEC_TX_CODE } from './constants.js'
* @typedef {import('multiformats/codecs/interface').ByteView<T>} 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
Expand Down Expand Up @@ -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) {
Expand Down
12 changes: 7 additions & 5 deletions src/bitcoin-tx.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { BitcoinTransaction as BitcoinBlockTransaction, fromHashHex, merkle } from 'bitcoin-block'
import { CID, bytes } from 'multiformats'
import { bytes } from 'multiformats'
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'

Expand All @@ -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)
Expand Down Expand Up @@ -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
*/
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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) {
Expand Down
8 changes: 5 additions & 3 deletions src/bitcoin-witness-commitment.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { BitcoinTransaction } from 'bitcoin-block'
import { CID } from 'multiformats'
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'

Expand All @@ -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)
Expand All @@ -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) {
Expand Down
16 changes: 10 additions & 6 deletions src/complete.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { CID, bytes } from 'multiformats'
import { bytes } from 'multiformats'
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'
Expand All @@ -13,10 +14,13 @@ 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) {
Expand All @@ -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)) {
Expand Down Expand Up @@ -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()
*/
Expand All @@ -146,7 +150,7 @@ export async function assemble (loader, blockCid) {
*/
const merkleCache = {}
/**
* @param {CID} txCid
* @param {BitcoinTxCID} txCid
* @returns {Promise<BitcoinTransaction|BitcoinTransactionMerkleNode>}
* @ignore
*/
Expand Down Expand Up @@ -178,7 +182,7 @@ export async function assemble (loader, blockCid) {
})()

/**
* @param {CID} txCid
* @param {BitcoinTxCID} txCid
* @returns {AsyncIterableIterator<BitcoinTransaction|BitcoinTransactionMerkleNode>}
* @ignore
*/
Expand Down
30 changes: 19 additions & 11 deletions src/interface.ts
Original file line number Diff line number Diff line change
@@ -1,35 +1,43 @@
import { TransactionInCoinbasePorcelain, TransactionInPorcelain } from 'bitcoin-block/classes/TransactionIn';
import { BlockHeaderPorcelain, TransactionPorcelain } from 'bitcoin-block/interface'
import { CID } from 'multiformats';
import { Link } from 'multiformats/link';

export type IPLDLoader = (cid:CID)=>Promise<Uint8Array>
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:Link)=>Promise<Uint8Array>

export interface BitcoinBlockCID<T extends unknown = unknown> extends Link<T, CODEC_BLOCK_CODE, HASH_ALG_CODE, 1>{}
export interface BitcoinTxCID<T extends unknown = unknown> extends Link<T, CODEC_TX_CODE, HASH_ALG_CODE, 1>{}
export interface BitcoinWitnessCommitmentCID<T extends unknown = unknown> extends Link<T, CODEC_WITNESS_COMMITMENT_CODE, HASH_ALG_CODE, 1>{}

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
}
6 changes: 5 additions & 1 deletion src/util.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ import * as tx from './bitcoin-tx.js'
export const blockHashToCID = block.blockHashToCID
export const txHashToCID = tx.txHashToCID

/**
* @typedef {import('multiformats/link').Link} Link
*/

/** @typedef {import('bitcoin-block/interface').BlockPorcelain} BlockPorcelain */

/**
Expand Down Expand Up @@ -58,7 +62,7 @@ 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
*/
Expand Down
11 changes: 5 additions & 6 deletions types/bitcoin-block.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@
* @template T
* @typedef {import('multiformats/codecs/interface').ByteView<T>} 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.
Expand All @@ -29,10 +28,10 @@ export function decode(data: ByteView<BitcoinHeader>): 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
Expand All @@ -45,5 +44,5 @@ export const name: "bitcoin-block";
export const code: 176;
export type ByteView<T> = import('multiformats/codecs/interface').ByteView<T>;
export type BitcoinHeader = import('./interface').BitcoinHeader;
import { CID } from "multiformats";
export type BitcoinBlockCID = import('./interface').BitcoinBlockCID;
//# sourceMappingURL=bitcoin-block.d.ts.map
2 changes: 1 addition & 1 deletion types/bitcoin-block.d.ts.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 7 additions & 7 deletions types/bitcoin-tx.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,10 @@ export function encodeNoWitness(node: BitcoinTransaction): ByteView<BitcoinTrans
*
* @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: BlockPorcelain): IterableIterator<{
cid: CID;
cid: BitcoinTxCID;
bytes: Uint8Array;
transaction?: BitcoinBlockTransaction;
}>;
Expand All @@ -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;
}>;
Expand All @@ -74,10 +74,10 @@ export function decode(data: ByteView<BitcoinTransaction | BitcoinTransactionMer
* 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: string): CID;
export function txHashToCID(txHash: string): BitcoinTxCID;
/**
* **`bitcoin-tx` / `0xb1` codec**: the codec name
* @name BitcoinTransaction.name
Expand All @@ -93,7 +93,7 @@ export type TransactionPorcelain = import('bitcoin-block/interface').Transaction
export type BlockPorcelain = import('bitcoin-block/interface').BlockPorcelain;
export type BitcoinTransaction = import('./interface').BitcoinTransaction;
export type BitcoinTransactionMerkleNode = import('./interface').BitcoinTransactionMerkleNode;
import { CID } from "multiformats";
export type BitcoinTxCID = import('./interface').BitcoinTxCID;
import { bytes } from "multiformats";
import { BitcoinTransaction as BitcoinBlockTransaction } from "bitcoin-block";
//# sourceMappingURL=bitcoin-tx.d.ts.map
2 changes: 1 addition & 1 deletion types/bitcoin-tx.d.ts.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 6 additions & 5 deletions types/bitcoin-witness-commitment.d.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
/**
* @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: import('bitcoin-block/classes/Block').BlockPorcelain, witnessMerkleRoot: CID | null): {
cid: CID;
export function encodeWitnessCommitment(deserialized: import('bitcoin-block/classes/Block').BlockPorcelain, witnessMerkleRoot: BitcoinTxCID | null): {
cid: BitcoinWitnessCommitmentCID;
bytes: Uint8Array;
} | null;
/**
Expand Down Expand Up @@ -49,5 +49,6 @@ export const code: 178;
export type ByteView<T> = import('multiformats/codecs/interface').ByteView<T>;
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
Loading