github.com/okex/exchain@v1.8.0/libs/tendermint/state/execution_dds_payload.go (about)

     1  package state
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/okex/exchain/libs/iavl"
     7  	"github.com/okex/exchain/libs/tendermint/types"
     8  )
     9  
    10  func unmarshalTreeDeltaMap(input []byte) (interface{}, error) {
    11  	if len(input) == 0 {
    12  		return nil, fmt.Errorf("failed unmarshal TreeDeltaMap: empty data")
    13  	}
    14  	treeDeltaMap := iavl.TreeDeltaMap{}
    15  	err := treeDeltaMap.UnmarshalFromAmino(nil, input)
    16  	return treeDeltaMap, err
    17  }
    18  
    19  func marshalTreeDeltaMap(deltaMap interface{}) ([]byte, error) {
    20  	dm, ok := deltaMap.(iavl.TreeDeltaMap)
    21  	if !ok {
    22  		return nil, fmt.Errorf("failed marshal TreeDeltaMap")
    23  	}
    24  	return dm.MarshalToAmino(nil)
    25  }
    26  
    27  type DeltaInfo struct {
    28  	from          string
    29  	deltaLen      int
    30  	deltaHeight   int64
    31  	abciResponses *ABCIResponses
    32  	treeDeltaMap  interface{}
    33  	watchData     interface{}
    34  	wasmWatchData interface{}
    35  
    36  	marshalWatchData     func() ([]byte, error)
    37  	wasmMarshalWatchData func() ([]byte, error)
    38  }
    39  
    40  // for upload
    41  func (info *DeltaInfo) dataInfo2Bytes() (types.DeltaPayload, error) {
    42  	var err error
    43  	pl := types.DeltaPayload{}
    44  	pl.ABCIRsp, err = info.abciResponses.MarshalToAmino(cdc)
    45  	if err != nil {
    46  		return pl, err
    47  	}
    48  
    49  	pl.DeltasBytes, err = marshalTreeDeltaMap(info.treeDeltaMap)
    50  	if err != nil {
    51  		return pl, err
    52  	}
    53  
    54  	pl.WatchBytes, err = info.marshalWatchData()
    55  	if err != nil {
    56  		return pl, err
    57  	}
    58  
    59  	pl.WasmWatchBytes, err = info.wasmMarshalWatchData()
    60  	if err != nil {
    61  		return pl, err
    62  	}
    63  
    64  	return pl, err
    65  }
    66  
    67  func (info *DeltaInfo) bytes2DeltaInfo(pl *types.DeltaPayload) error {
    68  	if pl == nil {
    69  		return fmt.Errorf("Failed bytes to delta info: empty delta payload. ")
    70  	}
    71  	var err error
    72  	ar := &ABCIResponses{}
    73  	err = ar.UnmarshalFromAmino(nil, pl.ABCIRsp)
    74  	if err != nil {
    75  		return err
    76  	}
    77  	info.abciResponses = ar
    78  
    79  	info.treeDeltaMap, err = unmarshalTreeDeltaMap(pl.DeltasBytes)
    80  	if err != nil {
    81  		return err
    82  	}
    83  	if types.FastQuery {
    84  		info.watchData, err = evmWatchDataManager.UnmarshalWatchData(pl.WatchBytes)
    85  		if err != nil {
    86  			return err
    87  		}
    88  	}
    89  	info.wasmWatchData, err = wasmWatchDataManager.UnmarshalWatchData(pl.WasmWatchBytes)
    90  	if err != nil {
    91  		return err
    92  	}
    93  
    94  	return err
    95  }