Skip to content

Commit 7a2a918

Browse files
committed
Merge pull request ethereum#1842 from fjl/rpc-fix-unknown-block
rpc/api: don't crash for unknown blocks
2 parents e456f27 + 90cd8ae commit 7a2a918

File tree

3 files changed

+24
-31
lines changed

3 files changed

+24
-31
lines changed

cmd/geth/blocktestcmd.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,6 @@ func runBlockTest(ctx *cli.Context) {
9191
if err != nil {
9292
utils.Fatalf("%v", err)
9393
}
94-
defer ethereum.Stop()
9594
if rpc {
9695
fmt.Println("Block Test post state validated, starting RPC interface.")
9796
startEth(ctx, ethereum)
@@ -106,32 +105,27 @@ func runOneBlockTest(ctx *cli.Context, test *tests.BlockTest) (*eth.Ethereum, er
106105
cfg.MaxPeers = 0 // disable network
107106
cfg.Shh = false // disable whisper
108107
cfg.NAT = nil // disable port mapping
109-
110108
ethereum, err := eth.New(cfg)
111109
if err != nil {
112110
return nil, err
113111
}
114112

115113
// import the genesis block
116114
ethereum.ResetWithGenesisBlock(test.Genesis)
117-
118115
// import pre accounts
119116
_, err = test.InsertPreState(ethereum)
120117
if err != nil {
121118
return ethereum, fmt.Errorf("InsertPreState: %v", err)
122119
}
123120

124121
cm := ethereum.ChainManager()
125-
126122
validBlocks, err := test.TryBlocksInsert(cm)
127123
if err != nil {
128124
return ethereum, fmt.Errorf("Block Test load error: %v", err)
129125
}
130-
131126
newDB := cm.State()
132127
if err := test.ValidatePostState(newDB); err != nil {
133128
return ethereum, fmt.Errorf("post state validation failed: %v", err)
134129
}
135-
136130
return ethereum, test.ValidateImportedHeaders(cm, validBlocks)
137131
}

core/chain_manager.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,7 @@ func (bc *ChainManager) ResetWithGenesisBlock(genesis *types.Block) {
279279
if err := WriteBlock(bc.chainDb, genesis); err != nil {
280280
glog.Fatalf("failed to write genesis block: %v", err)
281281
}
282+
bc.genesisBlock = genesis
282283
bc.insert(bc.genesisBlock)
283284
bc.currentBlock = bc.genesisBlock
284285
bc.setTotalDifficulty(genesis.Difficulty())

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)