bool deser_msg_getblocks(struct msg_getblocks *gb, struct const_buffer *buf) { msg_getblocks_free(gb); if (!deser_bp_locator(&gb->locator, buf)) return false; if (!deser_u256(&gb->hash_stop, buf)) return false; return true; }
btc_bool btc_tx_in_deserialize(btc_tx_in* tx_in, struct const_buffer* buf) { deser_u256(tx_in->prevout.hash, buf); if (!deser_u32(&tx_in->prevout.n, buf)) return false; if (!deser_varstr(&tx_in->script_sig, buf)) return false; if (!deser_u32(&tx_in->sequence, buf)) return false; return true; }
static bool blkdb_read_rec(struct blkdb *db, const struct p2p_message *msg) { struct blkinfo *bi; struct const_buffer buf = { msg->data, msg->hdr.data_len }; if (strncmp(msg->hdr.command, "rec", 12)) return false; bi = bi_new(); if (!bi) return false; /* deserialize record */ if (!deser_u256(&bi->hash, &buf)) goto err_out; if (!deser_bp_block(&bi->hdr, &buf)) goto err_out; /* verify that provided hash matches block header, as an additional * self-verification step */ bp_block_calc_sha256(&bi->hdr); if (!bu256_equal(&bi->hash, &bi->hdr.sha256)) goto err_out; /* verify block may be added to chain, then add it */ struct blkdb_reorg dummy; if (!blkdb_connect(db, bi, &dummy)) goto err_out; return true; err_out: bi_free(bi); return false; }