Skip to content
This repository has been archived by the owner on Jun 6, 2023. It is now read-only.

Commit

Permalink
feat: Allow VerifiedClient DataCap to be topped up (#1390)
Browse files Browse the repository at this point in the history
* feat: Allow VerifiedClient DataCap to be topped up
* Modify tests

Co-authored-by: ZenGround0 <ZenGround0@users.noreply.github.com>
  • Loading branch information
placer14 and ZenGround0 committed Apr 27, 2021
1 parent dfeeab7 commit 9872d65
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 44 deletions.
19 changes: 10 additions & 9 deletions actors/builtin/verifreg/verified_registry_actor.go
Original file line number Diff line number Diff line change
Expand Up @@ -182,18 +182,19 @@ func (a Actor) AddVerifiedClient(rt runtime.Runtime, params *AddVerifiedClientPa
err = verifiers.Put(abi.AddrKey(verifier), &newVerifierCap)
builtin.RequireNoErr(rt, err, exitcode.ErrIllegalState, "failed to update new verifier cap (%d) for %v", newVerifierCap, verifier)

// This is a one-time, upfront allocation.
// This allowance cannot be changed by calls to AddVerifiedClient as long as the client has not been removed.
// If parties need more allowance, they need to create a new verified client or use up the the current allowance
// and then create a new verified client.
found, err = verifiedClients.Get(abi.AddrKey(client), nil)
var clientCap DataCap
found, err = verifiedClients.Get(abi.AddrKey(client), &clientCap)
builtin.RequireNoErr(rt, err, exitcode.ErrIllegalState, "failed to get verified client %v", client)

// if verified client exists, add allowance to existing cap
// otherwise, create new client with allownace
if found {
rt.Abortf(exitcode.ErrIllegalArgument, "verified client already exists: %v", client)
clientCap = big.Add(clientCap, params.Allowance)
} else {
clientCap = params.Allowance
}

err = verifiedClients.Put(abi.AddrKey(client), &params.Allowance)
builtin.RequireNoErr(rt, err, exitcode.ErrIllegalState, "failed to add verified client %v with cap %d", client, params.Allowance)
err = verifiedClients.Put(abi.AddrKey(client), &clientCap)
builtin.RequireNoErr(rt, err, exitcode.ErrIllegalState, "failed to add verified client %v with cap %d", client, clientCap)

st.Verifiers, err = verifiers.Root()
builtin.RequireNoErr(rt, err, exitcode.ErrIllegalState, "failed to flush verifiers")
Expand Down
52 changes: 17 additions & 35 deletions actors/builtin/verifreg/verified_registry_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -251,12 +251,12 @@ func TestAddVerifiedClient(t *testing.T) {
ac.addVerifier(rt, verifier2.Address, verifier2.Allowance)

// add client 1 & 2
ac.addVerifiedClient(rt, verifier.Address, c1.Address, c1.Allowance)
ac.addVerifiedClient(rt, verifier.Address, c2.Address, c2.Allowance)
ac.addVerifiedClient(rt, verifier.Address, c1.Address, c1.Allowance, c1.Allowance)
ac.addVerifiedClient(rt, verifier.Address, c2.Address, c2.Allowance, c2.Allowance)

// add clients 3 & 4
ac.addVerifiedClient(rt, verifier2.Address, c3.Address, c3.Allowance)
ac.addVerifiedClient(rt, verifier2.Address, c4.Address, c4.Allowance)
ac.addVerifiedClient(rt, verifier2.Address, c3.Address, c3.Allowance, c3.Allowance)
ac.addVerifiedClient(rt, verifier2.Address, c4.Address, c4.Allowance, c4.Allowance)

// all clients should exist and verifiers should have no more allowance left
assert.EqualValues(t, c1.Allowance, ac.getClientCap(rt, c1.Address))
Expand All @@ -281,7 +281,7 @@ func TestAddVerifiedClient(t *testing.T) {
ac.addVerifier(rt, verifier.Address, verifier.Allowance)

// add client 1 works
ac.addVerifiedClient(rt, verifier.Address, c1.Address, c1.Allowance)
ac.addVerifiedClient(rt, verifier.Address, c1.Address, c1.Allowance, c1.Allowance)

// add client 2 fails
rt.SetCaller(verifier.Address, builtin.VerifiedRegistryActorCodeID)
Expand All @@ -308,18 +308,18 @@ func TestAddVerifiedClient(t *testing.T) {

verifier := mkVerifierParams(verifierAddr, allowance)
ac.addVerifier(rt, verifier.Address, verifier.Allowance)
ac.addVerifiedClient(rt, verifier.Address, c1.Address, c1.Allowance)
ac.addVerifiedClient(rt, verifier.Address, c1.Address, c1.Allowance, c1.Allowance)

assert.EqualValues(t, clientAllowance, ac.getClientCap(rt, clientIdAddr))

// adding another verified client with the same ID address now fails
// adding another verified client with the same ID address increments
// the data cap which has already been granted
c2 := mkClientParams(clientIdAddr, clientAllowance)
verifier = mkVerifierParams(verifierAddr, allowance)
ac.addVerifier(rt, verifier.Address, verifier.Allowance)

rt.ExpectAbort(exitcode.ErrIllegalArgument, func() {
ac.addVerifiedClient(rt, verifier.Address, c2.Address, c2.Allowance)
})
expectedAllowance := big.Add(c1.Allowance, c2.Allowance)
ac.addVerifiedClient(rt, verifier.Address, c2.Address, c2.Allowance, expectedAllowance)
ac.checkState(rt)
})

Expand All @@ -333,7 +333,7 @@ func TestAddVerifiedClient(t *testing.T) {
ac.addVerifier(rt, verifier.Address, verifier.Allowance)

// add client works
ac.addVerifiedClient(rt, verifier.Address, c1.Address, c1.Allowance)
ac.addVerifiedClient(rt, verifier.Address, c1.Address, c1.Allowance, c1.Allowance)
ac.checkState(rt)
})

Expand All @@ -349,7 +349,7 @@ func TestAddVerifiedClient(t *testing.T) {
rt.ExpectSend(clientNonIdAddr, builtin.MethodSend, nil, abi.NewTokenAmount(0), nil, exitcode.Ok)

rt.ExpectAbort(exitcode.ErrIllegalState, func() {
ac.addVerifiedClient(rt, verifier.Address, c1.Address, c1.Allowance)
ac.addVerifiedClient(rt, verifier.Address, c1.Address, c1.Allowance, c1.Allowance)
})
ac.checkState(rt)
})
Expand Down Expand Up @@ -397,32 +397,14 @@ func TestAddVerifiedClient(t *testing.T) {
ac.checkState(rt)
})

