MCPcopy Create free account
hub / github.com/33cn/chain33 / execTxOne

Method execTxOne

executor/execenv.go:477–523  ·  view source on GitHub ↗
(feelog *types.Receipt, tx *types.Transaction, index int)

Source from the content-addressed store, hash-verified

475}
476
477func (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
525func (e *executor) checkKV(memset []string, kvs []*types.KeyValue) error {
526 keys := make(map[string]struct{}, len(kvs))

Callers 2

execTxGroupMethod · 0.95
execTxMethod · 0.95

Calls 11

startTxMethod · 0.95
ExecMethod · 0.95
checkKVMethod · 0.95
checkKeyAllowMethod · 0.95
execLocalSameTimeMethod · 0.95
ErrorMethod · 0.65
ActionNameMethod · 0.65
IsForkMethod · 0.65
SetMethod · 0.65
GetSetKeysMethod · 0.45
GetKVMethod · 0.45

Tested by

no test coverage detected