block/dao: simplify trimming, avoid allocations

The only user of (*Block).Trim() is in DAO and it already has a nice buffer
usually, so creating another one makes no sense. It also simplifies error
handling a lot.
This commit is contained in:
Roman Khimov 2022-03-18 10:49:25 +03:00
parent f056c9aea8
commit 5616585697
3 changed files with 11 additions and 24 deletions

View file

@ -100,26 +100,16 @@ func New(stateRootEnabled bool) *Block {
}
}
// Trim returns a subset of the block data to save up space
// in storage.
// Notice that only the hashes of the transactions are stored.
func (b *Block) Trim() ([]byte, error) {
buf := io.NewBufBinWriter()
numTx := len(b.Transactions)
buf.Grow(b.GetExpectedBlockSizeWithoutTransactions(numTx) + util.Uint256Size*numTx)
b.Header.EncodeBinary(buf.BinWriter)
// EncodeTrimmed writes trimmed representation of the block data into w. Trimmed blocks
// do not store complete transactions, instead they only store their hashes.
func (b *Block) EncodeTrimmed(w *io.BinWriter) {
b.Header.EncodeBinary(w)
buf.WriteVarUint(uint64(numTx))
w.WriteVarUint(uint64(len(b.Transactions)))
for _, tx := range b.Transactions {
h := tx.Hash()
h.EncodeBinary(buf.BinWriter)
h.EncodeBinary(w)
}
if buf.Err != nil {
return nil, buf.Err
}
return buf.Bytes(), nil
}
// DecodeBinary decodes the block from the given BinReader, implementing

View file

@ -55,10 +55,11 @@ func TestDecodeBlock1(t *testing.T) {
func TestTrimmedBlock(t *testing.T) {
block := getDecodedBlock(t, 1)
b, err := block.Trim()
require.NoError(t, err)
buf := io.NewBufBinWriter()
block.EncodeTrimmed(buf.BinWriter)
require.NoError(t, buf.Err)
r := io.NewBinReaderFromBuf(b)
r := io.NewBinReaderFromBuf(buf.Bytes())
trimmedBlock, err := NewTrimmedFromReader(false, r)
require.NoError(t, err)

View file

@ -648,11 +648,7 @@ func (dao *Simple) StoreAsBlock(block *block.Block, aer1 *state.AppExecResult, a
buf = dao.getDataBuf()
)
buf.WriteB(storage.ExecBlock)
b, err := block.Trim()
if err != nil {
return err
}
buf.WriteBytes(b)
block.EncodeTrimmed(buf.BinWriter)
if aer1 != nil {
aer1.EncodeBinary(buf.BinWriter)
}