Example #1
0
void OutPoint::unserialize(BinaryRefReader & brr)
{
   if (brr.getSizeRemaining() < 32)
      throw BlockDeserializingException();
   brr.get_BinaryData(txHash_, 32);
   txOutIndex_ = brr.get_uint32_t();
}
Example #2
0
IntType IntType::deserialize(BinaryRefReader& brr)
{
   auto type_code = brr.get_uint8_t();
   if (type_code != INTTYPE_CODE)
      BtcUtils::throw_type_error(INTTYPE_CODE, type_code);

   return IntType(brr.get_var_int());
}
Example #3
0
void TxOut::unserialize( BinaryRefReader & brr,
                         uint32_t nbytes,
                         TxRef  parent,
                         uint32_t idx)
{
   unserialize_checked( brr.getCurrPtr(), brr.getSizeRemaining(), nbytes, parent, idx );
   brr.advance(getSize());
}
Example #4
0
void BitcoinNetAddr::deserialize(BinaryRefReader brr)
{
   if (brr.getSize() != NETADDR_NOTIME)
      throw BitcoinMessageDeserError("invalid netaddr size");

   services_ = brr.get_uint64_t(); 
   auto ipv6bdr = brr.get_BinaryDataRef(16);
   memcpy(&ipV6_, ipv6bdr.getPtr(), 16);

   port_ = brr.get_uint16_t();
}
Example #5
0
size_t ScriptParser::seekToOpCode(BinaryRefReader& brr, OPCODETYPE opcode) const
{
   while (brr.getSizeRemaining() > 0)
   {
      auto&& oc = getNextOpcode(brr);
      if (oc.opcode_ == opcode)
         return brr.getPosition() - 1 - oc.dataRef_.getSize();
   }

   return brr.getPosition();
}
Example #6
0
BinaryDataObject BinaryDataObject::deserialize(BinaryRefReader& brr)
{
   auto type_code = brr.get_uint8_t();
   if (type_code != BINARYDATAOBJECT_CODE)
      BtcUtils::throw_type_error(BINARYDATAOBJECT_CODE, type_code);

   auto size = brr.get_var_int();
   if (size > brr.getSizeRemaining())
      throw runtime_error("invalid bdo size");

   return BinaryDataObject(brr.get_BinaryDataRef(size));
}
Example #7
0
ErrorType ErrorType::deserialize(BinaryRefReader& brr)
{
   auto type_code = brr.get_uint8_t();
   if (type_code != ERRTYPE_CODE)
      BtcUtils::throw_type_error(ERRTYPE_CODE, type_code);

   auto size = brr.get_var_int();
   if (size > brr.getSizeRemaining())
      throw runtime_error("invalid data len");

   return ErrorType(string((char*)brr.getCurrPtr(), size));
}
Example #8
0
bool DBUtils::checkPrefixByte(BinaryRefReader & brr,
   DB_PREFIX prefix,
   bool rewindWhenDone)
{
   uint8_t oneByte = brr.get_uint8_t();
   bool out = (oneByte == (uint8_t)prefix);

   if (rewindWhenDone)
      brr.rewind(1);

   return out;
}
Example #9
0
BLKDATA_TYPE DBUtils::readBlkDataKeyNoPrefix(
   BinaryRefReader & brr,
   uint32_t & height,
   uint8_t  & dupID,
   uint16_t & txIdx,
   uint16_t & txOutIdx)
{
   BinaryData hgtx = brr.get_BinaryData(4);
   height = hgtxToHeight(hgtx);
   dupID = hgtxToDupID(hgtx);

   if (brr.getSizeRemaining() == 0)
   {
      txIdx = 0xffff;
      txOutIdx = 0xffff;
      return BLKDATA_HEADER;
   }
   else if (brr.getSizeRemaining() == 2)
   {
      txIdx = brr.get_uint16_t(BE);
      txOutIdx = 0xffff;
      return BLKDATA_TX;
   }
   else if (brr.getSizeRemaining() == 4)
   {
      txIdx = brr.get_uint16_t(BE);
      txOutIdx = brr.get_uint16_t(BE);
      return BLKDATA_TXOUT;
   }
   else
   {
      LOGERR << "Unexpected bytes remaining: " << brr.getSizeRemaining();
      return NOT_BLKDATA;
   }
}
Example #10
0
ProgressData ProgressData::deserialize(BinaryRefReader& brr)
{
   auto type_code = brr.get_uint8_t();
   if (type_code != PROGRESSDATA_CODE)
      BtcUtils::throw_type_error(PROGRESSDATA_CODE, type_code);

   ProgressData pd;
   pd.phase_ = (BDMPhase)brr.get_uint8_t();
   pd.progress_ = brr.get_double();
   pd.time_ = brr.get_uint32_t();
   pd.numericProgress_ = brr.get_uint32_t();

   return pd;
}
Example #11
0
void ScriptParser::parseScript(BinaryRefReader& brr)
{
   while (brr.getSizeRemaining() != 0)
   {
      auto&& oc = getNextOpcode(brr);
      processOpCode(oc);
   }
}
Example #12
0
BinaryDataVector BinaryDataVector::deserialize(BinaryRefReader& brr)
{
   auto type_code = brr.get_uint8_t();
   if (type_code != BINARYDATAVECTOR_CODE)
      BtcUtils::throw_type_error(BINARYDATAVECTOR_CODE, type_code);

   auto size = brr.get_var_int();
   if (size > brr.getSizeRemaining())
      throw runtime_error("invalid bdvec size");

   BinaryDataVector bdvec;

   auto count = brr.get_var_int();
   for (unsigned i = 0; i < count; i++)
   {
      auto bdsize = brr.get_var_int();
      if (bdsize > brr.getSizeRemaining())
         throw runtime_error("invalid bd size");

      auto&& bdo = brr.get_BinaryData(bdsize);

      bdvec.push_back(move(bdo));
   }

   return bdvec;
}
Example #13
0
bool DBUtils::checkPrefixByteWError(BinaryRefReader & brr,
   DB_PREFIX prefix,
   bool rewindWhenDone)
{
   uint8_t oneByte = brr.get_uint8_t();
   bool out;
   if (oneByte == (uint8_t)prefix)
      out = true;
   else
   {
      LOGERR << "Unexpected prefix byte: "
         << "Expected: " << getPrefixName(prefix)
         << "Received: " << getPrefixName(oneByte);
      out = false;
   }

   if (rewindWhenDone)
      brr.rewind(1);

   return out;
}
Example #14
0
void StackInterpreter::processScript(BinaryRefReader& brr, bool isOutputScript)
{
   if (txStubPtr_ == nullptr)
      throw ("uninitialized stack");

   if (isOutputScript)
      outputScriptRef_ = brr.getRawRef();

   opcount_ = 0;
   isValid_ = false;

   ScriptParser::parseScript(brr);
}
Example #15
0
BLKDATA_TYPE DBUtils::readBlkDataKey(BinaryRefReader & brr,
   uint32_t & height,
   uint8_t  & dupID,
   uint16_t & txIdx,
   uint16_t & txOutIdx)
{
   uint8_t prefix = brr.get_uint8_t();
   if (prefix != (uint8_t)DB_PREFIX_TXDATA)
   {
      height = 0xffffffff;
      dupID = 0xff;
      txIdx = 0xffff;
      txOutIdx = 0xffff;
      return NOT_BLKDATA;
   }

   return readBlkDataKeyNoPrefix(brr, height, dupID, txIdx, txOutIdx);
}
Example #16
0
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//// ScriptParser
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
OpCode ScriptParser::getNextOpcode(BinaryRefReader& brr) const
{
   OpCode val;
   val.offset_ = brr.getPosition();
   val.opcode_ = brr.get_uint8_t();
   if (val.opcode_ <= 75 && val.opcode_ > 0)
   {
      val.dataRef_ = brr.get_BinaryDataRef(val.opcode_);
   }
   else
   {
      unsigned len = 0;
      switch (val.opcode_)
      {
      case OP_PUSHDATA1:
         len = brr.get_uint8_t();
         break;

      case OP_PUSHDATA2:
         len = brr.get_uint16_t();
         break;

      case OP_PUSHDATA4:
         len = brr.get_uint32_t();
         break;

      case OP_IF:
      case OP_NOTIF:
         len = brr.getSizeRemaining();
         break;

      default:
         return val;
      }

      val.dataRef_ = brr.get_BinaryDataRef(len);
   }

   return val;
}
Example #17
0
void TxOutRef::unserialize(BinaryRefReader & brr, uint32_t nbytes, TxRef* parent, int32_t idx)
{
   unserialize( brr.getCurrPtr(), nbytes, parent, idx );
   brr.advance(nBytes_);
}
Example #18
0
LedgerEntryVector LedgerEntryVector::deserialize(BinaryRefReader& brr)
{
   LedgerEntryVector lev;

   auto type_code = brr.get_uint8_t();
   if (type_code != LEDGERENTRYVECTOR_CODE)
      BtcUtils::throw_type_error(LEDGERENTRYVECTOR_CODE, type_code);


   auto count = brr.get_var_int();

   for (unsigned i = 0; i < count; i++)
   {
      auto leSize = brr.get_var_int();
      if (leSize > brr.getSizeRemaining())
         throw runtime_error("deser size mismatch");

      auto idSize = brr.get_var_int();
      if (idSize + 53 != leSize)
         throw runtime_error("deser size mismatch");

      string leid((char*)brr.getCurrPtr(), idSize);
      brr.advance(idSize);

      auto value = (int64_t*)brr.getCurrPtr();
      brr.advance(8);

      auto blockNum = brr.get_uint32_t();
      auto txHash = brr.get_BinaryDataRef(32);
      auto txindex = brr.get_uint32_t();
      auto txTime = brr.get_uint32_t();

      BitUnpacker<uint8_t> bit(brr.get_uint8_t());
      auto coinbase = bit.getBit();
      auto sts = bit.getBit();
      auto change = bit.getBit();
      auto rbf = bit.getBit();

      LedgerEntryData led(leid, *value,
         blockNum, txHash, txindex, txTime,
         coinbase, sts, change, rbf);

      lev.push_back(move(led));
   }

   return lev;
}
Example #19
0
void TxRef::unserialize(BinaryRefReader & brr)
{
   unserialize(brr.getCurrPtr());
   brr.advance(nBytes_);
}
Example #20
0
void BlockHeader::unserialize(BinaryRefReader & brr) 
{ 
   unserialize(brr.get_BinaryDataRef(HEADER_SIZE)); 
}
Example #21
0
void Tx::unserialize(BinaryRefReader & brr)
{
   unserialize(brr.getCurrPtr(), brr.getSizeRemaining());
   brr.advance(getSize());
}