mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-15 00:13:46 +00:00
feat: allow calculating diffs between two row consumptions (#980)
This commit is contained in:
parent
4464f48a5d
commit
096b98a85c
2 changed files with 116 additions and 0 deletions
|
|
@ -1,5 +1,7 @@
|
||||||
package types
|
package types
|
||||||
|
|
||||||
|
import "slices"
|
||||||
|
|
||||||
type RowUsage struct {
|
type RowUsage struct {
|
||||||
IsOk bool `json:"is_ok"`
|
IsOk bool `json:"is_ok"`
|
||||||
RowNumber uint64 `json:"row_number"`
|
RowNumber uint64 `json:"row_number"`
|
||||||
|
|
@ -12,4 +14,38 @@ type SubCircuitRowUsage struct {
|
||||||
RowNumber uint64 `json:"row_number" gencodec:"required"`
|
RowNumber uint64 `json:"row_number" gencodec:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RowConsumptionLimit is the max number of row we support per subcircuit
|
||||||
|
const RowConsumptionLimit = 1_000_000
|
||||||
|
|
||||||
type RowConsumption []SubCircuitRowUsage
|
type RowConsumption []SubCircuitRowUsage
|
||||||
|
|
||||||
|
// IsOverflown returns if any subcircuits are overflown
|
||||||
|
func (rc RowConsumption) IsOverflown() bool {
|
||||||
|
return slices.ContainsFunc(rc, func(scru SubCircuitRowUsage) bool {
|
||||||
|
return scru.RowNumber > RowConsumptionLimit
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Difference returns rc - other
|
||||||
|
// Assumes that rc > other for all subcircuits
|
||||||
|
func (rc RowConsumption) Difference(other RowConsumption) RowConsumption {
|
||||||
|
subCircuitMap := make(map[string]uint64, len(rc))
|
||||||
|
for _, detail := range rc {
|
||||||
|
subCircuitMap[detail.Name] = detail.RowNumber
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, detail := range other {
|
||||||
|
subCircuitMap[detail.Name] -= detail.RowNumber
|
||||||
|
}
|
||||||
|
|
||||||
|
diff := make([]SubCircuitRowUsage, 0, len(subCircuitMap))
|
||||||
|
for name, rowNumDiff := range subCircuitMap {
|
||||||
|
if rowNumDiff > 0 {
|
||||||
|
diff = append(diff, SubCircuitRowUsage{
|
||||||
|
Name: name,
|
||||||
|
RowNumber: rowNumDiff,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return diff
|
||||||
|
}
|
||||||
|
|
|
||||||
80
core/types/row_consumption_test.go
Normal file
80
core/types/row_consumption_test.go
Normal file
|
|
@ -0,0 +1,80 @@
|
||||||
|
package types
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestRowConsumptionDifference(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
rc1 RowConsumption
|
||||||
|
rc2 RowConsumption
|
||||||
|
expected RowConsumption
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
rc1: RowConsumption{
|
||||||
|
SubCircuitRowUsage{
|
||||||
|
"sc1",
|
||||||
|
123,
|
||||||
|
},
|
||||||
|
SubCircuitRowUsage{
|
||||||
|
"sc2",
|
||||||
|
456,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
rc2: RowConsumption{
|
||||||
|
SubCircuitRowUsage{
|
||||||
|
"sc2",
|
||||||
|
111,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expected: RowConsumption{
|
||||||
|
SubCircuitRowUsage{
|
||||||
|
"sc1",
|
||||||
|
123,
|
||||||
|
},
|
||||||
|
SubCircuitRowUsage{
|
||||||
|
"sc2",
|
||||||
|
345,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
rc1: RowConsumption{
|
||||||
|
SubCircuitRowUsage{
|
||||||
|
"sc1",
|
||||||
|
123,
|
||||||
|
},
|
||||||
|
SubCircuitRowUsage{
|
||||||
|
"sc2",
|
||||||
|
456,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
rc2: RowConsumption{
|
||||||
|
SubCircuitRowUsage{
|
||||||
|
"sc2",
|
||||||
|
456,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expected: RowConsumption{
|
||||||
|
SubCircuitRowUsage{
|
||||||
|
"sc1",
|
||||||
|
123,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
makeMap := func(rc RowConsumption) map[string]uint64 {
|
||||||
|
m := make(map[string]uint64)
|
||||||
|
for _, usage := range rc {
|
||||||
|
m[usage.Name] = usage.RowNumber
|
||||||
|
}
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range tests {
|
||||||
|
assert.Equal(t, makeMap(test.expected), makeMap(test.rc1.Difference(test.rc2)))
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue