void BitcoinP2P::processGetData(unique_ptr<Payload> payload) { Payload_GetData payloadgetdata = move(*(Payload_GetData*)payload.release()); auto& invvector = payloadgetdata.getInvVector(); auto getdatamap = getDataPayloadMap_.get(); for (auto& entry : invvector) { BinaryDataRef bdr(entry.hash, 32); auto payloadIter = getdatamap->find(bdr); if (payloadIter == getdatamap->end()) continue; auto&& payload = *payloadIter->second.payload_.get(); sendMessage(move(payload)); try { payloadIter->second.promise_->set_value(true); } catch (future_error&) { //do nothing } } }
BinaryData TransactionVerifier::serializeAllSequences() const { BinaryWriter bw; for (auto& txinOnS : theTx_.txins_) { auto sequenceOffset = txinOnS.first + txinOnS.second - 4; BinaryDataRef bdr(theTx_.data_ + sequenceOffset, 4); bw.put_BinaryDataRef(bdr); } return bw.getData(); }
vector<BinaryDataRef> SigHashData::tokenize( const BinaryData& data, uint8_t token) { vector<BinaryDataRef> tokens; BinaryRefReader brr(data.getRef()); size_t start = 0; StackInterpreter ss; while (brr.getSizeRemaining()) { auto offset = ss.seekToOpCode(brr, (OPCODETYPE)token); auto len = offset - start; BinaryDataRef bdr(data.getPtr() + start, len); tokens.push_back(move(bdr)); start = brr.getPosition(); } return tokens; }
//////////////////////////////////////////////////////////////////////////////// //// //// Payload classes //// //////////////////////////////////////////////////////////////////////////////// vector<uint8_t> Payload::serialize(uint32_t magic_word) const { //serialize payload auto payload_size = serialize_inner(nullptr); vector<uint8_t> msg; msg.resize(MESSAGE_HEADER_LEN + payload_size); if (payload_size > 0) serialize_inner(&msg[MESSAGE_HEADER_LEN]); //magic word uint8_t* ptr = &msg[0]; uint32_t* magicword = (uint32_t*)(ptr + MAGIC_WORD_OFFSET); *magicword = magic_word; //message type auto&& type = typeStr(); char* msgtype = (char*)(ptr + MESSAGE_TYPE_OFFSET); memset(msgtype, 0, MESSAGE_TYPE_LEN); memcpy(msgtype, type.c_str(), type.size()); //length uint32_t msglen = payload_size; uint32_t* msglenptr = (uint32_t*)(ptr + PAYLOAD_LENGTH_OFFSET); *msglenptr = msglen; //checksum uint8_t* payloadptr = nullptr; if (payload_size > 0) payloadptr = &msg[MESSAGE_HEADER_LEN]; BinaryDataRef bdr(payloadptr, payload_size); auto&& hash = BtcUtils::getHash256(bdr); uint32_t* checksum = (uint32_t*)hash.getPtr(); uint32_t* checksumptr = (uint32_t*)(ptr + CHECKSUM_OFFSET); *checksumptr = *checksum; return msg; }
#pragma once #include <string> class Bdr{ bdr(){} }