RLP::iterator::iterator(RLP const& _parent, bool _begin) { if (_begin && _parent.isList()) { auto pl = _parent.payload(); m_lastItem = pl.cropped(0, RLP(pl).actualSize()); m_remaining = pl.size() - m_lastItem.size(); } else { m_lastItem = _parent.data().cropped(_parent.data().size()); m_remaining = 0; } }
RLP::iterator::iterator(RLP const& _parent, bool _begin) { if (_begin && _parent.isList()) { auto pl = _parent.payload(); m_currentItem = pl.cropped(0, sizeAsEncoded(pl)); m_remaining = pl.size() - m_currentItem.size(); } else { m_currentItem = _parent.data().cropped(_parent.data().size()); m_remaining = 0; } }
RLP::iterator::iterator(RLP const& _parent, bool _begin) { if (_begin && _parent.isList()) { auto pl = _parent.payload(); m_lastItem = pl.cropped(0, RLP(pl).actualSize()); uint t = 0; for (uint i = 0; i < _parent.itemCount(); ++i) t += _parent[i].actualSize(); if (pl.size() != t) cout << _parent.itemCount() << " " << asHex(pl); assert(pl.size() == t); m_remaining = pl.size() - m_lastItem.size(); } else { m_lastItem = _parent.data().cropped(_parent.data().size()); m_remaining = 0; } }
RLP BlockHeader::extractHeader(bytesConstRef _block) { RLP root(_block); if (!root.isList()) BOOST_THROW_EXCEPTION( InvalidBlockFormat() << errinfo_comment("Block must be a list") << BadFieldError(0, _block.toString())); RLP header = root[0]; if (!header.isList()) BOOST_THROW_EXCEPTION(InvalidBlockFormat() << errinfo_comment("Block header must be a list") << BadFieldError(0, header.data().toString())); if (!root[1].isList()) BOOST_THROW_EXCEPTION(InvalidBlockFormat() << errinfo_comment("Block transactions must be a list") << BadFieldError(1, root[1].data().toString())); if (!root[2].isList()) BOOST_THROW_EXCEPTION(InvalidBlockFormat() << errinfo_comment("Block uncles must be a list") << BadFieldError(2, root[2].data().toString())); return header; }
BlockHeader::BlockHeader(bytesConstRef _block, BlockDataType _bdt, h256 const &_hashWith) { RLP header = _bdt == BlockData ? extractHeader(_block) : RLP(_block); m_hash = _hashWith ? _hashWith : sha3(header.data()); populate(header); }
BlockInfo::BlockInfo(bytesConstRef _block, Strictness _s, h256 const& _hashWith, BlockDataType _bdt) { RLP header = _bdt == BlockData ? extractHeader(_block) : RLP(_block); m_hash = _hashWith ? _hashWith : sha3(header.data()); populateFromHeader(header, _s); }