Skip to content

Commit 90cd8ae

Browse files
committed
rpc/api: don't crash for unknown blocks
Most eth RPC calls that work with blocks crashed when the block was not found because they called Hash on a nil block. This is a regression introduced in cdc2662 (#1779). While here, remove the insane conversions in get*CountBy*. There is no need to construct a complete BlockRes and converting int->int64->*big.Int->[]byte->hexnum->string to format the length of a slice as hex.
1 parent 70b6174 commit 90cd8ae

File tree

1 file changed

+23
-25
lines changed

1 file changed

+23
-25
lines changed

rpc/api/eth.go

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -210,22 +210,19 @@ func (self *ethApi) GetTransactionCount(req *shared.Request) (interface{}, error
210210
}
211211

212212
count := self.xeth.AtStateNum(args.BlockNumber).TxCountAt(args.Address)
213-
return newHexNum(big.NewInt(int64(count)).Bytes()), nil
213+
return fmt.Sprintf("%#x", count), nil
214214
}
215215

216216
func (self *ethApi) GetBlockTransactionCountByHash(req *shared.Request) (interface{}, error) {
217217
args := new(HashArgs)
218218
if err := self.codec.Decode(req.Params, &args); err != nil {
219219
return nil, shared.NewDecodeParamError(err.Error())
220220
}
221-
222-
raw := self.xeth.EthBlockByHash(args.Hash)
223-
block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), false)
221+
block := self.xeth.EthBlockByHash(args.Hash)
224222
if block == nil {
225223
return nil, nil
226-
} else {
227-
return newHexNum(big.NewInt(int64(len(block.Transactions))).Bytes()), nil
228224
}
225+
return fmt.Sprintf("%#x", len(block.Transactions())), nil
229226
}
230227

231228
func (self *ethApi) GetBlockTransactionCountByNumber(req *shared.Request) (interface{}, error) {
@@ -234,13 +231,11 @@ func (self *ethApi) GetBlockTransactionCountByNumber(req *shared.Request) (inter
234231
return nil, shared.NewDecodeParamError(err.Error())
235232
}
236233

237-
raw := self.xeth.EthBlockByNumber(args.BlockNumber)
238-
block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), false)
234+
block := self.xeth.EthBlockByNumber(args.BlockNumber)
239235
if block == nil {
240236
return nil, nil
241-
} else {
242-
return newHexNum(big.NewInt(int64(len(block.Transactions))).Bytes()), nil
243237
}
238+
return fmt.Sprintf("%#x", len(block.Transactions())), nil
244239
}
245240

246241
func (self *ethApi) GetUncleCountByBlockHash(req *shared.Request) (interface{}, error) {
@@ -249,12 +244,11 @@ func (self *ethApi) GetUncleCountByBlockHash(req *shared.Request) (interface{},
249244
return nil, shared.NewDecodeParamError(err.Error())
250245
}
251246

252-
raw := self.xeth.EthBlockByHash(args.Hash)
253-
block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), false)
247+
block := self.xeth.EthBlockByHash(args.Hash)
254248
if block == nil {
255249
return nil, nil
256250
}
257-
return newHexNum(big.NewInt(int64(len(block.Uncles))).Bytes()), nil
251+
return fmt.Sprintf("%#x", len(block.Uncles())), nil
258252
}
259253

260254
func (self *ethApi) GetUncleCountByBlockNumber(req *shared.Request) (interface{}, error) {
@@ -263,12 +257,11 @@ func (self *ethApi) GetUncleCountByBlockNumber(req *shared.Request) (interface{}
263257
return nil, shared.NewDecodeParamError(err.Error())
264258
}
265259

266-
raw := self.xeth.EthBlockByNumber(args.BlockNumber)
267-
block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), false)
260+
block := self.xeth.EthBlockByNumber(args.BlockNumber)
268261
if block == nil {
269262
return nil, nil
270263
}
271-
return newHexNum(big.NewInt(int64(len(block.Uncles))).Bytes()), nil
264+
return fmt.Sprintf("%#x", len(block.Uncles())), nil
272265
}
273266

274267
func (self *ethApi) GetData(req *shared.Request) (interface{}, error) {
@@ -377,8 +370,10 @@ func (self *ethApi) GetBlockByHash(req *shared.Request) (interface{}, error) {
377370
if err := self.codec.Decode(req.Params, &args); err != nil {
378371
return nil, shared.NewDecodeParamError(err.Error())
379372
}
380-
381373
block := self.xeth.EthBlockByHash(args.BlockHash)
374+
if block == nil {
375+
return nil, nil
376+
}
382377
return NewBlockRes(block, self.xeth.Td(block.Hash()), args.IncludeTxs), nil
383378
}
384379

@@ -389,6 +384,9 @@ func (self *ethApi) GetBlockByNumber(req *shared.Request) (interface{}, error) {
389384
}
390385

391386
block := self.xeth.EthBlockByNumber(args.BlockNumber)
387+
if block == nil {
388+
return nil, nil
389+
}
392390
return NewBlockRes(block, self.xeth.Td(block.Hash()), args.IncludeTxs), nil
393391
}
394392

@@ -419,10 +417,10 @@ func (self *ethApi) GetTransactionByBlockHashAndIndex(req *shared.Request) (inte
419417
}
420418

421419
raw := self.xeth.EthBlockByHash(args.Hash)
422-
block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), true)
423-
if block == nil {
420+
if raw == nil {
424421
return nil, nil
425422
}
423+
block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), true)
426424
if args.Index >= int64(len(block.Transactions)) || args.Index < 0 {
427425
return nil, nil
428426
} else {
@@ -437,10 +435,10 @@ func (self *ethApi) GetTransactionByBlockNumberAndIndex(req *shared.Request) (in
437435
}
438436

439437
raw := self.xeth.EthBlockByNumber(args.BlockNumber)
440-
block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), true)
441-
if block == nil {
438+
if raw == nil {
442439
return nil, nil
443440
}
441+
block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), true)
444442
if args.Index >= int64(len(block.Transactions)) || args.Index < 0 {
445443
// return NewValidationError("Index", "does not exist")
446444
return nil, nil
@@ -455,10 +453,10 @@ func (self *ethApi) GetUncleByBlockHashAndIndex(req *shared.Request) (interface{
455453
}
456454

457455
raw := self.xeth.EthBlockByHash(args.Hash)
458-
block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), false)
459-
if block == nil {
456+
if raw == nil {
460457
return nil, nil
461458
}
459+
block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), false)
462460
if args.Index >= int64(len(block.Uncles)) || args.Index < 0 {
463461
// return NewValidationError("Index", "does not exist")
464462
return nil, nil
@@ -473,10 +471,10 @@ func (self *ethApi) GetUncleByBlockNumberAndIndex(req *shared.Request) (interfac
473471
}
474472

475473
raw := self.xeth.EthBlockByNumber(args.BlockNumber)
476-
block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), true)
477-
if block == nil {
474+
if raw == nil {
478475
return nil, nil
479476
}
477+
block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), true)
480478
if args.Index >= int64(len(block.Uncles)) || args.Index < 0 {
481479
return nil, nil
482480
} else {

0 commit comments

Comments
 (0)