/** * BitcoinBlockHeader.hpp */ #ifndef EE382N_BITCOIN_BITCOINBLOCKHEADER_H #define EE382N_BITCOIN_BITCOINBLOCKHEADER_H #include #include #include #include class BitcoinBlockHeader { public: BitcoinBlockHeader(); void set_version(uint32_t version); uint32_t get_version() const; void set_prev_block(const std::string& prev_block); void set_prev_block(uint8_t prev_block[32]); std::string get_prev_block_str() const; const uint8_t* get_prev_block_u8() const; void set_merkle_root(const std::string& merkle_root); void set_merkle_root(uint8_t merkle_root[32]); std::string get_merkle_root_str() const; const uint8_t* get_merkle_root_u8() const; void set_ntime(uint32_t ntime); uint32_t get_ntime() const; void set_nbits(uint32_t nbits); uint32_t get_nbits() const; void set_nonce(uint32_t nonce); uint32_t get_nonce() const; std::string hash() const; const uint8_t* header_bytes() const; friend std::ostream &operator<<(std::ostream &os, const BitcoinBlockHeader &header); static void hex2bin(const std::string &hex_str, uint8_t *out); static std::string bin2hex(const uint8_t *bin, size_t len); static BitcoinBlockHeader GenesisBlock(); private: union BITCOIN_BLOCK_HEADER_UNION { struct block_header_u8 { uint8_t version[4]; uint8_t prev_block[32]; uint8_t merkle_root[32]; uint8_t ntime[4]; uint8_t nbits[4]; uint8_t nonce[4]; } block_header_u8; struct block_header_u32 { uint32_t version[1]; uint32_t prev_block[8]; uint32_t merkle_root[8]; uint32_t ntime[1]; uint32_t nbits[1]; uint32_t nonce[1]; } block_header_u32; uint8_t bytes[80]; } _header; }; #endif //EE382N_BITCOIN_BITCOINBLOCKHEADER_H