uint32_t addr_key_checksum(const output_point& outpoint) { data_chunk chksum_data(hash_digest_size + 4); auto serial = make_serializer(chksum_data.begin()); serial.write_hash(outpoint.hash); serial.write_4_bytes(outpoint.index); BITCOIN_ASSERT( std::distance(chksum_data.begin(), serial.iterator()) == hash_digest_size + 4); return generate_sha256_checksum(chksum_data); }
std::string payment_address::encoded(uint8_t version_byte) const { data_chunk unencoded_address; BITCOIN_ASSERT( type_ == payment_type::pubkey_hash || type_ == payment_type::script_hash); // Type, Hash, Checksum doth make thy address unencoded_address.push_back(version_byte); extend_data(unencoded_address, hash_); uint32_t checksum = generate_sha256_checksum(unencoded_address); extend_data(unencoded_address, uncast_type(checksum)); BITCOIN_ASSERT(unencoded_address.size() == 25); return encode_base58(unencoded_address); }
data_chunk create_raw_message(const Message& packet) { data_chunk payload(satoshi_raw_size(packet)); satoshi_save(packet, payload.begin()); // Make the header packet and serialise it message::header head; head.magic = magic_value; head.command = satoshi_command(packet); head.payload_length = payload.size(); head.checksum = generate_sha256_checksum(payload); data_chunk raw_header(satoshi_raw_size(head)); satoshi_save(head, raw_header.begin()); // Construct completed packet with header + payload data_chunk whole_message = raw_header; extend_data(whole_message, payload); // Probably not the right place for this // Networking output in an exporter log_info(log_domain::network) << "s: " << head.command << " (" << payload.size() << " bytes)"; return whole_message; }
bool payment_address::set_encoded(const std::string& encoded_address) { const data_chunk decoded_address = decode_base58(encoded_address); // version + 20 bytes short hash + 4 bytes checksum if (decoded_address.size() != 25) return false; const uint8_t version = decoded_address[0]; if (!set_version(version)) return false; const data_chunk checksum_bytes( decoded_address.end() - 4, decoded_address.end()); // version + short hash const data_chunk main_body( decoded_address.begin(), decoded_address.end() - 4); // verify checksum bytes if (generate_sha256_checksum(main_body) != cast_chunk<uint32_t>(checksum_bytes)) return false; std::copy(main_body.begin() + 1, main_body.end(), hash_.begin()); return true; }