(msg *queue.Message)
| 480 | } |
| 481 | |
| 482 | func (exec *Executor) procExecDelBlock(msg *queue.Message) { |
| 483 | //panic 处理 |
| 484 | defer func() { |
| 485 | if r := recover(); r != nil { |
| 486 | elog.Error("del blk panic error", "err", r) |
| 487 | msg.Reply(exec.client.NewMessage("", types.EventReceipts, types.ErrExecPanic)) |
| 488 | return |
| 489 | } |
| 490 | }() |
| 491 | datas := msg.GetData().(*types.BlockDetail) |
| 492 | b := datas.Block |
| 493 | ctx := &executorCtx{ |
| 494 | stateHash: b.StateHash, |
| 495 | height: b.Height, |
| 496 | blocktime: b.BlockTime, |
| 497 | difficulty: uint64(b.Difficulty), |
| 498 | mainHash: b.MainHash, |
| 499 | mainHeight: b.MainHeight, |
| 500 | parentHash: b.ParentHash, |
| 501 | } |
| 502 | var localdb dbm.KVDB |
| 503 | if !exec.disableLocal { |
| 504 | localdb = NewLocalDB(exec.client, exec.qclient, false) |
| 505 | defer localdb.(*LocalDB).Close() |
| 506 | } |
| 507 | execute := newExecutor(ctx, exec, localdb, b.Txs, nil) |
| 508 | execute.enableMVCC(nil) |
| 509 | var kvset types.LocalDBSet |
| 510 | for _, kv := range datas.KV { |
| 511 | err := execute.stateDB.Set(kv.Key, kv.Value) |
| 512 | if err != nil { |
| 513 | panic(err) |
| 514 | } |
| 515 | } |
| 516 | for name, plugin := range globalPlugins { |
| 517 | kvs, ok, err := plugin.CheckEnable(execute, exec.pluginEnable[name]) |
| 518 | if err != nil { |
| 519 | panic(err) |
| 520 | } |
| 521 | if !ok { |
| 522 | continue |
| 523 | } |
| 524 | if len(kvs) > 0 { |
| 525 | kvset.KV = append(kvset.KV, kvs...) |
| 526 | } |
| 527 | kvs, err = plugin.ExecDelLocal(execute, datas) |
| 528 | if err != nil { |
| 529 | msg.Reply(exec.client.NewMessage("", types.EventAddBlock, err)) |
| 530 | return |
| 531 | } |
| 532 | if len(kvs) > 0 { |
| 533 | kvset.KV = append(kvset.KV, kvs...) |
| 534 | } |
| 535 | } |
| 536 | if !exec.disableExecLocal { |
| 537 | for i := len(b.Txs) - 1; i >= 0; i-- { |
| 538 | tx := b.Txs[i] |
| 539 | //先检查是否是代理交易 |
no test coverage detected