diff --git a/rpc/api.go b/rpc/api.go index c046c22fed..660bb32513 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -113,7 +113,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err return err } - block := NewBlockRes(api.xeth().EthBlockByHash(args.BlockHash)) + block := NewBlockRes(api.xeth().EthBlockByHash(args.BlockHash), false) *reply = common.ToHex(big.NewInt(int64(len(block.Transactions))).Bytes()) case "eth_getBlockTransactionCountByNumber": args := new(GetBlockByNumberArgs) @@ -121,7 +121,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err return err } - block := NewBlockRes(api.xeth().EthBlockByNumber(args.BlockNumber)) + block := NewBlockRes(api.xeth().EthBlockByNumber(args.BlockNumber), false) *reply = common.ToHex(big.NewInt(int64(len(block.Transactions))).Bytes()) case "eth_getUncleCountByBlockHash": args := new(GetBlockByHashArgs) @@ -130,7 +130,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err } block := api.xeth().EthBlockByHash(args.BlockHash) - br := NewBlockRes(block) + br := NewBlockRes(block, false) *reply = common.ToHex(big.NewInt(int64(len(br.Uncles))).Bytes()) case "eth_getUncleCountByBlockNumber": args := new(GetBlockByNumberArgs) @@ -139,7 +139,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err } block := api.xeth().EthBlockByNumber(args.BlockNumber) - br := NewBlockRes(block) + br := NewBlockRes(block, false) *reply = common.ToHex(big.NewInt(int64(len(br.Uncles))).Bytes()) case "eth_getData", "eth_getCode": args := new(GetDataArgs) @@ -179,8 +179,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err } block := api.xeth().EthBlockByHash(args.BlockHash) - br := NewBlockRes(block) - br.fullTx = args.IncludeTxs + br := NewBlockRes(block, true) *reply = br case "eth_getBlockByNumber": @@ -190,8 +189,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err } block := api.xeth().EthBlockByNumber(args.BlockNumber) - br := NewBlockRes(block) - br.fullTx = args.IncludeTxs + br := NewBlockRes(block, true) *reply = br case "eth_getTransactionByHash": @@ -214,8 +212,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err } block := api.xeth().EthBlockByHash(args.Hash) - br := NewBlockRes(block) - br.fullTx = true + br := NewBlockRes(block, true) if args.Index >= int64(len(br.Transactions)) || args.Index < 0 { return NewValidationError("Index", "does not exist") @@ -228,8 +225,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err } block := api.xeth().EthBlockByNumber(args.BlockNumber) - v := NewBlockRes(block) - v.fullTx = true + v := NewBlockRes(block, true) if args.Index >= int64(len(v.Transactions)) || args.Index < 0 { return NewValidationError("Index", "does not exist") @@ -241,14 +237,14 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err return err } - br := NewBlockRes(api.xeth().EthBlockByHash(args.Hash)) + br := NewBlockRes(api.xeth().EthBlockByHash(args.Hash), false) if args.Index >= int64(len(br.Uncles)) || args.Index < 0 { return NewValidationError("Index", "does not exist") } uhash := br.Uncles[args.Index] - uncle := NewBlockRes(api.xeth().EthBlockByHash(uhash.String())) + uncle := NewBlockRes(api.xeth().EthBlockByHash(uhash.String()), false) *reply = uncle case "eth_getUncleByBlockNumberAndIndex": @@ -258,15 +254,14 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err } block := api.xeth().EthBlockByNumber(args.BlockNumber) - v := NewBlockRes(block) - v.fullTx = true + v := NewBlockRes(block, true) if args.Index >= int64(len(v.Uncles)) || args.Index < 0 { return NewValidationError("Index", "does not exist") } uhash := v.Uncles[args.Index] - uncle := NewBlockRes(api.xeth().EthBlockByHash(uhash.String())) + uncle := NewBlockRes(api.xeth().EthBlockByHash(uhash.String()), false) *reply = uncle case "eth_getCompilers": diff --git a/rpc/responses.go b/rpc/responses.go index 3e9293fbb1..45a2fa18b2 100644 --- a/rpc/responses.go +++ b/rpc/responses.go @@ -29,12 +29,15 @@ type BlockRes struct { Uncles []*hexdata `json:"uncles"` } -func NewBlockRes(block *types.Block) *BlockRes { +func NewBlockRes(block *types.Block, fullTx bool) *BlockRes { + // TODO respect fullTx flag + if block == nil { return &BlockRes{} } res := new(BlockRes) + res.fullTx = fullTx res.BlockNumber = newHexNum(block.Number()) res.BlockHash = newHexData(block.Hash()) res.ParentHash = newHexData(block.ParentHash()) @@ -52,11 +55,20 @@ func NewBlockRes(block *types.Block) *BlockRes { // res.MinGasPrice = res.GasUsed = newHexNum(block.GasUsed()) res.UnixTimestamp = newHexNum(block.Time()) - res.Transactions = NewTransactionsRes(block.Transactions()) + + res.Transactions = make([]*TransactionRes, len(block.Transactions())) + for i, tx := range block.Transactions() { + res.Transactions[i] = NewTransactionRes(tx) + res.Transactions[i].BlockHash = res.BlockHash + res.Transactions[i].BlockNumber = res.BlockNumber + res.Transactions[i].TxIndex = newHexNum(i) + } + res.Uncles = make([]*hexdata, len(block.Uncles())) for i, uncle := range block.Uncles() { res.Uncles[i] = newHexData(uncle.Hash()) } + return res } @@ -91,14 +103,6 @@ func NewTransactionRes(tx *types.Transaction) *TransactionRes { return v } -func NewTransactionsRes(txs []*types.Transaction) []*TransactionRes { - v := make([]*TransactionRes, len(txs)) - for i, tx := range txs { - v[i] = NewTransactionRes(tx) - } - return v -} - // type FilterLogRes struct { // Hash string `json:"hash"` // Address string `json:"address"` diff --git a/rpc/responses_test.go b/rpc/responses_test.go index 5c6c6a895b..43924151a4 100644 --- a/rpc/responses_test.go +++ b/rpc/responses_test.go @@ -49,7 +49,7 @@ func TestNewBlockRes(t *testing.T) { "timestamp": reNum, } - v := NewBlockRes(block) + v := NewBlockRes(block, false) j, _ := json.Marshal(v) for k, re := range tests {