github.com/filecoin-project/specs-actors/v4@v4.0.2/actors/builtin/verifreg/verified_registry_test.go (about) 1 package verifreg_test 2 3 import ( 4 "strings" 5 "testing" 6 7 "github.com/filecoin-project/go-address" 8 "github.com/filecoin-project/go-state-types/abi" 9 "github.com/filecoin-project/go-state-types/big" 10 "github.com/filecoin-project/go-state-types/exitcode" 11 "github.com/stretchr/testify/assert" 12 "github.com/stretchr/testify/require" 13 14 "github.com/filecoin-project/specs-actors/v4/actors/builtin" 15 "github.com/filecoin-project/specs-actors/v4/actors/builtin/verifreg" 16 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" 17 "github.com/filecoin-project/specs-actors/v4/support/mock" 18 tutil "github.com/filecoin-project/specs-actors/v4/support/testing" 19 ) 20 21 func TestExports(t *testing.T) { 22 mock.CheckActorExports(t, verifreg.Actor{}) 23 } 24 25 func TestConstruction(t *testing.T) { 26 receiver := tutil.NewIDAddr(t, 100) 27 28 builder := mock.NewBuilder(receiver). 29 WithCaller(builtin.SystemActorAddr, builtin.InitActorCodeID) 30 31 t.Run("successful construction with root ID address", func(t *testing.T) { 32 rt := builder.Build(t) 33 raddr := tutil.NewIDAddr(t, 101) 34 35 actor := verifRegActorTestHarness{t: t, rootkey: raddr} 36 actor.constructAndVerify(rt) 37 38 emptyMap, err := adt.StoreEmptyMap(rt.AdtStore(), builtin.DefaultHamtBitwidth) 39 require.NoError(t, err) 40 41 state := actor.state(rt) 42 assert.Equal(t, emptyMap, state.VerifiedClients) 43 assert.Equal(t, emptyMap, state.Verifiers) 44 assert.Equal(t, raddr, state.RootKey) 45 actor.checkState(rt) 46 }) 47 48 t.Run("non-ID address root is resolved to an ID address for construction", func(t *testing.T) { 49 rt := builder.Build(t) 50 51 raddr := tutil.NewBLSAddr(t, 101) 52 rootIdAddr := tutil.NewIDAddr(t, 201) 53 rt.AddIDAddress(raddr, rootIdAddr) 54 55 actor := verifRegActorTestHarness{t: t, rootkey: raddr} 56 actor.constructAndVerify(rt) 57 58 emptyMap, err := adt.StoreEmptyMap(rt.AdtStore(), builtin.DefaultHamtBitwidth) 59 require.NoError(t, err) 60 61 var state verifreg.State 62 rt.GetState(&state) 63 assert.Equal(t, emptyMap, state.VerifiedClients) 64 assert.Equal(t, emptyMap, state.Verifiers) 65 assert.Equal(t, rootIdAddr, state.RootKey) 66 actor.checkState(rt) 67 }) 68 69 t.Run("fails if root cannot be resolved to an ID address", func(t *testing.T) { 70 rt := builder.Build(t) 71 actor := verifreg.Actor{} 72 rt.ExpectValidateCallerAddr(builtin.SystemActorAddr) 73 74 raddr := tutil.NewBLSAddr(t, 101) 75 76 rt.ExpectAbort(exitcode.ErrIllegalArgument, func() { 77 rt.Call(actor.Constructor, &raddr) 78 }) 79 rt.Verify() 80 }) 81 } 82 83 func TestAddVerifier(t *testing.T) { 84 root := tutil.NewIDAddr(t, 101) 85 va := tutil.NewIDAddr(t, 201) 86 allowance := big.Add(verifreg.MinVerifiedDealSize, big.NewInt(42)) 87 88 t.Run("fails when caller is not the root key", func(t *testing.T) { 89 rt, ac := basicVerifRegSetup(t, root) 90 verifier := mkVerifierParams(va, allowance) 91 92 rt.ExpectValidateCallerAddr(ac.rootkey) 93 rt.SetCaller(tutil.NewIDAddr(t, 501), builtin.VerifiedRegistryActorCodeID) 94 rt.ExpectAbort(exitcode.SysErrForbidden, func() { 95 rt.Call(ac.AddVerifier, verifier) 96 }) 97 ac.checkState(rt) 98 }) 99 100 t.Run("fails when allowance less than MinVerifiedDealSize", func(t *testing.T) { 101 rt, ac := basicVerifRegSetup(t, root) 102 103 rt.ExpectAbort(exitcode.ErrIllegalArgument, func() { 104 ac.addVerifier(rt, va, big.Sub(verifreg.MinVerifiedDealSize, big.NewInt(1))) 105 }) 106 ac.checkState(rt) 107 }) 108 109 t.Run("fails when root is added as a verifier", func(t *testing.T) { 110 rt, ac := basicVerifRegSetup(t, root) 111 112 rt.ExpectAbort(exitcode.ErrIllegalArgument, func() { 113 ac.addVerifier(rt, root, allowance) 114 }) 115 ac.checkState(rt) 116 }) 117 118 t.Run("fails when verified client is added as a verifier", func(t *testing.T) { 119 rt, ac := basicVerifRegSetup(t, root) 120 121 // add a verified client 122 verifierAddr := tutil.NewIDAddr(t, 601) 123 clientAddr := tutil.NewIDAddr(t, 602) 124 ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientAddr, allowance, allowance) 125 126 // now attempt to add verified client as a verifier -> should fail 127 rt.ExpectAbort(exitcode.ErrIllegalArgument, func() { 128 ac.addVerifier(rt, clientAddr, allowance) 129 }) 130 ac.checkState(rt) 131 }) 132 133 t.Run("fails to add verifier with non-ID address if not resolvable to ID address", func(t *testing.T) { 134 rt, ac := basicVerifRegSetup(t, root) 135 136 verifierNonIdAddr := tutil.NewBLSAddr(t, 1) 137 138 rt.ExpectSend(verifierNonIdAddr, builtin.MethodSend, nil, abi.NewTokenAmount(0), nil, exitcode.Ok) 139 140 rt.ExpectAbort(exitcode.ErrIllegalState, func() { 141 ac.addNewVerifier(rt, verifierNonIdAddr, allowance) 142 }) 143 ac.checkState(rt) 144 }) 145 146 t.Run("successfully add a verifier", func(t *testing.T) { 147 rt, ac := basicVerifRegSetup(t, root) 148 ac.addNewVerifier(rt, va, allowance) 149 ac.checkState(rt) 150 }) 151 152 t.Run("successfully add a verifier after resolving to ID address", func(t *testing.T) { 153 rt, ac := basicVerifRegSetup(t, root) 154 155 verifierIdAddr := tutil.NewIDAddr(t, 501) 156 verifierNonIdAddr := tutil.NewBLSAddr(t, 1) 157 158 rt.AddIDAddress(verifierNonIdAddr, verifierIdAddr) 159 160 ac.addNewVerifier(rt, verifierNonIdAddr, allowance) 161 162 dc := ac.getVerifierCap(rt, verifierIdAddr) 163 assert.EqualValues(t, allowance, dc) 164 ac.checkState(rt) 165 }) 166 } 167 168 func TestRemoveVerifier(t *testing.T) { 169 root := tutil.NewIDAddr(t, 101) 170 va := tutil.NewIDAddr(t, 201) 171 allowance := big.Add(verifreg.MinVerifiedDealSize, big.NewInt(42)) 172 173 t.Run("fails when caller is not the root key", func(t *testing.T) { 174 rt, ac := basicVerifRegSetup(t, root) 175 // add a verifier 176 v := ac.addNewVerifier(rt, va, allowance) 177 178 rt.ExpectValidateCallerAddr(ac.rootkey) 179 rt.SetCaller(tutil.NewIDAddr(t, 501), builtin.VerifiedRegistryActorCodeID) 180 rt.ExpectAbort(exitcode.SysErrForbidden, func() { 181 rt.Call(ac.RemoveVerifier, &v.Address) 182 }) 183 ac.checkState(rt) 184 }) 185 186 t.Run("fails when verifier does not exist", func(t *testing.T) { 187 rt, ac := basicVerifRegSetup(t, root) 188 189 rt.ExpectValidateCallerAddr(ac.rootkey) 190 rt.SetCaller(ac.rootkey, builtin.VerifiedRegistryActorCodeID) 191 v := tutil.NewIDAddr(t, 501) 192 rt.ExpectAbort(exitcode.ErrIllegalArgument, func() { 193 rt.Call(ac.RemoveVerifier, &v) 194 }) 195 ac.checkState(rt) 196 }) 197 198 t.Run("successfully remove a verifier", func(t *testing.T) { 199 rt, ac := basicVerifRegSetup(t, root) 200 ac.addNewVerifier(rt, va, allowance) 201 202 ac.removeVerifier(rt, va) 203 ac.checkState(rt) 204 }) 205 206 t.Run("add verifier with non ID address and then remove with its ID address", func(t *testing.T) { 207 rt, ac := basicVerifRegSetup(t, root) 208 209 verifierIdAddr := tutil.NewIDAddr(t, 501) 210 verifierNonIdAddr := tutil.NewBLSAddr(t, 1) 211 rt.AddIDAddress(verifierNonIdAddr, verifierIdAddr) 212 213 // add using non-ID address 214 ac.addNewVerifier(rt, verifierNonIdAddr, allowance) 215 216 // remove using ID address 217 ac.removeVerifier(rt, verifierIdAddr) 218 ac.assertVerifierRemoved(rt, verifierIdAddr) 219 ac.checkState(rt) 220 }) 221 } 222 223 func TestAddVerifiedClient(t *testing.T) { 224 root := tutil.NewIDAddr(t, 101) 225 clientAddr := tutil.NewIDAddr(t, 201) 226 clientAddr2 := tutil.NewIDAddr(t, 202) 227 clientAddr3 := tutil.NewIDAddr(t, 203) 228 clientAddr4 := tutil.NewIDAddr(t, 204) 229 230 verifierAddr := tutil.NewIDAddr(t, 301) 231 verifierAddr2 := tutil.NewIDAddr(t, 302) 232 allowance := big.Add(verifreg.MinVerifiedDealSize, big.NewInt(42)) 233 clientAllowance := big.Sub(allowance, big.NewInt(1)) 234 235 t.Run("successfully add multiple verified clients from different verifiers", func(t *testing.T) { 236 rt, ac := basicVerifRegSetup(t, root) 237 238 c1 := mkClientParams(clientAddr, clientAllowance) 239 c2 := mkClientParams(clientAddr2, clientAllowance) 240 c3 := mkClientParams(clientAddr3, clientAllowance) 241 c4 := mkClientParams(clientAddr4, clientAllowance) 242 243 // verifier 1 should have enough allowance for both clients 244 verifier := mkVerifierParams(verifierAddr, allowance) 245 verifier.Allowance = big.Sum(c1.Allowance, c2.Allowance) 246 ac.addVerifier(rt, verifier.Address, verifier.Allowance) 247 248 // verifier 2 should have enough allowance for both clients 249 verifier2 := mkVerifierParams(verifierAddr2, allowance) 250 verifier2.Allowance = big.Sum(c3.Allowance, c4.Allowance) 251 ac.addVerifier(rt, verifier2.Address, verifier2.Allowance) 252 253 // add client 1 & 2 254 ac.addVerifiedClient(rt, verifier.Address, c1.Address, c1.Allowance) 255 ac.addVerifiedClient(rt, verifier.Address, c2.Address, c2.Allowance) 256 257 // add clients 3 & 4 258 ac.addVerifiedClient(rt, verifier2.Address, c3.Address, c3.Allowance) 259 ac.addVerifiedClient(rt, verifier2.Address, c4.Address, c4.Allowance) 260 261 // all clients should exist and verifiers should have no more allowance left 262 assert.EqualValues(t, c1.Allowance, ac.getClientCap(rt, c1.Address)) 263 assert.EqualValues(t, c2.Allowance, ac.getClientCap(rt, c2.Address)) 264 assert.EqualValues(t, c3.Allowance, ac.getClientCap(rt, c3.Address)) 265 assert.EqualValues(t, c4.Allowance, ac.getClientCap(rt, c4.Address)) 266 267 assert.EqualValues(t, big.Zero(), ac.getVerifierCap(rt, verifierAddr)) 268 assert.EqualValues(t, big.Zero(), ac.getVerifierCap(rt, verifierAddr2)) 269 ac.checkState(rt) 270 }) 271 272 t.Run("verifier successfully adds a verified client and then fails on adding another verified client because of low allowance", func(t *testing.T) { 273 rt, ac := basicVerifRegSetup(t, root) 274 275 c1 := mkClientParams(clientAddr, clientAllowance) 276 c2 := mkClientParams(clientAddr2, clientAllowance) 277 278 // verifier only has enough balance for one client 279 verifier := mkVerifierParams(verifierAddr, allowance) 280 verifier.Allowance = c1.Allowance 281 ac.addVerifier(rt, verifier.Address, verifier.Allowance) 282 283 // add client 1 works 284 ac.addVerifiedClient(rt, verifier.Address, c1.Address, c1.Allowance) 285 286 // add client 2 fails 287 rt.SetCaller(verifier.Address, builtin.VerifiedRegistryActorCodeID) 288 rt.ExpectValidateCallerAny() 289 rt.ExpectAbort(exitcode.ErrIllegalArgument, func() { 290 rt.Call(ac.AddVerifiedClient, c2) 291 }) 292 rt.Verify() 293 294 // one client should exist and verifier should have no more allowance left 295 assert.EqualValues(t, c1.Allowance, ac.getClientCap(rt, c1.Address)) 296 assert.EqualValues(t, big.Zero(), ac.getVerifierCap(rt, verifierAddr)) 297 ac.checkState(rt) 298 }) 299 300 t.Run("successfully add a verified client after resolving it's given non ID address to it's ID address", func(t *testing.T) { 301 rt, ac := basicVerifRegSetup(t, root) 302 303 clientIdAddr := tutil.NewIDAddr(t, 501) 304 clientNonIdAddr := tutil.NewBLSAddr(t, 1) 305 rt.AddIDAddress(clientNonIdAddr, clientIdAddr) 306 307 c1 := mkClientParams(clientNonIdAddr, clientAllowance) 308 309 verifier := mkVerifierParams(verifierAddr, allowance) 310 ac.addVerifier(rt, verifier.Address, verifier.Allowance) 311 ac.addVerifiedClient(rt, verifier.Address, c1.Address, c1.Allowance) 312 313 assert.EqualValues(t, clientAllowance, ac.getClientCap(rt, clientIdAddr)) 314 315 // adding another verified client with the same ID address now fails 316 c2 := mkClientParams(clientIdAddr, clientAllowance) 317 verifier = mkVerifierParams(verifierAddr, allowance) 318 ac.addVerifier(rt, verifier.Address, verifier.Allowance) 319 320 rt.ExpectAbort(exitcode.ErrIllegalArgument, func() { 321 ac.addVerifiedClient(rt, verifier.Address, c2.Address, c2.Allowance) 322 }) 323 ac.checkState(rt) 324 }) 325 326 t.Run("success when allowance is equal to MinVerifiedDealSize", func(t *testing.T) { 327 rt, ac := basicVerifRegSetup(t, root) 328 329 c1 := mkClientParams(clientAddr, verifreg.MinVerifiedDealSize) 330 331 // verifier only has enough balance for one client 332 verifier := mkVerifierParams(verifierAddr, verifreg.MinVerifiedDealSize) 333 ac.addVerifier(rt, verifier.Address, verifier.Allowance) 334 335 // add client works 336 ac.addVerifiedClient(rt, verifier.Address, c1.Address, c1.Allowance) 337 ac.checkState(rt) 338 }) 339 340 t.Run("fails to add verified client if address is not resolvable to ID address", func(t *testing.T) { 341 rt, ac := basicVerifRegSetup(t, root) 342 343 clientNonIdAddr := tutil.NewBLSAddr(t, 1) 344 c1 := mkClientParams(clientNonIdAddr, clientAllowance) 345 346 verifier := mkVerifierParams(verifierAddr, allowance) 347 ac.addVerifier(rt, verifier.Address, verifier.Allowance) 348 349 rt.ExpectSend(clientNonIdAddr, builtin.MethodSend, nil, abi.NewTokenAmount(0), nil, exitcode.Ok) 350 351 rt.ExpectAbort(exitcode.ErrIllegalState, func() { 352 ac.addVerifiedClient(rt, verifier.Address, c1.Address, c1.Allowance) 353 }) 354 ac.checkState(rt) 355 }) 356 357 t.Run("fails when allowance is less than MinVerifiedDealSize", func(t *testing.T) { 358 rt, ac := basicVerifRegSetup(t, root) 359 allowance := big.Sub(verifreg.MinVerifiedDealSize, big.NewInt(1)) 360 p := &verifreg.AddVerifiedClientParams{Address: tutil.NewIDAddr(t, 501), Allowance: allowance} 361 362 rt.ExpectValidateCallerAny() 363 364 rt.ExpectAbort(exitcode.ErrIllegalArgument, func() { 365 rt.Call(ac.AddVerifiedClient, p) 366 }) 367 ac.checkState(rt) 368 }) 369 370 t.Run("fails when caller is not a verifier", func(t *testing.T) { 371 rt, ac := basicVerifRegSetup(t, root) 372 client := mkClientParams(clientAddr, clientAllowance) 373 ac.addNewVerifier(rt, verifierAddr, allowance) 374 375 nc := tutil.NewIDAddr(t, 209) 376 rt.SetCaller(nc, builtin.VerifiedRegistryActorCodeID) 377 rt.ExpectValidateCallerAny() 378 379 rt.ExpectAbort(exitcode.ErrNotFound, func() { 380 rt.Call(ac.AddVerifiedClient, client) 381 }) 382 ac.checkState(rt) 383 }) 384 385 t.Run("fails when verifier cap is less than client allowance", func(t *testing.T) { 386 rt, ac := basicVerifRegSetup(t, root) 387 verifier := ac.addNewVerifier(rt, verifierAddr, allowance) 388 389 rt.SetCaller(verifier.Address, builtin.VerifiedRegistryActorCodeID) 390 rt.ExpectValidateCallerAny() 391 392 client := mkClientParams(clientAddr, clientAllowance) 393 client.Allowance = big.Add(verifier.Allowance, big.NewInt(1)) 394 rt.ExpectAbort(exitcode.ErrIllegalArgument, func() { 395 rt.Call(ac.AddVerifiedClient, client) 396 }) 397 ac.checkState(rt) 398 }) 399 400 t.Run("fails when verified client already exists", func(t *testing.T) { 401 rt, ac := basicVerifRegSetup(t, root) 402 403 // add verified client with caller 1 404 verifier := ac.addNewVerifier(rt, verifierAddr, allowance) 405 client := mkClientParams(clientAddr, clientAllowance) 406 ac.addVerifiedClient(rt, verifier.Address, client.Address, client.Allowance) 407 408 // add verified client with caller 2 409 verifier2 := ac.addNewVerifier(rt, verifierAddr, allowance) 410 rt.SetCaller(verifier2.Address, builtin.VerifiedRegistryActorCodeID) 411 rt.ExpectValidateCallerAny() 412 rt.ExpectAbort(exitcode.ErrIllegalArgument, func() { 413 rt.Call(ac.AddVerifiedClient, client) 414 }) 415 ac.checkState(rt) 416 }) 417 418 t.Run("fails when root is added as a verified client", func(t *testing.T) { 419 rt, ac := basicVerifRegSetup(t, root) 420 421 verifier := ac.addNewVerifier(rt, verifierAddr, allowance) 422 client := mkClientParams(root, clientAllowance) 423 424 rt.ExpectAbort(exitcode.ErrIllegalArgument, func() { 425 ac.addVerifiedClient(rt, verifier.Address, client.Address, client.Allowance) 426 }) 427 ac.checkState(rt) 428 }) 429 430 t.Run("fails when verifier is added as a verified client", func(t *testing.T) { 431 rt, ac := basicVerifRegSetup(t, root) 432 433 // add verified client with caller 1 434 verifier := ac.addNewVerifier(rt, verifierAddr, allowance) 435 client := mkClientParams(verifierAddr, clientAllowance) 436 rt.SetCaller(verifier.Address, builtin.VerifiedRegistryActorCodeID) 437 rt.ExpectValidateCallerAny() 438 rt.ExpectAbort(exitcode.ErrIllegalArgument, func() { 439 rt.Call(ac.AddVerifiedClient, client) 440 }) 441 ac.checkState(rt) 442 }) 443 } 444 445 func TestUseBytes(t *testing.T) { 446 root := tutil.NewIDAddr(t, 101) 447 clientAddr := tutil.NewIDAddr(t, 201) 448 clientAddr2 := tutil.NewIDAddr(t, 202) 449 clientAddr3 := tutil.NewIDAddr(t, 203) 450 451 verifierAddr := tutil.NewIDAddr(t, 301) 452 vallow := big.Add(verifreg.MinVerifiedDealSize, big.NewInt(100)) 453 454 t.Run("successfully consume deal bytes for deals from different verified clients", func(t *testing.T) { 455 rt, ac := basicVerifRegSetup(t, root) 456 457 ca1 := big.Mul(verifreg.MinVerifiedDealSize, big.NewInt(3)) 458 ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientAddr, vallow, ca1) 459 460 ca2 := big.Mul(verifreg.MinVerifiedDealSize, big.NewInt(2)) 461 ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientAddr2, vallow, ca2) 462 463 ca3 := big.Add(verifreg.MinVerifiedDealSize, big.NewInt(1)) 464 ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientAddr3, vallow, ca3) 465 466 dSize := verifreg.MinVerifiedDealSize 467 bal1 := big.Sub(ca1, dSize) 468 bal2 := big.Sub(ca2, dSize) 469 // client 1 uses bytes 470 ac.useBytes(rt, clientAddr, dSize, &capExpectation{expectedCap: bal1}) 471 // client 2 uses bytes 472 ac.useBytes(rt, clientAddr2, dSize, &capExpectation{expectedCap: bal2}) 473 // client 3 uses bytes 474 ac.useBytes(rt, clientAddr3, dSize, &capExpectation{removed: true}) 475 476 // verify 477 assert.EqualValues(t, bal1, ac.getClientCap(rt, clientAddr)) 478 assert.EqualValues(t, bal2, ac.getClientCap(rt, clientAddr2)) 479 ac.assertClientRemoved(rt, clientAddr3) 480 481 // client 1 adds a deal and it works 482 bal1 = big.Sub(bal1, dSize) 483 ac.useBytes(rt, clientAddr, dSize, &capExpectation{expectedCap: bal1}) 484 // client 2 adds a deal and it works 485 ac.useBytes(rt, clientAddr2, dSize, &capExpectation{removed: true}) 486 487 // verify 488 assert.EqualValues(t, bal1, ac.getClientCap(rt, clientAddr)) 489 ac.assertClientRemoved(rt, clientAddr2) 490 ac.checkState(rt) 491 }) 492 493 t.Run("successfully consume deal bytes for verified client and then fail on next attempt because it does NOT have enough allowance", func(t *testing.T) { 494 rt, ac := basicVerifRegSetup(t, root) 495 clientAllowance := big.Sum(verifreg.MinVerifiedDealSize, verifreg.MinVerifiedDealSize, big.NewInt(1)) 496 497 // add verified client 498 ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientAddr, vallow, clientAllowance) 499 500 // use bytes 501 dSize1 := verifreg.MinVerifiedDealSize 502 ac.useBytes(rt, clientAddr, dSize1, &capExpectation{expectedCap: big.Sub(clientAllowance, dSize1)}) 503 504 // fails now because client does NOT have enough capacity for second deal 505 dSize2 := big.Add(verifreg.MinVerifiedDealSize, big.NewInt(2)) 506 param := &verifreg.UseBytesParams{Address: clientAddr, DealSize: dSize2} 507 508 rt.ExpectAbort(exitcode.ErrIllegalArgument, func() { 509 ac.useBytes(rt, param.Address, param.DealSize, nil) 510 }) 511 ac.checkState(rt) 512 }) 513 514 t.Run("successfully consume deal bytes after resolving verified client address", func(t *testing.T) { 515 rt, ac := basicVerifRegSetup(t, root) 516 clientAllowance := big.Sum(verifreg.MinVerifiedDealSize, verifreg.MinVerifiedDealSize, big.NewInt(1)) 517 518 clientIdAddr := tutil.NewIDAddr(t, 501) 519 clientNonIdAddr := tutil.NewBLSAddr(t, 502) 520 rt.AddIDAddress(clientNonIdAddr, clientIdAddr) 521 522 // add verified client 523 ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientIdAddr, vallow, clientAllowance) 524 525 // use bytes 526 dSize1 := verifreg.MinVerifiedDealSize 527 ac.useBytes(rt, clientNonIdAddr, dSize1, &capExpectation{expectedCap: big.Sub(clientAllowance, dSize1)}) 528 ac.checkState(rt) 529 }) 530 531 t.Run("successfully consume deal for verified client and then fail on next attempt because it has been removed", func(t *testing.T) { 532 rt, ac := basicVerifRegSetup(t, root) 533 clientAllowance := big.Sum(verifreg.MinVerifiedDealSize, big.NewInt(1)) 534 535 // add verified client 536 ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientAddr, vallow, clientAllowance) 537 538 // use bytes 539 dSize1 := verifreg.MinVerifiedDealSize 540 ac.useBytes(rt, clientAddr, dSize1, &capExpectation{removed: true}) 541 542 // fails now because client has been removed 543 dSize2 := verifreg.MinVerifiedDealSize 544 param := &verifreg.UseBytesParams{Address: clientAddr, DealSize: dSize2} 545 546 rt.ExpectAbort(exitcode.ErrNotFound, func() { 547 ac.useBytes(rt, param.Address, param.DealSize, nil) 548 549 }) 550 ac.checkState(rt) 551 }) 552 553 t.Run("fail if caller is not storage market actor", func(t *testing.T) { 554 rt, ac := basicVerifRegSetup(t, root) 555 rt.ExpectValidateCallerAddr(builtin.StorageMarketActorAddr) 556 rt.SetCaller(builtin.StoragePowerActorAddr, builtin.StoragePowerActorCodeID) 557 param := &verifreg.UseBytesParams{Address: clientAddr, DealSize: verifreg.MinVerifiedDealSize} 558 559 rt.ExpectAbort(exitcode.SysErrForbidden, func() { 560 rt.Call(ac.UseBytes, param) 561 }) 562 ac.checkState(rt) 563 }) 564 565 t.Run("fail if deal size is less than min verified deal size", func(t *testing.T) { 566 rt, ac := basicVerifRegSetup(t, root) 567 dSize2 := big.Sub(verifreg.MinVerifiedDealSize, big.NewInt(1)) 568 param := &verifreg.UseBytesParams{Address: clientAddr, DealSize: dSize2} 569 570 rt.ExpectAbort(exitcode.ErrIllegalArgument, func() { 571 ac.useBytes(rt, param.Address, param.DealSize, nil) 572 }) 573 ac.checkState(rt) 574 }) 575 576 t.Run("fail if verified client does not exist", func(t *testing.T) { 577 rt, ac := basicVerifRegSetup(t, root) 578 dSize2 := verifreg.MinVerifiedDealSize 579 param := &verifreg.UseBytesParams{Address: clientAddr, DealSize: dSize2} 580 581 rt.ExpectAbort(exitcode.ErrNotFound, func() { 582 ac.useBytes(rt, param.Address, param.DealSize, nil) 583 584 }) 585 ac.checkState(rt) 586 }) 587 588 t.Run("fail if deal size is greater than verified client cap", func(t *testing.T) { 589 rt, ac := basicVerifRegSetup(t, root) 590 clientAllowance := big.Sum(verifreg.MinVerifiedDealSize, big.NewInt(1)) 591 592 // add verified client 593 ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientAddr, vallow, clientAllowance) 594 595 // use bytes 596 dSize := big.Add(clientAllowance, big.NewInt(1)) 597 param := &verifreg.UseBytesParams{Address: clientAddr, DealSize: dSize} 598 599 rt.ExpectAbort(exitcode.ErrIllegalArgument, func() { 600 ac.useBytes(rt, param.Address, param.DealSize, nil) 601 }) 602 ac.checkState(rt) 603 }) 604 } 605 606 func TestRestoreBytes(t *testing.T) { 607 root := tutil.NewIDAddr(t, 101) 608 clientAddr := tutil.NewIDAddr(t, 201) 609 clientAddr2 := tutil.NewIDAddr(t, 202) 610 clientAddr3 := tutil.NewIDAddr(t, 203) 611 verifierAddr := tutil.NewIDAddr(t, 301) 612 vallow := big.Add(verifreg.MinVerifiedDealSize, big.NewInt(100)) 613 614 t.Run("successfully restore deal bytes for different verified clients", func(t *testing.T) { 615 rt, ac := basicVerifRegSetup(t, root) 616 617 ca1 := big.Mul(verifreg.MinVerifiedDealSize, big.NewInt(3)) 618 ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientAddr, vallow, ca1) 619 620 ca2 := big.Mul(verifreg.MinVerifiedDealSize, big.NewInt(2)) 621 ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientAddr2, vallow, ca2) 622 623 ca3 := big.Add(verifreg.MinVerifiedDealSize, big.NewInt(1)) 624 ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientAddr3, vallow, ca3) 625 626 dSize := verifreg.MinVerifiedDealSize 627 bal1 := big.Add(ca1, dSize) 628 bal2 := big.Add(ca2, dSize) 629 bal3 := big.Add(ca3, dSize) 630 631 // client 1 restores bytes 632 ac.restoreBytes(rt, clientAddr, dSize, &capExpectation{expectedCap: bal1}) 633 // client 2 restores bytes 634 ac.restoreBytes(rt, clientAddr2, dSize, &capExpectation{expectedCap: bal2}) 635 // client 3 restores bytes 636 ac.restoreBytes(rt, clientAddr3, dSize, &capExpectation{expectedCap: bal3}) 637 638 // verify cap for all three clients 639 assert.EqualValues(t, bal1, ac.getClientCap(rt, clientAddr)) 640 assert.EqualValues(t, bal2, ac.getClientCap(rt, clientAddr2)) 641 assert.EqualValues(t, bal3, ac.getClientCap(rt, clientAddr3)) 642 643 bal1 = big.Sub(bal1, dSize) 644 bal2 = big.Sub(bal2, dSize) 645 // client1 and client2 use bytes 646 ac.useBytes(rt, clientAddr, dSize, &capExpectation{expectedCap: bal1}) 647 ac.useBytes(rt, clientAddr2, dSize, &capExpectation{expectedCap: bal2}) 648 649 assert.EqualValues(t, bal1, ac.getClientCap(rt, clientAddr)) 650 assert.EqualValues(t, bal2, ac.getClientCap(rt, clientAddr2)) 651 assert.EqualValues(t, bal3, ac.getClientCap(rt, clientAddr3)) 652 653 bal1 = big.Add(bal1, dSize) 654 bal2 = big.Add(bal2, dSize) 655 bal3 = big.Add(bal3, dSize) 656 // restore bytes for client1, 2 and 3 657 ac.restoreBytes(rt, clientAddr, dSize, &capExpectation{expectedCap: bal1}) 658 ac.restoreBytes(rt, clientAddr2, dSize, &capExpectation{expectedCap: bal2}) 659 ac.restoreBytes(rt, clientAddr3, dSize, &capExpectation{expectedCap: bal3}) 660 assert.EqualValues(t, bal1, ac.getClientCap(rt, clientAddr)) 661 assert.EqualValues(t, bal2, ac.getClientCap(rt, clientAddr2)) 662 assert.EqualValues(t, bal3, ac.getClientCap(rt, clientAddr3)) 663 ac.checkState(rt) 664 }) 665 666 t.Run("successfully restore bytes after using bytes reduces a client's cap", func(t *testing.T) { 667 rt, ac := basicVerifRegSetup(t, root) 668 clientAllowance := big.Sum(verifreg.MinVerifiedDealSize, verifreg.MinVerifiedDealSize) 669 670 // add verified client -> use bytes 671 ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientAddr, vallow, clientAllowance) 672 dSize1 := verifreg.MinVerifiedDealSize 673 bal := big.Sub(clientAllowance, dSize1) 674 ac.useBytes(rt, clientAddr, dSize1, &capExpectation{expectedCap: bal}) 675 676 sz := verifreg.MinVerifiedDealSize 677 ac.restoreBytes(rt, clientAddr, sz, &capExpectation{expectedCap: big.Add(bal, sz)}) 678 ac.checkState(rt) 679 }) 680 681 t.Run("successfully restore deal bytes after resolving client address", func(t *testing.T) { 682 rt, ac := basicVerifRegSetup(t, root) 683 684 clientIdAddr := tutil.NewIDAddr(t, 501) 685 clientNonIdAddr := tutil.NewBLSAddr(t, 502) 686 rt.AddIDAddress(clientNonIdAddr, clientIdAddr) 687 688 clientAllowance := big.Sum(verifreg.MinVerifiedDealSize, verifreg.MinVerifiedDealSize) 689 690 // add verified client -> use bytes 691 ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientIdAddr, vallow, clientAllowance) 692 dSize1 := verifreg.MinVerifiedDealSize 693 bal := big.Sub(clientAllowance, dSize1) 694 ac.useBytes(rt, clientIdAddr, dSize1, &capExpectation{expectedCap: bal}) 695 696 sz := verifreg.MinVerifiedDealSize 697 ac.restoreBytes(rt, clientNonIdAddr, sz, &capExpectation{expectedCap: big.Add(bal, sz)}) 698 699 assert.EqualValues(t, big.Add(bal, sz), ac.getClientCap(rt, clientIdAddr)) 700 ac.checkState(rt) 701 }) 702 703 t.Run("successfully restore bytes after using bytes removes a client", func(t *testing.T) { 704 rt, ac := basicVerifRegSetup(t, root) 705 clientAllowance := big.Sum(verifreg.MinVerifiedDealSize, big.NewInt(1)) 706 707 // add verified client -> use bytes -> client is removed 708 ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientAddr, vallow, clientAllowance) 709 dSize1 := verifreg.MinVerifiedDealSize 710 ac.useBytes(rt, clientAddr, dSize1, &capExpectation{removed: true}) 711 712 sz := verifreg.MinVerifiedDealSize 713 ac.restoreBytes(rt, clientAddr, sz, &capExpectation{expectedCap: sz}) 714 ac.checkState(rt) 715 }) 716 717 t.Run("fail if caller is not storage market actor", func(t *testing.T) { 718 rt, ac := basicVerifRegSetup(t, root) 719 rt.ExpectValidateCallerAddr(builtin.StorageMarketActorAddr) 720 rt.SetCaller(builtin.StoragePowerActorAddr, builtin.StoragePowerActorCodeID) 721 param := &verifreg.RestoreBytesParams{Address: clientAddr, DealSize: verifreg.MinVerifiedDealSize} 722 723 rt.ExpectAbort(exitcode.SysErrForbidden, func() { 724 rt.Call(ac.RestoreBytes, param) 725 }) 726 ac.checkState(rt) 727 }) 728 729 t.Run("fail if deal size is less than min verified deal size", func(t *testing.T) { 730 rt, ac := basicVerifRegSetup(t, root) 731 dSize2 := big.Sub(verifreg.MinVerifiedDealSize, big.NewInt(1)) 732 rt.ExpectValidateCallerAddr(builtin.StorageMarketActorAddr) 733 rt.SetCaller(builtin.StorageMarketActorAddr, builtin.StorageMinerActorCodeID) 734 param := &verifreg.RestoreBytesParams{Address: clientAddr, DealSize: dSize2} 735 736 rt.ExpectAbort(exitcode.ErrIllegalArgument, func() { 737 rt.Call(ac.RestoreBytes, param) 738 }) 739 ac.checkState(rt) 740 }) 741 742 t.Run("fails if attempt to restore bytes for root", func(t *testing.T) { 743 rt, ac := basicVerifRegSetup(t, root) 744 rt.ExpectValidateCallerAddr(builtin.StorageMarketActorAddr) 745 rt.SetCaller(builtin.StorageMarketActorAddr, builtin.StorageMinerActorCodeID) 746 param := &verifreg.RestoreBytesParams{Address: root, DealSize: verifreg.MinVerifiedDealSize} 747 748 rt.ExpectAbort(exitcode.ErrIllegalArgument, func() { 749 rt.Call(ac.RestoreBytes, param) 750 }) 751 ac.checkState(rt) 752 }) 753 754 t.Run("fails if attempt to restore bytes for verifier", func(t *testing.T) { 755 rt, ac := basicVerifRegSetup(t, root) 756 // add a verifier 757 ac.addNewVerifier(rt, verifierAddr, vallow) 758 759 rt.ExpectValidateCallerAddr(builtin.StorageMarketActorAddr) 760 rt.SetCaller(builtin.StorageMarketActorAddr, builtin.StorageMinerActorCodeID) 761 param := &verifreg.RestoreBytesParams{Address: verifierAddr, DealSize: verifreg.MinVerifiedDealSize} 762 763 rt.ExpectAbort(exitcode.ErrIllegalArgument, func() { 764 rt.Call(ac.RestoreBytes, param) 765 }) 766 ac.checkState(rt) 767 }) 768 } 769 770 type verifRegActorTestHarness struct { 771 rootkey address.Address 772 verifreg.Actor 773 t testing.TB 774 } 775 776 func basicVerifRegSetup(t *testing.T, root address.Address) (*mock.Runtime, *verifRegActorTestHarness) { 777 builder := mock.NewBuilder(builtin.StorageMarketActorAddr). 778 WithCaller(builtin.SystemActorAddr, builtin.InitActorCodeID). 779 WithActorType(root, builtin.VerifiedRegistryActorCodeID) 780 781 rt := builder.Build(t) 782 783 actor := verifRegActorTestHarness{t: t, rootkey: root} 784 actor.constructAndVerify(rt) 785 786 return rt, &actor 787 } 788 789 func (h *verifRegActorTestHarness) constructAndVerify(rt *mock.Runtime) { 790 rt.ExpectValidateCallerAddr(builtin.SystemActorAddr) 791 ret := rt.Call(h.Constructor, &h.rootkey) 792 require.Nil(h.t, ret) 793 rt.Verify() 794 } 795 796 func (h *verifRegActorTestHarness) state(rt *mock.Runtime) *verifreg.State { 797 var st verifreg.State 798 rt.GetState(&st) 799 return &st 800 } 801 802 func (h *verifRegActorTestHarness) checkState(rt *mock.Runtime) { 803 st := h.state(rt) 804 _, msgs := verifreg.CheckStateInvariants(st, rt.AdtStore()) 805 assert.True(h.t, msgs.IsEmpty(), strings.Join(msgs.Messages(), "\n")) 806 } 807 808 func (h *verifRegActorTestHarness) addNewVerifier(rt *mock.Runtime, a address.Address, allowance verifreg.DataCap) *verifreg.AddVerifierParams { 809 v := mkVerifierParams(a, allowance) 810 h.addVerifier(rt, v.Address, v.Allowance) 811 return v 812 } 813 814 func (h *verifRegActorTestHarness) generateAndAddVerifierAndVerifiedClient(rt *mock.Runtime, verifierAddr address.Address, clientAddr address.Address, 815 verifierAllowance verifreg.DataCap, clientAllowance verifreg.DataCap) { 816 817 // add verifier with greater allowance than client 818 verifier := mkVerifierParams(verifierAddr, verifierAllowance) 819 verifier.Allowance = big.Add(verifier.Allowance, clientAllowance) 820 h.addVerifier(rt, verifier.Address, verifier.Allowance) 821 822 // add client 823 client := mkClientParams(clientAddr, clientAllowance) 824 client.Allowance = clientAllowance 825 h.addVerifiedClient(rt, verifier.Address, client.Address, client.Allowance) 826 } 827 828 func (h *verifRegActorTestHarness) addVerifiedClient(rt *mock.Runtime, verifier, client address.Address, allowance verifreg.DataCap) { 829 rt.SetCaller(verifier, builtin.VerifiedRegistryActorCodeID) 830 rt.ExpectValidateCallerAny() 831 832 params := &verifreg.AddVerifiedClientParams{Address: client, Allowance: allowance} 833 rt.Call(h.AddVerifiedClient, params) 834 rt.Verify() 835 836 clientIdAddr, found := rt.GetIdAddr(client) 837 require.True(h.t, found) 838 assert.EqualValues(h.t, allowance, h.getClientCap(rt, clientIdAddr)) 839 } 840 841 func (h *verifRegActorTestHarness) addVerifier(rt *mock.Runtime, verifier address.Address, datacap verifreg.DataCap) { 842 param := verifreg.AddVerifierParams{Address: verifier, Allowance: datacap} 843 844 rt.ExpectValidateCallerAddr(h.rootkey) 845 846 rt.SetCaller(h.rootkey, builtin.VerifiedRegistryActorCodeID) 847 ret := rt.Call(h.AddVerifier, ¶m) 848 rt.Verify() 849 850 verifierIdAddr, found := rt.GetIdAddr(verifier) 851 require.True(h.t, found) 852 assert.Nil(h.t, ret) 853 assert.EqualValues(h.t, datacap, h.getVerifierCap(rt, verifierIdAddr)) 854 } 855 856 func (h *verifRegActorTestHarness) removeVerifier(rt *mock.Runtime, verifier address.Address) { 857 rt.ExpectValidateCallerAddr(h.rootkey) 858 859 rt.SetCaller(h.rootkey, builtin.VerifiedRegistryActorCodeID) 860 ret := rt.Call(h.RemoveVerifier, &verifier) 861 rt.Verify() 862 863 require.Nil(h.t, ret) 864 h.assertVerifierRemoved(rt, verifier) 865 } 866 867 type capExpectation struct { 868 expectedCap verifreg.DataCap 869 removed bool 870 } 871 872 func (h *verifRegActorTestHarness) useBytes(rt *mock.Runtime, a address.Address, dealSize verifreg.DataCap, expectedCap *capExpectation) { 873 rt.ExpectValidateCallerAddr(builtin.StorageMarketActorAddr) 874 rt.SetCaller(builtin.StorageMarketActorAddr, builtin.StorageMinerActorCodeID) 875 876 param := &verifreg.UseBytesParams{Address: a, DealSize: dealSize} 877 878 ret := rt.Call(h.UseBytes, param) 879 rt.Verify() 880 assert.Nil(h.t, ret) 881 882 clientIdAddr, found := rt.GetIdAddr(a) 883 require.True(h.t, found) 884 885 // assert client cap now 886 if expectedCap.removed { 887 h.assertClientRemoved(rt, clientIdAddr) 888 } else { 889 assert.EqualValues(h.t, expectedCap.expectedCap, h.getClientCap(rt, clientIdAddr)) 890 } 891 } 892 893 func (h *verifRegActorTestHarness) restoreBytes(rt *mock.Runtime, a address.Address, dealSize verifreg.DataCap, expectedCap *capExpectation) { 894 rt.ExpectValidateCallerAddr(builtin.StorageMarketActorAddr) 895 rt.SetCaller(builtin.StorageMarketActorAddr, builtin.StorageMinerActorCodeID) 896 897 // call RestoreBytes 898 param := &verifreg.RestoreBytesParams{Address: a, DealSize: dealSize} 899 ret := rt.Call(h.RestoreBytes, param) 900 rt.Verify() 901 assert.Nil(h.t, ret) 902 903 clientIdAddr, found := rt.GetIdAddr(a) 904 require.True(h.t, found) 905 906 // assert client cap now 907 assert.EqualValues(h.t, expectedCap.expectedCap, h.getClientCap(rt, clientIdAddr)) 908 } 909 910 func (h *verifRegActorTestHarness) getVerifierCap(rt *mock.Runtime, a address.Address) verifreg.DataCap { 911 var st verifreg.State 912 rt.GetState(&st) 913 914 v, err := adt.AsMap(adt.AsStore(rt), st.Verifiers, builtin.DefaultHamtBitwidth) 915 require.NoError(h.t, err) 916 917 var dc verifreg.DataCap 918 found, err := v.Get(abi.AddrKey(a), &dc) 919 require.NoError(h.t, err) 920 require.True(h.t, found) 921 return dc 922 } 923 924 func (h *verifRegActorTestHarness) getClientCap(rt *mock.Runtime, a address.Address) verifreg.DataCap { 925 var st verifreg.State 926 rt.GetState(&st) 927 928 v, err := adt.AsMap(adt.AsStore(rt), st.VerifiedClients, builtin.DefaultHamtBitwidth) 929 require.NoError(h.t, err) 930 931 var dc verifreg.DataCap 932 found, err := v.Get(abi.AddrKey(a), &dc) 933 require.NoError(h.t, err) 934 require.True(h.t, found) 935 return dc 936 } 937 938 func (h *verifRegActorTestHarness) assertVerifierRemoved(rt *mock.Runtime, a address.Address) { 939 var st verifreg.State 940 rt.GetState(&st) 941 942 v, err := adt.AsMap(adt.AsStore(rt), st.Verifiers, builtin.DefaultHamtBitwidth) 943 require.NoError(h.t, err) 944 945 var dc verifreg.DataCap 946 found, err := v.Get(abi.AddrKey(a), &dc) 947 require.NoError(h.t, err) 948 assert.False(h.t, found) 949 } 950 951 func (h *verifRegActorTestHarness) assertClientRemoved(rt *mock.Runtime, a address.Address) { 952 var st verifreg.State 953 rt.GetState(&st) 954 955 v, err := adt.AsMap(adt.AsStore(rt), st.VerifiedClients, builtin.DefaultHamtBitwidth) 956 require.NoError(h.t, err) 957 958 var dc verifreg.DataCap 959 found, err := v.Get(abi.AddrKey(a), &dc) 960 require.NoError(h.t, err) 961 assert.False(h.t, found) 962 } 963 964 func mkVerifierParams(a address.Address, allowance verifreg.DataCap) *verifreg.AddVerifierParams { 965 return &verifreg.AddVerifierParams{Address: a, Allowance: allowance} 966 } 967 968 func mkClientParams(a address.Address, cap verifreg.DataCap) *verifreg.AddVerifiedClientParams { 969 return &verifreg.AddVerifiedClientParams{Address: a, Allowance: cap} 970 }