(feelog *types.Receipt, tx *types.Transaction, index int)
| 475 | } |
| 476 | |
| 477 | func (e *executor) execTxOne(feelog *types.Receipt, tx *types.Transaction, index int) (*types.Receipt, error) { |
| 478 | //只有到pack级别的,才会增加index |
| 479 | e.startTx() |
| 480 | receipt, err := e.Exec(tx, index) |
| 481 | if err != nil { |
| 482 | elog.Error("execTxOne", "exec tx error", err, "exec", string(tx.Execer), "action", tx.ActionName()) |
| 483 | //add error log |
| 484 | errlog := &types.ReceiptLog{Ty: types.TyLogErr, Log: []byte(err.Error())} |
| 485 | feelog.Logs = append(feelog.Logs, errlog) |
| 486 | return feelog, err |
| 487 | } |
| 488 | //合并两个receipt,如果执行不返回错误,那么就认为成功 |
| 489 | //需要检查两个东西: |
| 490 | //1. statedb 中 Set的 key 必须是 在 receipt.GetKV() 这个集合中 |
| 491 | //2. receipt.GetKV() 中的 key, 必须符合权限控制要求 |
| 492 | memkvset := e.stateDB.(*StateDB).GetSetKeys() |
| 493 | err = e.checkKV(memkvset, receipt.GetKV()) |
| 494 | if err != nil { |
| 495 | errlog := &types.ReceiptLog{Ty: types.TyLogErr, Log: []byte(err.Error())} |
| 496 | feelog.Logs = append(feelog.Logs, errlog) |
| 497 | return feelog, err |
| 498 | } |
| 499 | feelog, err = e.checkKeyAllow(feelog, tx, index, receipt.GetKV()) |
| 500 | if err != nil { |
| 501 | return feelog, err |
| 502 | } |
| 503 | err = e.execLocalSameTime(tx, receipt, index) |
| 504 | if err != nil { |
| 505 | elog.Error("execLocalSameTime", "err", err) |
| 506 | errlog := &types.ReceiptLog{Ty: types.TyLogErr, Log: []byte(err.Error())} |
| 507 | feelog.Logs = append(feelog.Logs, errlog) |
| 508 | return feelog, err |
| 509 | } |
| 510 | if receipt != nil { |
| 511 | feelog.KV = append(feelog.KV, receipt.KV...) |
| 512 | feelog.Logs = append(feelog.Logs, receipt.Logs...) |
| 513 | feelog.Ty = receipt.Ty |
| 514 | } |
| 515 | if e.cfg.IsFork(e.height, "ForkStateDBSet") { |
| 516 | for _, v := range feelog.KV { |
| 517 | if err := e.stateDB.Set(v.Key, v.Value); err != nil { |
| 518 | panic(err) |
| 519 | } |
| 520 | } |
| 521 | } |
| 522 | return feelog, nil |
| 523 | } |
| 524 | |
| 525 | func (e *executor) checkKV(memset []string, kvs []*types.KeyValue) error { |
| 526 | keys := make(map[string]struct{}, len(kvs)) |
no test coverage detected