Skip to content

Commit 6ce27a4

Browse files
authored
fix(token): instantiate validators with limits resolved from configuration (#1985)
Signed-off-by: Angelo De Caro <adc@zurich.ibm.com>
1 parent 9d2d81a commit 6ce27a4

7 files changed

Lines changed: 79 additions & 44 deletions

File tree

docs/drivers/validation-resource-limits.md

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,25 @@ A `driver.StaticResourceLimits` provider (a trivial wrapper returning a fixed va
5151
tests, tools, and any caller that only needs the defaults (e.g.
5252
`cmd/token_validation_service`, the zkatdlog regression suite).
5353

54-
The resolved `driver.ResourceLimits` flows: composition root → `core.NewValidatorDriverService(limits, ...)`
55-
→ `driver.ValidatorDriver.NewValidator(pp, limits)` → the per-driver `common.NewValidator(..., limits, ...)`
56-
→ `ActionDeserializer.DeserializeActions`, which calls `action.SetLimits(limits)` on every
57-
deserialized action before `Deserialize` runs. Any action constructed without `SetLimits` (e.g. in
58-
tests or other non-validator call sites) falls back to `DefaultResourceLimits()` via an internal
59-
`effectiveLimits()` helper — never more permissive than the historical behavior.
54+
The FSC/DI runtime (`token/sdk/dig/sdk.go`) registers exactly one `driver.ResourceLimitsProvider` in
55+
the dig container — the config-backed implementation above — and injects it into **both** validator
56+
construction paths, so they always enforce the same configured limits:
57+
58+
- The per-TMS token manager service: each driver's `NewTokenDriver` constructor
59+
(`token/core/fabtoken/v1/driver/driver.go`, `token/core/zkatdlog/nogh/v1/driver/driver.go`) takes a
60+
`driver.ResourceLimitsProvider` and resolves it inside `NewTokenService`, immediately before
61+
constructing that TMS's validator.
62+
- The standalone validator-driver service: `newValidatorDriverService`
63+
(`token/sdk/dig/providers.go`) takes the same injected `driver.ResourceLimitsProvider` and resolves
64+
it once when building `core.ValidatorDriverService`.
65+
66+
The resolved `driver.ResourceLimits` flows: provider → (`Driver.NewTokenService` /
67+
`core.NewValidatorDriverService(limits, ...)` → `driver.ValidatorDriver.NewValidator(pp, limits)`) →
68+
the per-driver `common.NewValidator(..., limits, ...)` → `ActionDeserializer.DeserializeActions`,
69+
which calls `action.SetLimits(limits)` on every deserialized action before `Deserialize` runs. Any
70+
action constructed without `SetLimits` (e.g. in tests or other non-validator call sites) falls back
71+
to `DefaultResourceLimits()` via an internal `effectiveLimits()` helper — never more permissive than
72+
the historical behavior.
6073

6174
## Consensus-safety contract
6275

token/core/fabtoken/v1/driver/driver.go

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,15 @@ import (
2626
// Driver contains the non-static logic of the fabtoken driver (including services).
2727
type Driver struct {
2828
BaseWalletServiceFactory
29-
metricsProvider cdriver.MetricsProvider
30-
tracerProvider cdriver.TracerProvider
31-
configService cdriver.ConfigService
32-
storageProvider cdriver.StorageProvider
33-
identityProvider cdriver.IdentityProvider
34-
endpointService cdriver.NetworkBinderService
35-
networkProvider cdriver.NetworkProvider
36-
vaultProvider cdriver.VaultProvider
29+
metricsProvider cdriver.MetricsProvider
30+
tracerProvider cdriver.TracerProvider
31+
configService cdriver.ConfigService
32+
storageProvider cdriver.StorageProvider
33+
identityProvider cdriver.IdentityProvider
34+
endpointService cdriver.NetworkBinderService
35+
networkProvider cdriver.NetworkProvider
36+
vaultProvider cdriver.VaultProvider
37+
resourceLimitsProvider driver.ResourceLimitsProvider
3738
}
3839

3940
// NewTokenDriver returns a new factory for the fabtoken driver.
@@ -46,6 +47,7 @@ func NewTokenDriver(
4647
endpointService cdriver.NetworkBinderService,
4748
networkProvider cdriver.NetworkProvider,
4849
vaultProvider cdriver.VaultProvider,
50+
resourceLimitsProvider driver.ResourceLimitsProvider,
4951
) core.NamedFactory[driver.Driver] {
5052
return core.NamedFactory[driver.Driver]{
5153
Name: core.DriverIdentifier(v1setup.FabTokenDriverName, 1),
@@ -58,6 +60,7 @@ func NewTokenDriver(
5860
endpointService,
5961
networkProvider,
6062
vaultProvider,
63+
resourceLimitsProvider,
6164
),
6265
}
6366
}
@@ -71,16 +74,18 @@ func newTokenDriver(
7174
endpointService cdriver.NetworkBinderService,
7275
networkProvider cdriver.NetworkProvider,
7376
vaultProvider cdriver.VaultProvider,
77+
resourceLimitsProvider driver.ResourceLimitsProvider,
7478
) *Driver {
7579
return &Driver{
76-
metricsProvider: metricsProvider,
77-
tracerProvider: tracerProvider,
78-
configService: configService,
79-
storageProvider: storageProvider,
80-
identityProvider: identityProvider,
81-
endpointService: endpointService,
82-
networkProvider: networkProvider,
83-
vaultProvider: vaultProvider,
80+
metricsProvider: metricsProvider,
81+
tracerProvider: tracerProvider,
82+
configService: configService,
83+
storageProvider: storageProvider,
84+
identityProvider: identityProvider,
85+
endpointService: endpointService,
86+
networkProvider: networkProvider,
87+
vaultProvider: vaultProvider,
88+
resourceLimitsProvider: resourceLimitsProvider,
8489
}
8590
}
8691

@@ -155,11 +160,15 @@ func (d *Driver) NewTokenService(tmsID driver.TMSID, publicParams []byte) (drive
155160
if err != nil {
156161
return nil, errors.Wrapf(err, "failed to initialize token service for [%s:%s]", tmsID.Network, tmsID.Namespace)
157162
}
163+
limits, err := d.resourceLimitsProvider.ResourceLimits()
164+
if err != nil {
165+
return nil, errors.Wrapf(err, "failed resolving validator resource limits")
166+
}
158167
validator := validator.NewValidator(
159168
logger,
160169
publicParamsManager.PublicParams(),
161170
deserializer,
162-
driver.DefaultResourceLimits(),
171+
limits,
163172
nil,
164173
nil,
165174
nil,

token/core/fabtoken/v1/driver/driver_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ func TestNewDriver(t *testing.T) {
4545
endpointService,
4646
networkProvider,
4747
vaultProvider,
48+
tdriver.StaticResourceLimits(tdriver.DefaultResourceLimits()),
4849
)
4950

5051
assert.NotNil(t, factory.Driver)
@@ -70,6 +71,7 @@ func TestNewTokenService(t *testing.T) {
7071
endpointService,
7172
networkProvider,
7273
vaultProvider,
74+
tdriver.StaticResourceLimits(tdriver.DefaultResourceLimits()),
7375
).Driver.(*driver.Driver)
7476

7577
tmsID := tdriver.TMSID{Network: "n1", Channel: "c1", Namespace: "ns1"}

token/core/zkatdlog/nogh/v1/driver/driver.go

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,15 @@ import (
2828
// Driver contains the non-static logic of the zkatdlog driver (including services).
2929
type Driver struct {
3030
BaseWalletServiceFactory
31-
metricsProvider cdriver.MetricsProvider
32-
tracerProvider cdriver.TracerProvider
33-
configService cdriver.ConfigService
34-
storageProvider cdriver.StorageProvider
35-
identityProvider cdriver.IdentityProvider
36-
endpointService cdriver.NetworkBinderService
37-
networkProvider cdriver.NetworkProvider
38-
vaultProvider cdriver.VaultProvider
31+
metricsProvider cdriver.MetricsProvider
32+
tracerProvider cdriver.TracerProvider
33+
configService cdriver.ConfigService
34+
storageProvider cdriver.StorageProvider
35+
identityProvider cdriver.IdentityProvider
36+
endpointService cdriver.NetworkBinderService
37+
networkProvider cdriver.NetworkProvider
38+
vaultProvider cdriver.VaultProvider
39+
resourceLimitsProvider driver.ResourceLimitsProvider
3940
}
4041

4142
// NewTokenDriver returns a new factory for the zkatdlog driver.
@@ -48,6 +49,7 @@ func NewTokenDriver(
4849
endpointService cdriver.NetworkBinderService,
4950
networkProvider cdriver.NetworkProvider,
5051
vaultProvider cdriver.VaultProvider,
52+
resourceLimitsProvider driver.ResourceLimitsProvider,
5153
) core.NamedFactory[driver.Driver] {
5254
return core.NamedFactory[driver.Driver]{
5355
Name: core.DriverIdentifier(v1setup.DLogNoGHDriverName, v1setup.ProtocolV1),
@@ -60,6 +62,7 @@ func NewTokenDriver(
6062
endpointService,
6163
networkProvider,
6264
vaultProvider,
65+
resourceLimitsProvider,
6366
),
6467
}
6568
}
@@ -73,16 +76,18 @@ func newTokenDriver(
7376
endpointService cdriver.NetworkBinderService,
7477
networkProvider cdriver.NetworkProvider,
7578
vaultProvider cdriver.VaultProvider,
79+
resourceLimitsProvider driver.ResourceLimitsProvider,
7680
) *Driver {
7781
return &Driver{
78-
metricsProvider: metricsProvider,
79-
tracerProvider: tracerProvider,
80-
configService: configService,
81-
storageProvider: storageProvider,
82-
identityProvider: identityProvider,
83-
endpointService: endpointService,
84-
networkProvider: networkProvider,
85-
vaultProvider: vaultProvider,
82+
metricsProvider: metricsProvider,
83+
tracerProvider: tracerProvider,
84+
configService: configService,
85+
storageProvider: storageProvider,
86+
identityProvider: identityProvider,
87+
endpointService: endpointService,
88+
networkProvider: networkProvider,
89+
vaultProvider: vaultProvider,
90+
resourceLimitsProvider: resourceLimitsProvider,
8691
}
8792
}
8893

@@ -162,11 +167,15 @@ func (d *Driver) NewTokenService(tmsID driver.TMSID, publicParams []byte) (drive
162167
if err != nil {
163168
return nil, errors.Wrapf(err, "failed to initiliaze token upgrade service for [%s:%s]", tmsID.Network, tmsID.Namespace)
164169
}
170+
limits, err := d.resourceLimitsProvider.ResourceLimits()
171+
if err != nil {
172+
return nil, errors.Wrapf(err, "failed resolving validator resource limits")
173+
}
165174
validator := validator.New(
166175
logger,
167176
ppm.PublicParams(),
168177
deserializer,
169-
driver.DefaultResourceLimits(),
178+
limits,
170179
nil,
171180
nil,
172181
nil,

token/core/zkatdlog/nogh/v1/driver/driver_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ func TestNewDriver(t *testing.T) {
6363
endpointService,
6464
networkProvider,
6565
vaultProvider,
66+
tdriver.StaticResourceLimits(tdriver.DefaultResourceLimits()),
6667
)
6768

6869
assert.NotNil(t, factory.Driver)
@@ -88,6 +89,7 @@ func TestNewTokenService(t *testing.T) {
8889
endpointService,
8990
networkProvider,
9091
vaultProvider,
92+
tdriver.StaticResourceLimits(tdriver.DefaultResourceLimits()),
9193
).Driver.(*driver.Driver)
9294

9395
tmsID := tdriver.TMSID{Network: "n1", Channel: "c1", Namespace: "ns1"}

token/sdk/dig/providers.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ package sdk
99
import (
1010
"github.com/LFDT-Panurus/panurus/token/core"
1111
"github.com/LFDT-Panurus/panurus/token/driver"
12-
"github.com/LFDT-Panurus/panurus/token/services/config"
1312
dbdriver "github.com/LFDT-Panurus/panurus/token/services/storage/db/driver"
1413
"github.com/LFDT-Panurus/panurus/token/services/storage/db/multiplexed"
1514
"github.com/hyperledger-labs/fabric-smart-client/pkg/utils/errors"
@@ -40,11 +39,11 @@ func newTokenDriverService(in struct {
4039

4140
func newValidatorDriverService(in struct {
4241
dig.In
43-
Drivers []core.NamedFactory[driver.ValidatorDriver] `group:"validator-drivers"`
44-
ConfigProvider config.Provider
42+
Drivers []core.NamedFactory[driver.ValidatorDriver] `group:"validator-drivers"`
43+
ResourceLimitsProvider driver.ResourceLimitsProvider
4544
},
4645
) (*core.ValidatorDriverService, error) {
47-
limits, err := config.NewResourceLimitsProvider(in.ConfigProvider).ResourceLimits()
46+
limits, err := in.ResourceLimitsProvider.ResourceLimits()
4847
if err != nil {
4948
return nil, errors.Wrap(err, "failed resolving validation resource limits")
5049
}

token/sdk/dig/sdk.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ func (p *SDK) Install() error {
122122
digutils.Identity[*tms.ConfigServiceWrapper](),
123123
dig.As(new(ftscore.ConfigService), new(db2.ConfigService), new(tms.ConfigService)),
124124
),
125+
p.Container().Provide(ftsconfig.NewResourceLimitsProvider, dig.As(new(ftsdriver.ResourceLimitsProvider))),
125126

126127
// network service
127128
p.Container().Provide(network.NewProvider),

0 commit comments

Comments
 (0)