Exec base exec func
(tx *types.Transaction, index int)
| 239 | |
| 240 | // Exec base exec func |
| 241 | func (e *executor) Exec(tx *types.Transaction, index int) (receipt *types.Receipt, err error) { |
| 242 | //针对一个交易执行阶段panic的处理,防止链停止,返回TyLogErr |
| 243 | defer func() { |
| 244 | if r := recover(); r != nil { |
| 245 | receipt = nil |
| 246 | err = types.ErrExecPanic |
| 247 | elog.Error("execTx.Exec", "index", index, "hash", common.ToHex(tx.Hash()), "err", r, "stack", GetStack()) |
| 248 | return |
| 249 | } |
| 250 | }() |
| 251 | |
| 252 | exec := e.loadDriver(tx, index) |
| 253 | //to 必须是一个地址 |
| 254 | if err := drivers.CheckAddress(e.cfg, tx.GetRealToAddr(), e.height); err != nil { |
| 255 | return nil, err |
| 256 | } |
| 257 | if e.localDB != nil && e.cfg.IsFork(e.height, "ForkLocalDBAccess") { |
| 258 | e.localDB.(*LocalDB).DisableWrite() |
| 259 | if exec.ExecutorOrder() != drivers.ExecLocalSameTime { |
| 260 | e.localDB.(*LocalDB).DisableRead() |
| 261 | } |
| 262 | defer func() { |
| 263 | e.localDB.(*LocalDB).EnableWrite() |
| 264 | if exec.ExecutorOrder() != drivers.ExecLocalSameTime { |
| 265 | e.localDB.(*LocalDB).EnableRead() |
| 266 | } |
| 267 | }() |
| 268 | } |
| 269 | //第一步先检查 CheckTx |
| 270 | if err := exec.CheckTx(tx, index); err != nil { |
| 271 | return nil, err |
| 272 | } |
| 273 | r, err := exec.Exec(tx, index) |
| 274 | return r, err |
| 275 | } |
| 276 | |
| 277 | func (e *executor) execLocal(tx *types.Transaction, r *types.ReceiptData, index int) (*types.LocalDBSet, error) { |
| 278 | exec := e.loadDriver(tx, index) |
no test coverage detected