t.Run("fails when verified client already exists", func(t *testing.T) {
rt, ac := basicVerifRegSetup(t, root)

// add verified client with caller 1
verifier := ac.addNewVerifier(rt, verifierAddr, allowance)
client := mkClientParams(clientAddr, clientAllowance)
ac.addVerifiedClient(rt, verifier.Address, client.Address, client.Allowance)

// add verified client with caller 2
verifier2 := ac.addNewVerifier(rt, verifierAddr, allowance)
rt.SetCaller(verifier2.Address, builtin.VerifiedRegistryActorCodeID)
rt.ExpectValidateCallerAny()
rt.ExpectAbort(exitcode.ErrIllegalArgument, func() {
rt.Call(ac.AddVerifiedClient, client)
})
ac.checkState(rt)
})

t.Run("fails when root is added as a verified client", func(t *testing.T) {
rt, ac := basicVerifRegSetup(t, root)

verifier := ac.addNewVerifier(rt, verifierAddr, allowance)
client := mkClientParams(root, clientAllowance)

rt.ExpectAbort(exitcode.ErrIllegalArgument, func() {
ac.addVerifiedClient(rt, verifier.Address, client.Address, client.Allowance)
ac.addVerifiedClient(rt, verifier.Address, client.Address, client.Allowance, client.Allowance)
})
ac.checkState(rt)
})
Expand Down Expand Up @@ -822,20 +804,20 @@ func (h *verifRegActorTestHarness) generateAndAddVerifierAndVerifiedClient(rt *m
// add client
client := mkClientParams(clientAddr, clientAllowance)
client.Allowance = clientAllowance
h.addVerifiedClient(rt, verifier.Address, client.Address, client.Allowance)
h.addVerifiedClient(rt, verifier.Address, client.Address, client.Allowance, client.Allowance)
}

func (h *verifRegActorTestHarness) addVerifiedClient(rt *mock.Runtime, verifier, client address.Address, allowance verifreg.DataCap) {
func (h *verifRegActorTestHarness) addVerifiedClient(rt *mock.Runtime, verifier, client address.Address, allowanceAdded, totalAllowance verifreg.DataCap) {
rt.SetCaller(verifier, builtin.VerifiedRegistryActorCodeID)
rt.ExpectValidateCallerAny()

params := &verifreg.AddVerifiedClientParams{Address: client, Allowance: allowance}
params := &verifreg.AddVerifiedClientParams{Address: client, Allowance: allowanceAdded}
rt.Call(h.AddVerifiedClient, params)
rt.Verify()

clientIdAddr, found := rt.GetIdAddr(client)
require.True(h.t, found)
assert.EqualValues(h.t, allowance, h.getClientCap(rt, clientIdAddr))
assert.EqualValues(h.t, totalAllowance, h.getClientCap(rt, clientIdAddr))
}

func (h *verifRegActorTestHarness) addVerifier(rt *mock.Runtime, verifier address.Address, datacap verifreg.DataCap) {
Expand Down

0 comments on commit 9872d65

Please sign in to comment.