github.com/electroneum/electroneum-sc@v0.0.0-20230105223411-3bc1d078281e/consensus/istanbul/types/decode.go (about)

     1  package qbfttypes
     2  
     3  import (
     4  	istanbulcommon "github.com/electroneum/electroneum-sc/consensus/istanbul/common"
     5  	"github.com/electroneum/electroneum-sc/rlp"
     6  )
     7  
     8  func Decode(code uint64, data []byte) (QBFTMessage, error) {
     9  	switch code {
    10  	case PreprepareCode:
    11  		var preprepare Preprepare
    12  		if err := rlp.DecodeBytes(data, &preprepare); err != nil {
    13  			return nil, istanbulcommon.ErrFailedDecodePreprepare
    14  		}
    15  		preprepare.code = PreprepareCode
    16  		return &preprepare, nil
    17  	case PrepareCode:
    18  		var prepare Prepare
    19  		if err := rlp.DecodeBytes(data, &prepare); err != nil {
    20  			return nil, istanbulcommon.ErrFailedDecodeCommit
    21  		}
    22  		prepare.code = PrepareCode
    23  		return &prepare, nil
    24  	case CommitCode:
    25  		var commit Commit
    26  		if err := rlp.DecodeBytes(data, &commit); err != nil {
    27  			return nil, istanbulcommon.ErrFailedDecodeCommit
    28  		}
    29  		commit.code = CommitCode
    30  		return &commit, nil
    31  	case RoundChangeCode:
    32  		var roundChange RoundChange
    33  		if err := rlp.DecodeBytes(data, &roundChange); err != nil {
    34  			return nil, istanbulcommon.ErrFailedDecodeRoundChange
    35  		}
    36  		roundChange.code = RoundChangeCode
    37  		return &roundChange, nil
    38  	}
    39  
    40  	return nil, istanbulcommon.ErrInvalidMessage
    41  }