func HandleV2RawData(state interfaces.IState, params interface{}) (interface{}, *primitives.JSONError) { hashkey := new(HashRequest) err := MapToObject(params, hashkey) if err != nil { panic(reflect.TypeOf(params)) return nil, NewInvalidParamsError() } h, err := primitives.HexToHash(hashkey.Hash) if err != nil { return nil, NewInvalidHashError() } var block interfaces.BinaryMarshallable var b []byte if block, _ = state.FetchECTransactionByHash(h); block != nil { b, _ = block.MarshalBinary() } else if block, _ = state.FetchFactoidTransactionByHash(h); block != nil { b, _ = block.MarshalBinary() } else if block, _ = state.FetchEntryByHash(h); block != nil { b, _ = block.MarshalBinary() } if b == nil { dbase := state.GetAndLockDB() defer state.UnlockDB() // try to find the block data in db and return the first one found if block, _ = dbase.FetchFBlock(h); block != nil { b, _ = block.MarshalBinary() } else if block, _ = dbase.FetchDBlock(h); block != nil { b, _ = block.MarshalBinary() } else if block, _ = dbase.FetchABlock(h); block != nil { b, _ = block.MarshalBinary() } else if block, _ = dbase.FetchEBlock(h); block != nil { b, _ = block.MarshalBinary() } else if block, _ = dbase.FetchECBlock(h); block != nil { b, _ = block.MarshalBinary() } else if block, _ = dbase.FetchFBlock(h); block != nil { b, _ = block.MarshalBinary() } else if block, _ = dbase.FetchEntry(h); block != nil { b, _ = block.MarshalBinary() } else { return nil, NewEntryNotFoundError() } } d := new(RawDataResponse) d.Data = hex.EncodeToString(b) return d, nil }
func HandleV2GetTranasction(state interfaces.IState, params interface{}) (interface{}, *primitives.JSONError) { hashkey := new(HashRequest) err := MapToObject(params, hashkey) if err != nil { return nil, NewInvalidParamsError() } h, err := primitives.HexToHash(hashkey.Hash) if err != nil { return nil, NewInvalidHashError() } fTx, err := state.FetchFactoidTransactionByHash(h) if err != nil { if err.Error() != "Block not found, should not happen" { return nil, NewInternalError() } } ecTx, err := state.FetchECTransactionByHash(h) if err != nil { if err.Error() != "Block not found, should not happen" { return nil, NewInternalError() } } e, err := state.FetchEntryByHash(h) if err != nil { return nil, NewInternalError() } dbase := state.GetAndLockDB() defer state.UnlockDB() if fTx == nil { fTx, err = dbase.FetchFactoidTransaction(h) if err != nil { if err.Error() != "Block not found, should not happen" { return nil, NewInternalError() } } } if ecTx == nil { ecTx, err = dbase.FetchECTransaction(h) if err != nil { if err.Error() != "Block not found, should not happen" { return nil, NewInternalError() } } } if e == nil { e, err = dbase.FetchEntry(h) if err != nil { return nil, NewInternalError() } } blockHash, err := dbase.FetchIncludedIn(h) if err != nil { return nil, NewInternalError() } answer := new(TransactionResponse) answer.ECTranasction = ecTx answer.FactoidTransaction = fTx answer.Entry = e answer.IncludedInTransactionBlock = blockHash.String() blockHash, err = dbase.FetchIncludedIn(blockHash) if err != nil { return nil, NewInternalError() } answer.IncludedInDirectoryBlock = blockHash.String() dBlock, err := dbase.FetchDBlock(blockHash) if err != nil { return nil, NewInternalError() } answer.IncludedInDirectoryBlockHeight = int64(dBlock.GetDatabaseHeight()) return answer, nil }
func HandleV2EntryACK(state interfaces.IState, params interface{}) (interface{}, *primitives.JSONError) { ackReq := new(AckRequest) err := MapToObject(params, ackReq) if err != nil { return nil, NewInvalidParamsError() } if ackReq.TxID == "" && ackReq.FullTransaction == "" { return nil, NewInvalidParamsError() } eTxID := "" ecTxID := "" if ackReq.TxID == "" { eTxID, ecTxID = DecodeTransactionToHashes(ackReq.FullTransaction) if ecTxID == "" && eTxID == "" { return nil, NewUnableToDecodeTransactionError() } } //TODO: fetch entries, ec TXs from state as well //We didn't receive a full transaction, but a transaction hash //We have to figure out which transaction hash we got if ecTxID == "" && eTxID == "" { h, err := primitives.NewShaHashFromStr(ackReq.TxID) if err != nil { return nil, NewInvalidParamsError() } entry, err := state.FetchEntryByHash(h) if err != nil { return nil, NewInternalError() } if entry != nil { eTxID = ackReq.TxID } else { ec, err := state.FetchECTransactionByHash(h) if err != nil { return nil, NewInternalError() } //fmt.Printf("ec - %v\n", ec) if ec != nil { ecTxID = ackReq.TxID eTxID = ec.GetEntryHash().String() } } } answer := new(EntryStatus) answer.CommitTxID = ecTxID answer.EntryHash = eTxID if answer.CommitTxID == "" && answer.EntryHash == "" { //We know nothing about the transaction, so we return unknown status answer.CommitData.Status = AckStatusUnknown answer.EntryData.Status = AckStatusUnknown return answer, nil } //Fetching the second part of the transaction pair if answer.EntryHash == "" { h, err := primitives.NewShaHashFromStr(answer.EntryHash) if err != nil { return nil, NewInvalidParamsError() } ec, err := state.FetchECTransactionByHash(h) if err != nil { return nil, NewInternalError() } if ec != nil { answer.EntryHash = ec.GetEntryHash().String() } } if answer.CommitTxID == "" { h, err := primitives.NewShaHashFromStr(answer.EntryHash) if err != nil { return nil, NewInvalidParamsError() } ec, err := state.FetchPaidFor(h) if err != nil { return nil, NewInternalError() } if ec != nil { answer.CommitTxID = ec.String() } } //Fetching statuses if answer.CommitTxID == "" { answer.CommitData.Status = AckStatusUnknown } else { h, err := primitives.NewShaHashFromStr(answer.CommitTxID) if err != nil { return nil, NewInvalidParamsError() } status, txid, txTime, blockTime, err := state.GetACKStatus(h) if err != nil { return nil, NewInternalError() } answer.CommitTxID = txid.String() if txTime != nil { answer.CommitData.TransactionDate = txTime.GetTimeMilli() if txTime.GetTimeMilli() > 0 { answer.CommitData.TransactionDateString = txTime.String() } } if blockTime != nil { answer.CommitData.BlockDate = blockTime.GetTimeMilli() if blockTime.GetTimeMilli() > 0 { answer.CommitData.BlockDateString = blockTime.String() } } switch status { case constants.AckStatusInvalid: answer.CommitData.Status = AckStatusInvalid break case constants.AckStatusUnknown: answer.CommitData.Status = AckStatusUnknown break case constants.AckStatusNotConfirmed: answer.CommitData.Status = AckStatusNotConfirmed break case constants.AckStatusACK: answer.CommitData.Status = AckStatusACK break case constants.AckStatus1Minute: answer.CommitData.Status = AckStatus1Minute break case constants.AckStatusDBlockConfirmed: answer.CommitData.Status = AckStatusDBlockConfirmed break default: return nil, NewInternalError() break } } if answer.EntryHash == "" { answer.EntryData.Status = AckStatusUnknown } else { h, err := primitives.NewShaHashFromStr(answer.EntryHash) if err != nil { return nil, NewInvalidParamsError() } status, txid, txTime, blockTime, err := state.GetACKStatus(h) if err != nil { return nil, NewInternalError() } answer.EntryHash = txid.String() if txTime != nil { answer.EntryData.TransactionDate = txTime.GetTimeMilli() if txTime.GetTimeMilli() > 0 { answer.EntryData.TransactionDateString = txTime.String() } } if blockTime != nil { answer.EntryData.BlockDate = blockTime.GetTimeMilli() if blockTime.GetTimeMilli() > 0 { answer.EntryData.BlockDateString = blockTime.String() } } switch status { case constants.AckStatusInvalid: answer.EntryData.Status = AckStatusInvalid break case constants.AckStatusUnknown: answer.EntryData.Status = AckStatusUnknown break case constants.AckStatusNotConfirmed: answer.EntryData.Status = AckStatusNotConfirmed break case constants.AckStatusACK: answer.EntryData.Status = AckStatusACK break case constants.AckStatus1Minute: answer.EntryData.Status = AckStatus1Minute break case constants.AckStatusDBlockConfirmed: answer.EntryData.Status = AckStatusDBlockConfirmed break default: return nil, NewInternalError() break } } return answer, nil }