github.com/okex/exchain@v1.8.0/libs/tendermint/store/utils.go (about)

     1  package store
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"github.com/tendermint/go-amino"
     7  )
     8  
     9  func unmarshalBlockPartBytesTo(data []byte, buf *bytes.Buffer) error {
    10  	var dataLen uint64 = 0
    11  	var subData []byte
    12  
    13  	for {
    14  		data = data[dataLen:]
    15  		if len(data) == 0 {
    16  			break
    17  		}
    18  
    19  		pos, aminoType, err := amino.ParseProtoPosAndTypeMustOneByte(data[0])
    20  		if err != nil {
    21  			return err
    22  		}
    23  		data = data[1:]
    24  
    25  		if aminoType == amino.Typ3_ByteLength {
    26  			var n int
    27  			dataLen, n, err = amino.DecodeUvarint(data)
    28  			if err != nil {
    29  				return err
    30  			}
    31  
    32  			data = data[n:]
    33  			if len(data) < int(dataLen) {
    34  				return fmt.Errorf("not enough data for %s, need %d, have %d", aminoType, dataLen, len(data))
    35  			}
    36  			subData = data[:dataLen]
    37  		}
    38  
    39  		switch pos {
    40  		case 1:
    41  			_, n, err := amino.DecodeUvarint(data)
    42  			if err != nil {
    43  				return err
    44  			}
    45  			dataLen = uint64(n)
    46  		case 2:
    47  			buf.Write(subData)
    48  			return nil
    49  		case 3:
    50  		default:
    51  			return fmt.Errorf("unexpect feild num %d", pos)
    52  		}
    53  	}
    54  	return nil
    55  }