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 }