diff --git a/chain/types/execresult.go b/chain/types/execresult.go
index 7ffa8c219da..b0e1f760d32 100644
--- a/chain/types/execresult.go
+++ b/chain/types/execresult.go
@@ -21,10 +21,13 @@ type ExecutionTrace struct {
type GasTrace struct {
Name string
- Location []Loc
- TotalGas int64
- ComputeGas int64
- StorageGas int64
+ Location []Loc
+ TotalGas int64
+ ComputeGas int64
+ StorageGas int64
+ TotalVirtualGas int64
+ VirtualComputeGas int64
+ VirtualStorageGas int64
TimeTaken time.Duration
Extra interface{}
diff --git a/chain/vm/gas.go b/chain/vm/gas.go
index c030621f670..dc9966e57e2 100644
--- a/chain/vm/gas.go
+++ b/chain/vm/gas.go
@@ -21,11 +21,20 @@ type GasCharge struct {
Name string
ComputeGas int64
StorageGas int64
+
+ VirtualCompute int64
+ VirtualStorage int64
}
func (g GasCharge) Total() int64 {
return g.ComputeGas*GasComputeMulti + g.StorageGas*GasStorageMulti
}
+func (g GasCharge) WithVirtual(compute, storage int64) GasCharge {
+ out := g
+ out.VirtualCompute = compute
+ out.VirtualStorage = storage
+ return out
+}
func newGasCharge(name string, computeGas int64, storageGas int64) GasCharge {
return GasCharge{
diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go
index be34f075c3a..9b83593abbc 100644
--- a/chain/vm/runtime.go
+++ b/chain/vm/runtime.go
@@ -524,11 +524,14 @@ func (rt *Runtime) chargeGasInternal(gas GasCharge, skip int) aerrors.ActorError
}
gasTrace := types.GasTrace{
- Name: gas.Name,
- TotalGas: toUse,
- ComputeGas: gas.ComputeGas,
- StorageGas: gas.StorageGas,
- Callers: callers[:cout],
+ Name: gas.Name,
+ TotalGas: toUse,
+ ComputeGas: gas.ComputeGas,
+ StorageGas: gas.StorageGas,
+ TotalVirtualGas: gas.VirtualCompute*GasComputeMulti + gas.VirtualStorage*GasStorageMulti,
+ VirtualComputeGas: gas.VirtualCompute,
+ VirtualStorageGas: gas.VirtualStorage,
+ Callers: callers[:cout],
}
rt.executionTrace.GasCharges = append(rt.executionTrace.GasCharges, &gasTrace)
rt.lastGasChargeTime = now
@@ -536,7 +539,8 @@ func (rt *Runtime) chargeGasInternal(gas GasCharge, skip int) aerrors.ActorError
if rt.gasUsed+toUse > rt.gasAvailable {
rt.gasUsed = rt.gasAvailable
- return aerrors.Newf(exitcode.SysErrOutOfGas, "not enough gas: used=%d, available=%d", rt.gasUsed, rt.gasAvailable)
+ return aerrors.Newf(exitcode.SysErrOutOfGas, "not enough gas: used=%d, available=%d",
+ rt.gasUsed, rt.gasAvailable)
}
rt.gasUsed += toUse
return nil
diff --git a/cli/state.go b/cli/state.go
index bb5dd427757..753b0b01764 100644
--- a/cli/state.go
+++ b/cli/state.go
@@ -971,6 +971,7 @@ var compStateTemplate = `
}
.slow-true-false { color: #660; }
.slow-true-true { color: #f80; }
+ .deemp { color: #444; }
table {
font-size: 12px;
border-collapse: collapse;
@@ -1060,8 +1061,20 @@ var compStateMsg = `
Name | Total/Compute/Storage | Time Taken | Location | {{.TotalGas}}{{template "virt" .TotalVirtualGas }}/{{.ComputeGas}}{{template "virt" .VirtualComputeGas}}/{{.StorageGas}}{{template "virt" .VirtualStorageGas}} | + {{- end}} + {{range .GasCharges}} -
---|---|---|---|
{{.Name}} | {{.TotalGas}}/{{.ComputeGas}}/{{.StorageGas}} | {{.TimeTaken}} | +|
{{.Name}} | + {{template "gasC" .}} +{{.TimeTaken}} | {{ $fImp := FirstImportant .Location }} {{ if $fImp }} @@ -1098,7 +1111,10 @@ var compStateMsg = ` | |
Sum | {{.TotalGas}}/{{.ComputeGas}}/{{.StorageGas}} | {{.TimeTaken}} | |
Sum | + {{template "gasC" .}} +{{.TimeTaken}} | +