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 }