wallet-storage
Version:
BRC100 conforming wallet, wallet storage and wallet signer components
116 lines (108 loc) • 3.56 kB
text/typescript
/**
* These are fields of 80 byte serialized header in order whose double sha256 hash is a block's hash value
* and the next block's previousHash value.
*
* All block hash values and merkleRoot values are 32 byte hex string values with the byte order reversed from the serialized byte order.
*/
export interface BaseBlockHeader {
/**
* Block header version value. Serialized length is 4 bytes.
*/
version: number
/**
* Hash of previous block's block header. Serialized length is 32 bytes.
*/
previousHash: string
/**
* Root hash of the merkle tree of all transactions in this block. Serialized length is 32 bytes.
*/
merkleRoot: string
/**
* Block header time value. Serialized length is 4 bytes.
*/
time: number
/**
* Block header bits value. Serialized length is 4 bytes.
*/
bits: number
/**
* Block header nonce value. Serialized length is 4 bytes.
*/
nonce: number
}
/**
* A `BaseBlockHeader` extended with its computed hash and height in its chain.
*/
export interface BlockHeader extends BaseBlockHeader {
/**
* Height of the header, starting from zero.
*/
height: number
/**
* The double sha256 hash of the serialized `BaseBlockHeader` fields.
*/
hash: string
}
/**
* The "live" portion of the block chain is recent history that can conceivably be subject to reorganizations.
* The additional fields support tracking orphan blocks, chain forks, and chain reorgs.
*/
export interface LiveBlockHeader extends BlockHeader {
/**
* The cummulative chainwork achieved by the addition of this block to the chain.
* Chainwork only matters in selecting the active chain.
*/
chainWork: string
/**
* True only if this header is currently a chain tip. e.g. There is no header that follows it by previousHash or previousHeaderId.
*/
isChainTip: boolean
/**
* True only if this header is currently on the active chain.
*/
isActive: boolean
/**
* As there may be more than one header with identical height values due to orphan tracking,
* headers are assigned a unique headerId while part of the "live" portion of the block chain.
*/
headerId: number
/**
* Every header in the "live" portion of the block chain is linked to an ancestor header through
* both its previousHash and previousHeaderId properties.
*
* Due to forks, there may be multiple headers with identical `previousHash` and `previousHeaderId` values.
* Of these, only one (the header on the active chain) will have `isActive` === true.
*/
previousHeaderId: number | null
}
//
// TYPE GUARDS
//
/**
* Type guard function.
* @publicbody
*/
export function isLive (header: BlockHeader | LiveBlockHeader): header is LiveBlockHeader {
return (header as LiveBlockHeader).headerId !== undefined
}
/**
* Type guard function.
* @publicbody
*/
export function isBaseBlockHeader (header: BaseBlockHeader | BlockHeader | LiveBlockHeader): header is BaseBlockHeader {
return typeof header.previousHash === 'string'
}
/**
* Type guard function.
* @publicbody
*/
export function isBlockHeader (header: BaseBlockHeader | BlockHeader | LiveBlockHeader): header is LiveBlockHeader {
return ('height' in header) && typeof header.previousHash === 'string'
}
/**
* Type guard function.
* @publicbody
*/
export function isLiveBlockHeader (header: BaseBlockHeader | BlockHeader | LiveBlockHeader): header is LiveBlockHeader {
return 'chainwork' in header && typeof header.previousHash === 'string'
}