From 2273155e7e325a2a6a940fffae7e9f6744b2ec22 Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 12 Mar 2015 15:59:07 +0100 Subject: [PATCH] Get transaction implemented * Added a GetTransaction to XEth * Implemented the `eth_getTransactionByHash` RPC method --- rpc/api.go | 18 +++++++++++++++--- rpc/args.go | 6 +++--- xeth/xeth.go | 13 +++++++++---- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/rpc/api.go b/rpc/api.go index 44b8ee834..b94d2d6dc 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -421,6 +421,14 @@ func (p *EthereumApi) WhisperMessages(id int, reply *interface{}) error { return nil } +func (p *EthereumApi) GetTransactionByHash(hash string, reply *interface{}) error { + tx := p.xeth().EthTransactionByHash(hash) + if tx != nil { + *reply = NewTransactionRes(tx) + } + return nil +} + func (p *EthereumApi) GetBlockByHash(blockhash string, includetx bool) (*BlockRes, error) { block := p.xeth().EthBlockByHash(blockhash) br := NewBlockRes(block) @@ -594,14 +602,18 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error } *reply = v case "eth_getTransactionByHash": - return errNotImplemented + // HashIndexArgs used, but only the "Hash" part we need. + args := new(HashIndexArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { + } + return p.GetTransactionByHash(args.Hash, reply) case "eth_getTransactionByBlockHashAndIndex": args := new(HashIndexArgs) if err := json.Unmarshal(req.Params, &args); err != nil { return err } - v, err := p.GetBlockByHash(args.BlockHash, true) + v, err := p.GetBlockByHash(args.Hash, true) if err != nil { return err } @@ -629,7 +641,7 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error return err } - v, err := p.GetBlockByHash(args.BlockHash, false) + v, err := p.GetBlockByHash(args.Hash, false) if err != nil { return err } diff --git a/rpc/args.go b/rpc/args.go index 40f8575b2..faca03b63 100644 --- a/rpc/args.go +++ b/rpc/args.go @@ -280,8 +280,8 @@ func (args *BlockNumIndexArgs) UnmarshalJSON(b []byte) (err error) { } type HashIndexArgs struct { - BlockHash string - Index int64 + Hash string + Index int64 } func (args *HashIndexArgs) UnmarshalJSON(b []byte) (err error) { @@ -299,7 +299,7 @@ func (args *HashIndexArgs) UnmarshalJSON(b []byte) (err error) { if !ok { return errDecodeArgs } - args.BlockHash = arg0 + args.Hash = arg0 if len(obj) > 1 { arg1, ok := obj[1].(string) diff --git a/xeth/xeth.go b/xeth/xeth.go index 70172a1c8..4c28caf86 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -32,6 +32,7 @@ type Backend interface { Peers() []*p2p.Peer BlockDb() ethutil.Database StateDb() ethutil.Database + ExtraDb() ethutil.Database EventMux() *event.TypeMux Whisper() *whisper.Whisper @@ -127,6 +128,14 @@ func (self *XEth) EthBlockByHash(strHash string) *types.Block { return block } +func (self *XEth) EthTransactionByHash(hash string) *types.Transaction { + data, _ := self.eth.ExtraDb().Get(fromHex(hash)) + if len(data) != 0 { + return types.NewTransactionFromBytes(data) + } + return nil +} + func (self *XEth) BlockByNumber(num int64) *Block { if num == -1 { return NewBlock(self.chainManager.CurrentBlock()) @@ -231,10 +240,6 @@ func (self *XEth) SecretToAddress(key string) string { return toHex(pair.Address()) } -func (self *XEth) Execute(addr, value, gas, price, data string) (string, error) { - return "", nil -} - type KeyVal struct { Key string `json:"key"` Value string `json:"value"`