github.com/FUSIONFoundation/efsn@v3.6.2-0.20200916075423-dbb5dd5d2cc7+incompatible/consensus/datong/api.go (about)

     1  package datong
     2  
     3  import (
     4  	"encoding/base64"
     5  	"encoding/json"
     6  	"fmt"
     7  	"math/big"
     8  
     9  	"github.com/FusionFoundation/efsn/common"
    10  	"github.com/FusionFoundation/efsn/consensus"
    11  	"github.com/FusionFoundation/efsn/core/types"
    12  	"github.com/FusionFoundation/efsn/rlp"
    13  	"github.com/FusionFoundation/efsn/rpc"
    14  )
    15  
    16  // API wacom
    17  type API struct {
    18  	chain consensus.ChainReader
    19  }
    20  
    21  func getSnapshotByHeader(header *types.Header) (*Snapshot, error) {
    22  	// Ensure we have an actually valid block and return its snapshot
    23  	if header == nil {
    24  		return nil, errUnknownBlock
    25  	}
    26  	snap, err := NewSnapshotFromHeader(header)
    27  	if err != nil {
    28  		if header.Number.Uint64() == 0 {
    29  			// return an empty snapshot
    30  			return newSnapshot().ToShow(), nil
    31  		}
    32  		return nil, err
    33  	}
    34  	return snap, nil
    35  }
    36  
    37  // GetSnapshot wacom
    38  func (api *API) GetSnapshot(number *rpc.BlockNumber) (*Snapshot, error) {
    39  	var header *types.Header
    40  	if number == nil || *number == rpc.LatestBlockNumber {
    41  		header = api.chain.CurrentHeader()
    42  	} else {
    43  		header = api.chain.GetHeaderByNumber(uint64(number.Int64()))
    44  	}
    45  	return getSnapshotByHeader(header)
    46  }
    47  
    48  // GetSnapshotAtHash wacom
    49  func (api *API) GetSnapshotAtHash(hash common.Hash) (*Snapshot, error) {
    50  	header := api.chain.GetHeaderByHash(hash)
    51  	return getSnapshotByHeader(header)
    52  }
    53  
    54  // DecodeLogData decode log data
    55  func DecodeLogData(data []byte) (interface{}, error) {
    56  	maps := make(map[string]interface{})
    57  	if err := json.Unmarshal(data, &maps); err != nil {
    58  		return nil, fmt.Errorf("json unmarshal err: %v", err)
    59  	}
    60  	// adjust Value from float64 to big.Int to prevent losing precision
    61  	if value, exist := maps["Value"]; exist {
    62  		if _, ok := value.(float64); ok {
    63  			bigVal := struct {
    64  				Value *big.Int `json:",string"`
    65  			}{}
    66  			if err := json.Unmarshal(data, &bigVal); err == nil {
    67  				maps["Value"] = bigVal.Value
    68  			}
    69  		}
    70  	}
    71  	if datastr, dataok := maps["Base"].(string); dataok {
    72  		data, err := base64.StdEncoding.DecodeString(datastr)
    73  		if err != nil {
    74  			return nil, fmt.Errorf("base64 decode err: %v", err)
    75  		}
    76  		buyTicketParam := common.BuyTicketParam{}
    77  		if err = rlp.DecodeBytes(data, &buyTicketParam); err == nil {
    78  			delete(maps, "Base")
    79  			maps["StartTime"] = buyTicketParam.Start
    80  			maps["ExpireTime"] = buyTicketParam.End
    81  		}
    82  	}
    83  	return maps, nil
    84  }