github.com/okex/exchain@v1.8.0/libs/tendermint/abci/types/amino.go (about)

     1  package types
     2  
     3  import (
     4  	"bytes"
     5  	"errors"
     6  	"fmt"
     7  	"time"
     8  
     9  	"github.com/okex/exchain/libs/tendermint/libs/kv"
    10  
    11  	"github.com/tendermint/go-amino"
    12  )
    13  
    14  func (pubkey PubKey) MarshalToAmino(cdc *amino.Codec) ([]byte, error) {
    15  	var buf bytes.Buffer
    16  	buf.Grow(pubkey.AminoSize(cdc))
    17  	err := pubkey.MarshalAminoTo(cdc, &buf)
    18  	if err != nil {
    19  		return nil, err
    20  	}
    21  	return buf.Bytes(), nil
    22  }
    23  
    24  func (pubkey *PubKey) MarshalAminoTo(_ *amino.Codec, buf *bytes.Buffer) error {
    25  	// field 1
    26  	if pubkey.Type != "" {
    27  		const pbKey = 1<<3 | 2
    28  		err := amino.EncodeStringWithKeyToBuffer(buf, pubkey.Type, pbKey)
    29  		if err != nil {
    30  			return err
    31  		}
    32  	}
    33  
    34  	// field 2
    35  	if len(pubkey.Data) != 0 {
    36  		const pbKey = 2<<3 | 2
    37  		err := amino.EncodeByteSliceWithKeyToBuffer(buf, pubkey.Data, pbKey)
    38  		if err != nil {
    39  			return err
    40  		}
    41  	}
    42  
    43  	return nil
    44  }
    45  
    46  // UnmarshalFromAmino unmarshal data from amino bytes.
    47  func (pub *PubKey) UnmarshalFromAmino(cdc *amino.Codec, data []byte) error {
    48  	var dataLen uint64 = 0
    49  	var subData []byte
    50  
    51  	for {
    52  		data = data[dataLen:]
    53  
    54  		if len(data) == 0 {
    55  			break
    56  		}
    57  
    58  		pos, aminoType, err := amino.ParseProtoPosAndTypeMustOneByte(data[0])
    59  		if err != nil {
    60  			return err
    61  		}
    62  		data = data[1:]
    63  
    64  		if aminoType == amino.Typ3_ByteLength {
    65  			var n int
    66  			dataLen, n, _ = amino.DecodeUvarint(data)
    67  
    68  			data = data[n:]
    69  			subData = data[:dataLen]
    70  		}
    71  
    72  		switch pos {
    73  		case 1:
    74  			pub.Type = string(subData)
    75  
    76  		case 2:
    77  			pub.Data = make([]byte, len(subData))
    78  			copy(pub.Data, subData)
    79  
    80  		default:
    81  			return fmt.Errorf("unexpect feild num %d", pos)
    82  		}
    83  	}
    84  	return nil
    85  }
    86  
    87  func (valUpdate ValidatorUpdate) MarshalToAmino(cdc *amino.Codec) ([]byte, error) {
    88  	var buf bytes.Buffer
    89  	buf.Grow(valUpdate.AminoSize(cdc))
    90  	err := valUpdate.MarshalAminoTo(cdc, &buf)
    91  	if err != nil {
    92  		return nil, err
    93  	}
    94  	return buf.Bytes(), nil
    95  }
    96  
    97  func (valUpdate ValidatorUpdate) MarshalAminoTo(cdc *amino.Codec, buf *bytes.Buffer) error {
    98  	var err error
    99  	// field 1
   100  	pubkeySize := valUpdate.PubKey.AminoSize(cdc)
   101  	if pubkeySize > 0 {
   102  		const pbKey = 1<<3 | 2
   103  		buf.WriteByte(pbKey)
   104  		err = amino.EncodeUvarintToBuffer(buf, uint64(pubkeySize))
   105  		if err != nil {
   106  			return err
   107  		}
   108  		lenBeforeData := buf.Len()
   109  		err = valUpdate.PubKey.MarshalAminoTo(cdc, buf)
   110  		if err != nil {
   111  			return err
   112  		}
   113  		if buf.Len()-lenBeforeData != pubkeySize {
   114  			return amino.NewSizerError(valUpdate.PubKey, buf.Len()-lenBeforeData, pubkeySize)
   115  		}
   116  	}
   117  
   118  	// field 2
   119  	if valUpdate.Power != 0 {
   120  		const pbKey = 2 << 3
   121  		err = amino.EncodeUvarintWithKeyToBuffer(buf, uint64(valUpdate.Power), pbKey)
   122  		if err != nil {
   123  			return err
   124  		}
   125  	}
   126  
   127  	return nil
   128  }
   129  
   130  // UnmarshalFromAmino unmarshal data from amino bytes.
   131  func (vu *ValidatorUpdate) UnmarshalFromAmino(cdc *amino.Codec, data []byte) error {
   132  	var dataLen uint64 = 0
   133  	var subData []byte
   134  
   135  	for {
   136  		data = data[dataLen:]
   137  		if len(data) == 0 {
   138  			break
   139  		}
   140  		pos, pbType, err := amino.ParseProtoPosAndTypeMustOneByte(data[0])
   141  		if err != nil {
   142  			return err
   143  		}
   144  		data = data[1:]
   145  
   146  		if pbType == amino.Typ3_ByteLength {
   147  			var n int
   148  			dataLen, n, _ = amino.DecodeUvarint(data)
   149  
   150  			data = data[n:]
   151  			if len(data) < int(dataLen) {
   152  				return errors.New("not enough data")
   153  			}
   154  			subData = data[:dataLen]
   155  		}
   156  
   157  		switch pos {
   158  		case 1:
   159  			err := vu.PubKey.UnmarshalFromAmino(cdc, subData)
   160  			if err != nil {
   161  				return err
   162  			}
   163  
   164  		case 2:
   165  			power, n, err := amino.DecodeUvarint(data)
   166  			if err != nil {
   167  				return err
   168  			}
   169  			dataLen = uint64(n)
   170  			vu.Power = int64(power)
   171  
   172  		default:
   173  			return fmt.Errorf("unexpect feild num %d", pos)
   174  		}
   175  	}
   176  	return nil
   177  }
   178  
   179  func (params BlockParams) MarshalToAmino(cdc *amino.Codec) ([]byte, error) {
   180  	var buf bytes.Buffer
   181  	buf.Grow(params.AminoSize(cdc))
   182  	err := params.MarshalAminoTo(cdc, &buf)
   183  	if err != nil {
   184  		return nil, err
   185  	}
   186  	return buf.Bytes(), nil
   187  }
   188  
   189  func (params BlockParams) MarshalAminoTo(_ *amino.Codec, buf *bytes.Buffer) error {
   190  	// field 1
   191  	if params.MaxBytes != 0 {
   192  		const pbKey = 1 << 3
   193  		err := amino.EncodeUvarintWithKeyToBuffer(buf, uint64(params.MaxBytes), pbKey)
   194  		if err != nil {
   195  			return err
   196  		}
   197  	}
   198  
   199  	// field 2
   200  	if params.MaxGas != 0 {
   201  		const pbKey = 2 << 3
   202  		err := amino.EncodeUvarintWithKeyToBuffer(buf, uint64(params.MaxGas), pbKey)
   203  		if err != nil {
   204  			return err
   205  		}
   206  	}
   207  	return nil
   208  }
   209  
   210  // UnmarshalFromAmino unmarshal data from amino bytes.
   211  func (bp *BlockParams) UnmarshalFromAmino(cdc *amino.Codec, data []byte) error {
   212  	var dataLen uint64 = 0
   213  
   214  	for {
   215  		data = data[dataLen:]
   216  
   217  		if len(data) == 0 {
   218  			break
   219  		}
   220  
   221  		pos, _, err := amino.ParseProtoPosAndTypeMustOneByte(data[0])
   222  		if err != nil {
   223  			return err
   224  		}
   225  		data = data[1:]
   226  
   227  		switch pos {
   228  		case 1:
   229  			mb, n, err := amino.DecodeUvarint(data)
   230  			if err != nil {
   231  				return err
   232  			}
   233  			dataLen = uint64(n)
   234  			bp.MaxBytes = int64(mb)
   235  		case 2:
   236  			mg, n, err := amino.DecodeUvarint(data)
   237  			if err != nil {
   238  				return err
   239  			}
   240  			dataLen = uint64(n)
   241  			bp.MaxGas = int64(mg)
   242  
   243  		default:
   244  			return fmt.Errorf("unexpect feild num %d", pos)
   245  		}
   246  	}
   247  	return nil
   248  }
   249  
   250  func (params EvidenceParams) MarshalToAmino(cdc *amino.Codec) ([]byte, error) {
   251  	var buf bytes.Buffer
   252  	buf.Grow(params.AminoSize(cdc))
   253  	err := params.MarshalAminoTo(cdc, &buf)
   254  	if err != nil {
   255  		return nil, err
   256  	}
   257  	return buf.Bytes(), nil
   258  }
   259  
   260  func (params EvidenceParams) MarshalAminoTo(_ *amino.Codec, buf *bytes.Buffer) error {
   261  	var err error
   262  	// field 1
   263  	if params.MaxAgeNumBlocks != 0 {
   264  		const pbKey = 1 << 3
   265  		err = amino.EncodeUvarintWithKeyToBuffer(buf, uint64(params.MaxAgeNumBlocks), pbKey)
   266  		if err != nil {
   267  			return err
   268  		}
   269  	}
   270  	// field 2
   271  	if params.MaxAgeDuration != 0 {
   272  		const pbKey = 2 << 3
   273  		err = amino.EncodeUvarintWithKeyToBuffer(buf, uint64(params.MaxAgeDuration), pbKey)
   274  		if err != nil {
   275  			return err
   276  		}
   277  	}
   278  	return nil
   279  }
   280  
   281  // UnmarshalFromAmino unmarshal data from amino bytes.
   282  func (ep *EvidenceParams) UnmarshalFromAmino(cdc *amino.Codec, data []byte) error {
   283  	var dataLen uint64 = 0
   284  
   285  	for {
   286  		data = data[dataLen:]
   287  		if len(data) == 0 {
   288  			break
   289  		}
   290  		pos, _, err := amino.ParseProtoPosAndTypeMustOneByte(data[0])
   291  		if err != nil {
   292  			return err
   293  		}
   294  		data = data[1:]
   295  
   296  		switch pos {
   297  		case 1:
   298  			ma, n, err := amino.DecodeUvarint(data)
   299  			if err != nil {
   300  				return err
   301  			}
   302  			dataLen = uint64(n)
   303  			ep.MaxAgeNumBlocks = int64(ma)
   304  
   305  		case 2:
   306  			md, n, err := amino.DecodeUvarint(data)
   307  			if err != nil {
   308  				return err
   309  			}
   310  			dataLen = uint64(n)
   311  			ep.MaxAgeDuration = time.Duration(md)
   312  
   313  		default:
   314  			return fmt.Errorf("unexpect feild num %d", pos)
   315  		}
   316  	}
   317  	return nil
   318  }
   319  
   320  func (params ValidatorParams) MarshalToAmino(cdc *amino.Codec) ([]byte, error) {
   321  	var buf bytes.Buffer
   322  	buf.Grow(params.AminoSize(cdc))
   323  	err := params.MarshalAminoTo(cdc, &buf)
   324  	if err != nil {
   325  		return nil, err
   326  	}
   327  	return buf.Bytes(), nil
   328  }
   329  
   330  func (params ValidatorParams) MarshalAminoTo(_ *amino.Codec, buf *bytes.Buffer) error {
   331  	var err error
   332  	// field 1
   333  	const pbKey = 1<<3 | 2
   334  	for i := 0; i < len(params.PubKeyTypes); i++ {
   335  		err = buf.WriteByte(pbKey)
   336  		if err != nil {
   337  			return err
   338  		}
   339  		err = amino.EncodeStringToBuffer(buf, params.PubKeyTypes[i])
   340  		if err != nil {
   341  			return err
   342  		}
   343  	}
   344  	return nil
   345  }
   346  
   347  // UnmarshalFromAmino unmarshal data from amino bytes.
   348  func (vp *ValidatorParams) UnmarshalFromAmino(cdc *amino.Codec, data []byte) error {
   349  	var dataLen uint64 = 0
   350  	var subData []byte
   351  
   352  	for {
   353  		data = data[dataLen:]
   354  		if len(data) == 0 {
   355  			break
   356  		}
   357  
   358  		pos, pbType, err := amino.ParseProtoPosAndTypeMustOneByte(data[0])
   359  		if err != nil {
   360  			return err
   361  		}
   362  		data = data[1:]
   363  
   364  		if pbType == amino.Typ3_ByteLength {
   365  			var n int
   366  			dataLen, n, _ = amino.DecodeUvarint(data)
   367  
   368  			data = data[n:]
   369  			if len(data) < int(dataLen) {
   370  				return errors.New("not enough data")
   371  			}
   372  			subData = data[:dataLen]
   373  		}
   374  
   375  		switch pos {
   376  		case 1:
   377  			vp.PubKeyTypes = append(vp.PubKeyTypes, string(subData))
   378  
   379  		default:
   380  			return fmt.Errorf("unexpect feild num %d", pos)
   381  		}
   382  	}
   383  	return nil
   384  }
   385  
   386  func (event *Event) MarshalToAmino(cdc *amino.Codec) ([]byte, error) {
   387  	var buf bytes.Buffer
   388  	buf.Grow(event.AminoSize(cdc))
   389  	err := event.MarshalAminoTo(cdc, &buf)
   390  	if err != nil {
   391  		return nil, err
   392  	}
   393  	return buf.Bytes(), nil
   394  }
   395  
   396  func (event *Event) MarshalAminoTo(cdc *amino.Codec, buf *bytes.Buffer) error {
   397  	// field 1
   398  	if event.Type != "" {
   399  		const pbKey = 1<<3 | 2
   400  		err := amino.EncodeStringWithKeyToBuffer(buf, event.Type, pbKey)
   401  		if err != nil {
   402  			return err
   403  		}
   404  	}
   405  
   406  	// field 2
   407  	for i := 0; i < len(event.Attributes); i++ {
   408  		const pbKey = 2<<3 | 2
   409  		buf.WriteByte(pbKey)
   410  		attrSize := event.Attributes[i].AminoSize(cdc)
   411  		err := amino.EncodeUvarintToBuffer(buf, uint64(attrSize))
   412  		if err != nil {
   413  			return err
   414  		}
   415  		lenBeforeData := buf.Len()
   416  		err = event.Attributes[i].MarshalAminoTo(cdc, buf)
   417  		if err != nil {
   418  			return err
   419  		}
   420  		if buf.Len()-lenBeforeData != attrSize {
   421  			return amino.NewSizerError(event.Attributes[i], buf.Len()-lenBeforeData, attrSize)
   422  		}
   423  	}
   424  	return nil
   425  }
   426  
   427  func (event *Event) UnmarshalFromAmino(cdc *amino.Codec, data []byte) error {
   428  	var dataLen uint64 = 0
   429  	var subData []byte
   430  
   431  	for {
   432  		data = data[dataLen:]
   433  
   434  		if len(data) == 0 {
   435  			break
   436  		}
   437  
   438  		pos, aminoType, err := amino.ParseProtoPosAndTypeMustOneByte(data[0])
   439  		if err != nil {
   440  			return err
   441  		}
   442  		if aminoType != amino.Typ3_ByteLength {
   443  			return errors.New("invalid amino type")
   444  		}
   445  		data = data[1:]
   446  
   447  		var n int
   448  		dataLen, n, _ = amino.DecodeUvarint(data)
   449  
   450  		data = data[n:]
   451  		subData = data[:dataLen]
   452  
   453  		switch pos {
   454  		case 1:
   455  			event.Type = string(subData)
   456  		case 2:
   457  			var kvpair kv.Pair
   458  			err = kvpair.UnmarshalFromAmino(cdc, subData)
   459  			if err != nil {
   460  				return err
   461  			}
   462  			event.Attributes = append(event.Attributes, kvpair)
   463  		default:
   464  			return fmt.Errorf("unexpect feild num %d", pos)
   465  		}
   466  	}
   467  	return nil
   468  }
   469  
   470  func (tx *ResponseDeliverTx) MarshalToAmino(cdc *amino.Codec) ([]byte, error) {
   471  	if tx == nil {
   472  		return nil, nil
   473  	}
   474  	var buf bytes.Buffer
   475  	buf.Grow(tx.AminoSize(cdc))
   476  	err := tx.MarshalAminoTo(cdc, &buf)
   477  	if err != nil {
   478  		return nil, err
   479  	}
   480  	return buf.Bytes(), nil
   481  }
   482  
   483  func (tx *ResponseDeliverTx) MarshalAminoTo(cdc *amino.Codec, buf *bytes.Buffer) error {
   484  	if tx == nil {
   485  		return nil
   486  	}
   487  	var err error
   488  	// field 1
   489  	if tx.Code != 0 {
   490  		const pbKey = 1 << 3
   491  		err = amino.EncodeUvarintWithKeyToBuffer(buf, uint64(tx.Code), pbKey)
   492  		if err != nil {
   493  			return err
   494  		}
   495  	}
   496  
   497  	// field 2
   498  	if len(tx.Data) != 0 {
   499  		const pbKey = 2<<3 | 2
   500  		err = amino.EncodeByteSliceWithKeyToBuffer(buf, tx.Data, pbKey)
   501  		if err != nil {
   502  			return err
   503  		}
   504  	}
   505  
   506  	// field 3
   507  	if tx.Log != "" {
   508  		const pbKey = 3<<3 | 2
   509  		err = amino.EncodeStringWithKeyToBuffer(buf, tx.Log, pbKey)
   510  		if err != nil {
   511  			return err
   512  		}
   513  	}
   514  
   515  	// field 4
   516  	if tx.Info != "" {
   517  		const pbKey = 4<<3 | 2
   518  		err = amino.EncodeStringWithKeyToBuffer(buf, tx.Info, pbKey)
   519  		if err != nil {
   520  			return err
   521  		}
   522  	}
   523  
   524  	// field 5
   525  	if tx.GasWanted != 0 {
   526  		const pbKey = 5 << 3
   527  		err = amino.EncodeUvarintWithKeyToBuffer(buf, uint64(tx.GasWanted), pbKey)
   528  		if err != nil {
   529  			return err
   530  		}
   531  	}
   532  
   533  	// field 6
   534  	if tx.GasUsed != 0 {
   535  		const pbKey = 6 << 3
   536  		err = amino.EncodeUvarintWithKeyToBuffer(buf, uint64(tx.GasUsed), pbKey)
   537  		if err != nil {
   538  			return err
   539  		}
   540  	}
   541  
   542  	// field 7
   543  	for i := 0; i < len(tx.Events); i++ {
   544  		const pbKey = 7<<3 | 2
   545  		buf.WriteByte(pbKey)
   546  		eventSize := tx.Events[i].AminoSize(cdc)
   547  		err = amino.EncodeUvarintToBuffer(buf, uint64(eventSize))
   548  		if err != nil {
   549  			return err
   550  		}
   551  		lenBeforeData := buf.Len()
   552  		err = tx.Events[i].MarshalAminoTo(cdc, buf)
   553  		if err != nil {
   554  			return err
   555  		}
   556  		if buf.Len()-lenBeforeData != eventSize {
   557  			return amino.NewSizerError(tx.Events[i], buf.Len()-lenBeforeData, eventSize)
   558  		}
   559  	}
   560  
   561  	// field 8
   562  	if tx.Codespace != "" {
   563  		const pbKey = 8<<3 | 2
   564  		err = amino.EncodeStringWithKeyToBuffer(buf, tx.Codespace, pbKey)
   565  		if err != nil {
   566  			return err
   567  		}
   568  	}
   569  
   570  	return nil
   571  }
   572  
   573  func (tx *ResponseDeliverTx) UnmarshalFromAmino(cdc *amino.Codec, data []byte) error {
   574  	var dataLen uint64 = 0
   575  	var subData []byte
   576  
   577  	for {
   578  		data = data[dataLen:]
   579  
   580  		if len(data) == 0 {
   581  			break
   582  		}
   583  
   584  		pos, aminoType, err := amino.ParseProtoPosAndTypeMustOneByte(data[0])
   585  		if err != nil {
   586  			return err
   587  		}
   588  		data = data[1:]
   589  
   590  		if aminoType == amino.Typ3_ByteLength {
   591  			var n int
   592  			dataLen, n, err = amino.DecodeUvarint(data)
   593  			if err != nil {
   594  				return err
   595  			}
   596  
   597  			data = data[n:]
   598  			if len(data) < int(dataLen) {
   599  				return errors.New("invalid datalen")
   600  			}
   601  			subData = data[:dataLen]
   602  		}
   603  
   604  		switch pos {
   605  		case 1:
   606  			var n int
   607  			var uvint uint64
   608  			uvint, n, err = amino.DecodeUvarint(data)
   609  			if err != nil {
   610  				return err
   611  			}
   612  			tx.Code = uint32(uvint)
   613  			dataLen = uint64(n)
   614  		case 2:
   615  			tx.Data = make([]byte, dataLen)
   616  			copy(tx.Data, subData)
   617  		case 3:
   618  			tx.Log = string(subData)
   619  		case 4:
   620  			tx.Info = string(subData)
   621  		case 5:
   622  			var n int
   623  			var uvint uint64
   624  			uvint, n, err = amino.DecodeUvarint(data)
   625  			if err != nil {
   626  				return err
   627  			}
   628  			tx.GasWanted = int64(uvint)
   629  			dataLen = uint64(n)
   630  		case 6:
   631  			var n int
   632  			var uvint uint64
   633  			uvint, n, err = amino.DecodeUvarint(data)
   634  			if err != nil {
   635  				return err
   636  			}
   637  			tx.GasUsed = int64(uvint)
   638  			dataLen = uint64(n)
   639  		case 7:
   640  			var event Event
   641  			err = event.UnmarshalFromAmino(cdc, subData)
   642  			if err != nil {
   643  				return err
   644  			}
   645  			tx.Events = append(tx.Events, event)
   646  		case 8:
   647  			tx.Codespace = string(subData)
   648  		default:
   649  			return fmt.Errorf("unexpect feild num %d", pos)
   650  		}
   651  	}
   652  	return nil
   653  }
   654  
   655  func (beginBlock ResponseBeginBlock) MarshalToAmino(cdc *amino.Codec) ([]byte, error) {
   656  	var buf bytes.Buffer
   657  	buf.Grow(beginBlock.AminoSize(cdc))
   658  	err := beginBlock.MarshalAminoTo(cdc, &buf)
   659  	if err != nil {
   660  		return nil, err
   661  	}
   662  	return buf.Bytes(), nil
   663  }
   664  
   665  func (beginBlock ResponseBeginBlock) MarshalAminoTo(cdc *amino.Codec, buf *bytes.Buffer) error {
   666  	for i := 0; i < len(beginBlock.Events); i++ {
   667  		const pbKey = 1<<3 | 2
   668  		buf.WriteByte(pbKey)
   669  		eventSize := beginBlock.Events[i].AminoSize(cdc)
   670  		err := amino.EncodeUvarintToBuffer(buf, uint64(eventSize))
   671  		if err != nil {
   672  			return err
   673  		}
   674  		lenBeforeData := buf.Len()
   675  		err = beginBlock.Events[i].MarshalAminoTo(cdc, buf)
   676  		if err != nil {
   677  			return err
   678  		}
   679  		if buf.Len()-lenBeforeData != eventSize {
   680  			return amino.NewSizerError(beginBlock.Events[i], buf.Len()-lenBeforeData, eventSize)
   681  		}
   682  	}
   683  	return nil
   684  }
   685  
   686  func (bb *ResponseBeginBlock) UnmarshalFromAmino(cdc *amino.Codec, data []byte) error {
   687  	var dataLen uint64 = 0
   688  	var subData []byte
   689  
   690  	for {
   691  		data = data[dataLen:]
   692  
   693  		if len(data) == 0 {
   694  			break
   695  		}
   696  
   697  		pos, aminoType, err := amino.ParseProtoPosAndTypeMustOneByte(data[0])
   698  		if err != nil {
   699  			return err
   700  		}
   701  		data = data[1:]
   702  
   703  		if aminoType == amino.Typ3_ByteLength {
   704  			var n int
   705  			dataLen, n, _ = amino.DecodeUvarint(data)
   706  
   707  			data = data[n:]
   708  			subData = data[:dataLen]
   709  		}
   710  
   711  		switch pos {
   712  		case 1:
   713  			event := Event{}
   714  			err = event.UnmarshalFromAmino(cdc, subData)
   715  			if err != nil {
   716  				return err
   717  			}
   718  			bb.Events = append(bb.Events, event)
   719  
   720  		default:
   721  			return fmt.Errorf("unexpect feild num %d", pos)
   722  		}
   723  	}
   724  	return nil
   725  }
   726  
   727  func (params ConsensusParams) MarshalToAmino(cdc *amino.Codec) ([]byte, error) {
   728  	var buf bytes.Buffer
   729  	buf.Grow(params.AminoSize(cdc))
   730  	err := params.MarshalAminoTo(cdc, &buf)
   731  	if err != nil {
   732  		return nil, err
   733  	}
   734  	return buf.Bytes(), nil
   735  }
   736  
   737  func (params *ConsensusParams) MarshalAminoTo(cdc *amino.Codec, buf *bytes.Buffer) error {
   738  	var err error
   739  	if params == nil {
   740  		return nil
   741  	}
   742  
   743  	// field 1
   744  	if params.Block != nil {
   745  		const pbKey = 1<<3 | 2
   746  		buf.WriteByte(pbKey)
   747  		blockSize := params.Block.AminoSize(cdc)
   748  		err = amino.EncodeUvarintToBuffer(buf, uint64(blockSize))
   749  		if err != nil {
   750  			return err
   751  		}
   752  		lenBeforeData := buf.Len()
   753  		err = params.Block.MarshalAminoTo(cdc, buf)
   754  		if err != nil {
   755  			return err
   756  		}
   757  		if buf.Len()-lenBeforeData != blockSize {
   758  			return amino.NewSizerError(params.Block, buf.Len()-lenBeforeData, blockSize)
   759  		}
   760  	}
   761  
   762  	// field 2
   763  	if params.Evidence != nil {
   764  		const pbKey = 2<<3 | 2
   765  		buf.WriteByte(pbKey)
   766  		evidenceSize := params.Evidence.AminoSize(cdc)
   767  		err = amino.EncodeUvarintToBuffer(buf, uint64(evidenceSize))
   768  		if err != nil {
   769  			return err
   770  		}
   771  		lenBeforeData := buf.Len()
   772  		err = params.Evidence.MarshalAminoTo(cdc, buf)
   773  		if err != nil {
   774  			return err
   775  		}
   776  		if buf.Len()-lenBeforeData != evidenceSize {
   777  			return amino.NewSizerError(params.Evidence, buf.Len()-lenBeforeData, evidenceSize)
   778  		}
   779  	}
   780  
   781  	// field 3
   782  	if params.Validator != nil {
   783  		const pbKey = 3<<3 | 2
   784  		buf.WriteByte(pbKey)
   785  		validatorSize := params.Validator.AminoSize(cdc)
   786  		err = amino.EncodeUvarintToBuffer(buf, uint64(validatorSize))
   787  		if err != nil {
   788  			return err
   789  		}
   790  		lenBeforeData := buf.Len()
   791  		err = params.Validator.MarshalAminoTo(cdc, buf)
   792  		if err != nil {
   793  			return err
   794  		}
   795  		if buf.Len()-lenBeforeData != validatorSize {
   796  			return amino.NewSizerError(params.Validator, buf.Len()-lenBeforeData, validatorSize)
   797  		}
   798  	}
   799  	return nil
   800  }
   801  
   802  func (cp *ConsensusParams) UnmarshalFromAmino(cdc *amino.Codec, data []byte) error {
   803  	var dataLen uint64 = 0
   804  	var subData []byte
   805  
   806  	for {
   807  		data = data[dataLen:]
   808  
   809  		if len(data) == 0 {
   810  			break
   811  		}
   812  
   813  		pos, aminoType, err := amino.ParseProtoPosAndTypeMustOneByte(data[0])
   814  		if err != nil {
   815  			return err
   816  		}
   817  		data = data[1:]
   818  
   819  		if aminoType == amino.Typ3_ByteLength {
   820  			var n int
   821  			dataLen, n, _ = amino.DecodeUvarint(data)
   822  
   823  			data = data[n:]
   824  			subData = data[:dataLen]
   825  		}
   826  
   827  		switch pos {
   828  		case 1:
   829  			bParams := &BlockParams{}
   830  			if len(subData) != 0 {
   831  				err := bParams.UnmarshalFromAmino(cdc, subData)
   832  				if err != nil {
   833  					return err
   834  				}
   835  			}
   836  			cp.Block = bParams
   837  		case 2:
   838  			eParams := &EvidenceParams{}
   839  			if len(subData) != 0 {
   840  				err := eParams.UnmarshalFromAmino(cdc, subData)
   841  				if err != nil {
   842  					return err
   843  				}
   844  			}
   845  			cp.Evidence = eParams
   846  
   847  		case 3:
   848  			vp := &ValidatorParams{}
   849  			if len(subData) != 0 {
   850  				err := vp.UnmarshalFromAmino(cdc, subData)
   851  				if err != nil {
   852  					return err
   853  				}
   854  			}
   855  			cp.Validator = vp
   856  
   857  		default:
   858  			return fmt.Errorf("unexpect feild num %d", pos)
   859  		}
   860  	}
   861  	return nil
   862  }
   863  
   864  func (endBlock ResponseEndBlock) MarshalToAmino(cdc *amino.Codec) ([]byte, error) {
   865  	var buf bytes.Buffer
   866  	buf.Grow(endBlock.AminoSize(cdc))
   867  	err := endBlock.MarshalAminoTo(cdc, &buf)
   868  	if err != nil {
   869  		return nil, err
   870  	}
   871  	return buf.Bytes(), nil
   872  }
   873  
   874  func (endBlock *ResponseEndBlock) MarshalAminoTo(cdc *amino.Codec, buf *bytes.Buffer) error {
   875  	if endBlock == nil {
   876  		return nil
   877  	}
   878  	var err error
   879  	// field 1
   880  	for i := 0; i < len(endBlock.ValidatorUpdates); i++ {
   881  		const pbKey = 1<<3 | 2
   882  		buf.WriteByte(pbKey)
   883  		valUpSize := endBlock.ValidatorUpdates[i].AminoSize(cdc)
   884  		err = amino.EncodeUvarintToBuffer(buf, uint64(valUpSize))
   885  		if err != nil {
   886  			return err
   887  		}
   888  		lenBeforeData := buf.Len()
   889  		err = endBlock.ValidatorUpdates[i].MarshalAminoTo(cdc, buf)
   890  		if err != nil {
   891  			return err
   892  		}
   893  		if buf.Len()-lenBeforeData != valUpSize {
   894  			return amino.NewSizerError(endBlock.ValidatorUpdates[i], buf.Len()-lenBeforeData, valUpSize)
   895  		}
   896  	}
   897  	// field 2
   898  	if endBlock.ConsensusParamUpdates != nil {
   899  		const pbKey = 2<<3 | 2
   900  		buf.WriteByte(pbKey)
   901  		conParamsSize := endBlock.ConsensusParamUpdates.AminoSize(cdc)
   902  		err = amino.EncodeUvarintToBuffer(buf, uint64(conParamsSize))
   903  		if err != nil {
   904  			return err
   905  		}
   906  		lenBeforeData := buf.Len()
   907  		err = endBlock.ConsensusParamUpdates.MarshalAminoTo(cdc, buf)
   908  		if err != nil {
   909  			return err
   910  		}
   911  		if buf.Len()-lenBeforeData != conParamsSize {
   912  			return amino.NewSizerError(endBlock.ConsensusParamUpdates, buf.Len()-lenBeforeData, conParamsSize)
   913  		}
   914  	}
   915  	// field 3
   916  	for i := 0; i < len(endBlock.Events); i++ {
   917  		const pbKey = 3<<3 | 2
   918  		buf.WriteByte(pbKey)
   919  		eventSize := endBlock.Events[i].AminoSize(cdc)
   920  		err = amino.EncodeUvarintToBuffer(buf, uint64(eventSize))
   921  		if err != nil {
   922  			return err
   923  		}
   924  		lenBeforeData := buf.Len()
   925  		err = endBlock.Events[i].MarshalAminoTo(cdc, buf)
   926  		if err != nil {
   927  			return err
   928  		}
   929  		if buf.Len()-lenBeforeData != eventSize {
   930  			return amino.NewSizerError(endBlock.Events[i], buf.Len()-lenBeforeData, eventSize)
   931  		}
   932  	}
   933  	return nil
   934  }
   935  
   936  func (m *PubKey) AminoSize(_ *amino.Codec) int {
   937  	if m == nil {
   938  		return 0
   939  	}
   940  	size := 0
   941  	if len(m.Type) != 0 {
   942  		size += 1 + amino.EncodedStringSize(m.Type)
   943  	}
   944  	if len(m.Data) != 0 {
   945  		size += 1 + amino.ByteSliceSize(m.Data)
   946  	}
   947  	return size
   948  }
   949  
   950  func (m *ValidatorUpdate) AminoSize(cdc *amino.Codec) int {
   951  	if m == nil {
   952  		return 0
   953  	}
   954  	size := 0
   955  	pubkeySize := m.PubKey.AminoSize(cdc)
   956  	if pubkeySize > 0 {
   957  		size += 1 + amino.UvarintSize(uint64(pubkeySize)) + pubkeySize
   958  	}
   959  	if m.Power != 0 {
   960  		size += 1 + amino.UvarintSize(uint64(m.Power))
   961  	}
   962  	return size
   963  }
   964  
   965  func (m *BlockParams) AminoSize(_ *amino.Codec) int {
   966  	if m == nil {
   967  		return 0
   968  	}
   969  	size := 0
   970  	if m.MaxBytes != 0 {
   971  		size += 1 + amino.UvarintSize(uint64(m.MaxBytes))
   972  	}
   973  	if m.MaxGas != 0 {
   974  		size += 1 + amino.UvarintSize(uint64(m.MaxGas))
   975  	}
   976  	return size
   977  }
   978  
   979  func (m *EvidenceParams) AminoSize(_ *amino.Codec) int {
   980  	if m == nil {
   981  		return 0
   982  	}
   983  	size := 0
   984  	if m.MaxAgeNumBlocks != 0 {
   985  		size += 1 + amino.UvarintSize(uint64(m.MaxAgeNumBlocks))
   986  	}
   987  	if m.MaxAgeDuration != 0 {
   988  		size += 1 + amino.UvarintSize(uint64(m.MaxAgeDuration))
   989  	}
   990  	return size
   991  }
   992  
   993  func (m *ValidatorParams) AminoSize(_ *amino.Codec) int {
   994  	if m == nil {
   995  		return 0
   996  	}
   997  	size := 0
   998  	for _, pkt := range m.PubKeyTypes {
   999  		size += 1 + amino.EncodedStringSize(pkt)
  1000  	}
  1001  	return size
  1002  }
  1003  
  1004  func (event Event) AminoSize(cdc *amino.Codec) int {
  1005  	size := 0
  1006  
  1007  	if len(event.Type) != 0 {
  1008  		size += 1 + amino.EncodedStringSize(event.Type)
  1009  	}
  1010  
  1011  	for _, attr := range event.Attributes {
  1012  		attrSize := attr.AminoSize(cdc)
  1013  		size += 1 + amino.UvarintSize(uint64(attrSize)) + attrSize
  1014  	}
  1015  
  1016  	return size
  1017  }
  1018  
  1019  func (tx *ResponseDeliverTx) AminoSize(cdc *amino.Codec) int {
  1020  	if tx == nil {
  1021  		return 0
  1022  	}
  1023  	size := 0
  1024  	if tx.Code != 0 {
  1025  		size += 1 + amino.UvarintSize(uint64(tx.Code))
  1026  	}
  1027  	if len(tx.Data) != 0 {
  1028  		size += 1 + amino.ByteSliceSize(tx.Data)
  1029  	}
  1030  	if len(tx.Log) != 0 {
  1031  		size += 1 + amino.EncodedStringSize(tx.Log)
  1032  	}
  1033  	if len(tx.Info) != 0 {
  1034  		size += 1 + amino.EncodedStringSize(tx.Info)
  1035  	}
  1036  	if tx.GasWanted != 0 {
  1037  		size += 1 + amino.UvarintSize(uint64(tx.GasWanted))
  1038  	}
  1039  	if tx.GasUsed != 0 {
  1040  		size += 1 + amino.UvarintSize(uint64(tx.GasUsed))
  1041  	}
  1042  	for _, e := range tx.Events {
  1043  		eventSize := e.AminoSize(cdc)
  1044  		size += 1 + amino.UvarintSize(uint64(eventSize)) + eventSize
  1045  	}
  1046  	if len(tx.Codespace) != 0 {
  1047  		size += 1 + amino.EncodedStringSize(tx.Codespace)
  1048  	}
  1049  	return size
  1050  }
  1051  
  1052  func (beginBlock *ResponseBeginBlock) AminoSize(cdc *amino.Codec) int {
  1053  	if beginBlock == nil {
  1054  		return 0
  1055  	}
  1056  	size := 0
  1057  	for _, event := range beginBlock.Events {
  1058  		eventSize := event.AminoSize(cdc)
  1059  		size += 1 + amino.UvarintSize(uint64(eventSize)) + eventSize
  1060  	}
  1061  	return size
  1062  }
  1063  
  1064  func (m *ConsensusParams) AminoSize(cdc *amino.Codec) int {
  1065  	if m == nil {
  1066  		return 0
  1067  	}
  1068  	size := 0
  1069  	if m.Block != nil {
  1070  		blockSize := m.Block.AminoSize(cdc)
  1071  		size += 1 + amino.UvarintSize(uint64(blockSize)) + blockSize
  1072  	}
  1073  	if m.Evidence != nil {
  1074  		eviSize := m.Evidence.AminoSize(cdc)
  1075  		size += 1 + amino.UvarintSize(uint64(eviSize)) + eviSize
  1076  	}
  1077  	if m.Validator != nil {
  1078  		valSize := m.Validator.AminoSize(cdc)
  1079  		size += 1 + amino.UvarintSize(uint64(valSize)) + valSize
  1080  	}
  1081  	return size
  1082  }
  1083  
  1084  func (m *ResponseEndBlock) AminoSize(cdc *amino.Codec) int {
  1085  	if m == nil {
  1086  		return 0
  1087  	}
  1088  	size := 0
  1089  	for _, valUpd := range m.ValidatorUpdates {
  1090  		valUpdSize := valUpd.AminoSize(cdc)
  1091  		size += 1 + amino.UvarintSize(uint64(valUpdSize)) + valUpdSize
  1092  	}
  1093  	if m.ConsensusParamUpdates != nil {
  1094  		conSize := m.ConsensusParamUpdates.AminoSize(cdc)
  1095  		size += 1 + amino.UvarintSize(uint64(conSize)) + conSize
  1096  	}
  1097  	for _, event := range m.Events {
  1098  		eventSize := event.AminoSize(cdc)
  1099  		size += 1 + amino.UvarintSize(uint64(eventSize)) + eventSize
  1100  	}
  1101  	return size
  1102  }
  1103  
  1104  func (eb *ResponseEndBlock) UnmarshalFromAmino(cdc *amino.Codec, data []byte) error {
  1105  	var dataLen uint64 = 0
  1106  	var subData []byte
  1107  
  1108  	for {
  1109  		data = data[dataLen:]
  1110  
  1111  		if len(data) == 0 {
  1112  			break
  1113  		}
  1114  
  1115  		pos, aminoType, err := amino.ParseProtoPosAndTypeMustOneByte(data[0])
  1116  		if err != nil {
  1117  			return err
  1118  		}
  1119  		data = data[1:]
  1120  
  1121  		if aminoType == amino.Typ3_ByteLength {
  1122  			var n int
  1123  			dataLen, n, _ = amino.DecodeUvarint(data)
  1124  
  1125  			data = data[n:]
  1126  			subData = data[:dataLen]
  1127  		}
  1128  
  1129  		switch pos {
  1130  		case 1:
  1131  			vu := ValidatorUpdate{}
  1132  			err := vu.UnmarshalFromAmino(cdc, subData)
  1133  			if err != nil {
  1134  				return err
  1135  			}
  1136  			eb.ValidatorUpdates = append(eb.ValidatorUpdates, vu)
  1137  		case 2:
  1138  			consParam := &ConsensusParams{}
  1139  			if len(subData) != 0 {
  1140  				err := consParam.UnmarshalFromAmino(cdc, subData)
  1141  				if err != nil {
  1142  					return err
  1143  				}
  1144  			}
  1145  			eb.ConsensusParamUpdates = consParam
  1146  		case 3:
  1147  			var event Event
  1148  			err = event.UnmarshalFromAmino(cdc, subData)
  1149  			if err != nil {
  1150  				return err
  1151  			}
  1152  			eb.Events = append(eb.Events, event)
  1153  
  1154  		default:
  1155  			return fmt.Errorf("unexpect feild num %d", pos)
  1156  		}
  1157  	}
  1158  	return nil
  1159  }