Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement RegisterSubnetValidatorTx #3300

Draft
wants to merge 87 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
1857cb9
[vms/platformvm] Add tracking of a Subnet manager
dhrubabasu Jun 18, 2024
4d11a29
Merge branch 'master' into store-warp-addressed-call-pair
dhrubabasu Jun 18, 2024
90a38ff
Update vms/platformvm/state/diff.go
dhrubabasu Jun 18, 2024
f60e4ea
nit
dhrubabasu Jun 18, 2024
1ca0caf
nit
dhrubabasu Jun 20, 2024
1cd2428
nit
dhrubabasu Jun 20, 2024
3587c32
nit
dhrubabasu Jun 20, 2024
ec16c11
[vms/platformvm] Cleanup execution config tests
dhrubabasu Jun 20, 2024
f52cbbe
Merge branch 'master' into cleanup-execution-config-test
dhrubabasu Jun 20, 2024
076b1f0
nit
dhrubabasu Jun 20, 2024
df5ca64
nit
dhrubabasu Jun 20, 2024
dcc056b
Merge branch 'master' into cleanup-execution-config-test
dhrubabasu Jun 20, 2024
3279764
nit
dhrubabasu Jun 21, 2024
911a167
mark as helper
dhrubabasu Jun 21, 2024
ddf3392
Merge branch 'master' into cleanup-execution-config-test
dhrubabasu Jun 21, 2024
25802a8
merged
dhrubabasu Jun 21, 2024
01b854a
reduce diff
dhrubabasu Jun 21, 2024
f79e0c7
add write
dhrubabasu Jun 24, 2024
1eda29c
merged
dhrubabasu Jun 24, 2024
3fa1306
nits
dhrubabasu Jun 25, 2024
16ffe7b
nit
dhrubabasu Jun 25, 2024
3035064
nits
dhrubabasu Jun 25, 2024
62ece94
Merge branch 'master' into store-warp-addressed-call-pair
dhrubabasu Jun 25, 2024
333a41e
fix UT
dhrubabasu Jun 25, 2024
520ac91
add UTs
dhrubabasu Jun 25, 2024
db5f197
lint
dhrubabasu Jun 25, 2024
574a120
nit
dhrubabasu Jun 26, 2024
501beb1
nit
dhrubabasu Jun 26, 2024
ab5c23b
add test for cache
dhrubabasu Jul 17, 2024
e0d0a00
Merge branch 'master' into store-warp-addressed-call-pair
dhrubabasu Jul 17, 2024
12a1969
wip
dhrubabasu Jul 22, 2024
cda1001
table tests
dhrubabasu Jul 23, 2024
2ff46f4
Merge branch 'master' into store-warp-addressed-call-pair
dhrubabasu Jul 23, 2024
e05a514
Merge branch 'store-warp-addressed-call-pair' into ConvertSubnetTx
dhrubabasu Jul 23, 2024
7ab0094
wip
dhrubabasu Jul 23, 2024
79e84b1
wip
dhrubabasu Jul 23, 2024
264a73f
merged
dhrubabasu Jul 23, 2024
1340a51
nits
dhrubabasu Jul 23, 2024
62f6d78
nits
dhrubabasu Jul 23, 2024
6e54ba7
nits
dhrubabasu Jul 23, 2024
68e621d
passing
dhrubabasu Jul 23, 2024
8e9f406
add tests
dhrubabasu Jul 23, 2024
dd08695
reduce scope
dhrubabasu Jul 23, 2024
3042de2
nit
dhrubabasu Jul 23, 2024
9b8aa4a
merged
dhrubabasu Aug 5, 2024
1d72e1b
nits
dhrubabasu Aug 5, 2024
5126df9
merged
dhrubabasu Aug 5, 2024
909a24c
Etna
dhrubabasu Aug 5, 2024
c1299c8
nit
dhrubabasu Aug 5, 2024
a2d0968
nit
dhrubabasu Aug 5, 2024
aa6b6f6
Implement SoV data struct
dhrubabasu Aug 11, 2024
be79d4c
Merge branch 'master' into disable-permissioned-subnet-txs-post-manager
dhrubabasu Aug 11, 2024
367cf42
disable CreateChainTx
dhrubabasu Aug 11, 2024
a14f140
pass CI
dhrubabasu Aug 12, 2024
eed7d1a
wire in validatorWeightDiffsDB and validatorPublicKeyDiffsDB
dhrubabasu Aug 12, 2024
30240fc
wip
dhrubabasu Aug 13, 2024
9fe5414
passing for now
dhrubabasu Aug 13, 2024
413a7a9
Merge branch 'master' into disable-permissioned-subnet-txs-post-manager
dhrubabasu Aug 13, 2024
c988391
nit
dhrubabasu Aug 13, 2024
3f49097
move write
dhrubabasu Aug 13, 2024
447e326
reduce footpring
dhrubabasu Aug 13, 2024
f343fa9
wip
dhrubabasu Aug 14, 2024
b23b654
nit
dhrubabasu Aug 14, 2024
952fd7f
nit
dhrubabasu Aug 14, 2024
db18027
nit
dhrubabasu Aug 14, 2024
e019360
Merge branch 'master' into disable-permissioned-subnet-txs-post-manager
dhrubabasu Aug 14, 2024
43b2b53
merged
dhrubabasu Aug 14, 2024
fe4f3d6
Merge branch 'disable-permissioned-subnet-txs-post-manager' into Conv…
dhrubabasu Aug 14, 2024
ddf94a4
RemoveSubnet
dhrubabasu Aug 14, 2024
4a5fecb
Merge branch 'disable-permissioned-subnet-txs-post-manager' into Conv…
dhrubabasu Aug 14, 2024
643ddbd
fix test
dhrubabasu Aug 14, 2024
215821f
Merge branch 'disable-permissioned-subnet-txs-post-manager' into Conv…
dhrubabasu Aug 14, 2024
bdc015d
wip e2e
dhrubabasu Aug 14, 2024
d1652c0
fix build
dhrubabasu Aug 14, 2024
4fb9e17
wip
dhrubabasu Aug 14, 2024
2555a6a
nit
dhrubabasu Aug 14, 2024
751bdea
nit
dhrubabasu Aug 14, 2024
1c91b02
nit
dhrubabasu Aug 14, 2024
82ce5d0
finish e2e
dhrubabasu Aug 14, 2024
4c2205e
nit
dhrubabasu Aug 14, 2024
0ba141d
nit
dhrubabasu Aug 14, 2024
e537d23
nit
dhrubabasu Aug 14, 2024
f18163b
Merge branch 'ConvertSubnetTx' into sov-data-struct
dhrubabasu Aug 15, 2024
35e0580
wip
dhrubabasu Aug 15, 2024
a61fb06
Merge branch 'ConvertSubnetTx' into sov-data-struct
dhrubabasu Aug 15, 2024
d3944b3
merged
dhrubabasu Aug 15, 2024
8cb82af
wip
dhrubabasu Aug 15, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 104 additions & 0 deletions tests/e2e/p/permissionless_layer_one.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
// Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.

package p

import (
"time"

"github.com/stretchr/testify/require"

"github.com/ava-labs/avalanchego/api/info"
"github.com/ava-labs/avalanchego/ids"
"github.com/ava-labs/avalanchego/tests/fixture/e2e"
"github.com/ava-labs/avalanchego/utils/constants"
"github.com/ava-labs/avalanchego/vms/platformvm"
"github.com/ava-labs/avalanchego/vms/secp256k1fx"

ginkgo "github.com/onsi/ginkgo/v2"
)

var _ = e2e.DescribePChain("[Permissionless L1]", func() {
tc := e2e.NewTestContext()
require := require.New(tc)

ginkgo.It("e2e flow", func() {
env := e2e.GetEnv(tc)

nodeURI := env.GetRandomNodeURI()

infoClient := info.NewClient(nodeURI.URI)

tc.By("get upgrade config")
upgrades, err := infoClient.Upgrades(tc.DefaultContext())
require.NoError(err)

now := time.Now()
if !upgrades.IsEtnaActivated(now) {
ginkgo.Skip("Etna is not activated. Permissionless L1s are enabled post-Etna, skipping test.")
}

keychain := env.NewKeychain(1)
baseWallet := e2e.NewWallet(tc, keychain, nodeURI)

pWallet := baseWallet.P()
pClient := platformvm.NewClient(nodeURI.URI)

owner := &secp256k1fx.OutputOwners{
Threshold: 1,
Addrs: []ids.ShortID{
keychain.Keys[0].Address(),
},
}

var subnetID ids.ID
tc.By("create a permissioned subnet", func() {
subnetTx, err := pWallet.IssueCreateSubnetTx(
owner,
tc.WithDefaultContext(),
)

subnetID = subnetTx.ID()
require.NoError(err)
require.NotEqual(subnetID, constants.PrimaryNetworkID)

res, err := pClient.GetSubnet(tc.DefaultContext(), subnetID)
require.NoError(err)

require.Equal(platformvm.GetSubnetClientResponse{
IsPermissioned: true,
ControlKeys: []ids.ShortID{
keychain.Keys[0].Address(),
},
Threshold: 1,
}, res)
})

chainID := ids.GenerateTestID()
address := []byte{'a', 'd', 'd', 'r', 'e', 's', 's'}
tc.By("convert subnet to permissionless L1", func() {
convertSubnetTx, err := pWallet.IssueConvertSubnetTx(
subnetID,
chainID,
address,
tc.WithDefaultContext(),
)
require.NoError(err)

require.NoError(platformvm.AwaitTxAccepted(pClient, tc.DefaultContext(), convertSubnetTx.ID(), 100*time.Millisecond))

res, err := pClient.GetSubnet(tc.DefaultContext(), subnetID)
require.NoError(err)

require.Equal(platformvm.GetSubnetClientResponse{
IsPermissioned: false,
ControlKeys: []ids.ShortID{
keychain.Keys[0].Address(),
},
Threshold: 1,
ManagerChainID: chainID,
ManagerAddress: address,
}, res)
})
})
})
93 changes: 93 additions & 0 deletions vms/components/fee/validator.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
// Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.

package fee

import (
"fmt"

"github.com/holiman/uint256"
)

type ValidatorState struct {
Current Gas
Target Gas
Capacity Gas
Excess Gas
MinFee GasPrice
K Gas
}

func (v ValidatorState) CurrentFeeRate() GasPrice {
return v.MinFee.MulExp(v.Excess, v.K)
}

func (v ValidatorState) CalculateContinuousFee(seconds uint64) uint64 {
if v.Current == v.Target {
return uint64(v.MinFee.MulExp(v.Excess, v.K)) * seconds
}

uint256.NewInt(uint64(v.Excess))

var totalFee uint64
if v.Current < v.Target {
secondsTillExcessIsZero := uint64(v.Excess / (v.Target - v.Current))

if secondsTillExcessIsZero < seconds {
totalFee += uint64(v.MinFee) * (seconds - secondsTillExcessIsZero)
seconds = secondsTillExcessIsZero
}
}

x := v.Excess
for i := uint64(1); i <= seconds; i++ {
if v.Current < v.Target {
x = x.SubPerSecond(v.Target-v.Current, 1)
} else {
x = x.AddPerSecond(v.Current-v.Target, 1)
}

if x == 0 {
totalFee += uint64(v.MinFee)
continue
}

totalFee += uint64(v.MinFee.MulExp(x, v.K))
}

return totalFee
}

// Returns the first number n where CalculateContinuousFee(n) >= balance
func (v ValidatorState) CalculateTimeTillContinuousFee(balance uint64) (uint64, uint64) {
// Lower bound can be derived from [MinFee].
n := balance / uint64(v.MinFee)
interval := n

numIters := 0
for {
fmt.Printf("n=%d", n)
feeAtN := v.CalculateContinuousFee(n)
feeBeforeN := v.CalculateContinuousFee(n - 1)
if feeAtN == balance {
return n, uint64(numIters)
}

if feeAtN > balance && feeBeforeN < balance {
return n, uint64(numIters)
}

if feeAtN > balance {
if interval > 1 {
interval /= 2
}
n -= interval
}

if feeAtN < balance {
n += interval
}

numIters++
}
}
124 changes: 124 additions & 0 deletions vms/components/fee/validator_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
// Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.

package fee

import (
"testing"

"github.com/stretchr/testify/require"
)

func Test_ValidatorState_CalculateFee(t *testing.T) {
var (
minute uint64 = 60
hour = 60 * minute
day = 24 * hour
week = 7 * day
)

tests := []struct {
name string
initial ValidatorState
seconds uint64
expected uint64
}{
{
name: "excess=0, current<target, minute",
initial: ValidatorState{
Current: 10,
Target: 10_000,
Capacity: 20_000,
Excess: 0,
MinFee: 2_048,
K: 60_480_000_000,
},
seconds: minute,
expected: 122_880,
},
{
name: "excess=0, current>target, minute",
initial: ValidatorState{
Current: 15_000,
Target: 10_000,
Capacity: 20_000,
Excess: 0,
MinFee: 2_048,
K: 60_480_000_000,
},
seconds: minute,
expected: 122_880,
},
{
name: "excess=K, current=target, minute",
initial: ValidatorState{
Current: 10_000,
Target: 10_000,
Capacity: 20_000,
Excess: 60_480_000_000,
MinFee: 2_048,
K: 60_480_000_000,
},
seconds: minute,
expected: 334_020,
},
{
name: "excess=0, current>target, day",
initial: ValidatorState{
Current: 15_000,
Target: 10_000,
Capacity: 20_000,
Excess: 0,
MinFee: 2048,
K: 60_480_000_000,
},
seconds: day,
expected: 177_538_111,
},
{
name: "excess=K, current=target, day",
initial: ValidatorState{
Current: 10_000,
Target: 10_000,
Capacity: 20_000,
Excess: 60_480_000_000,
MinFee: 2_048,
K: 60_480_000_000,
},
seconds: day,
expected: 480_988_800,
},
{
name: "excess hits 0 during, current<target, day",
initial: ValidatorState{
Current: 9_000,
Target: 10_000,
Capacity: 20_000,
Excess: Gas(6 * hour * 1_000),
MinFee: 2048,
K: 60_480_000_000,
},
seconds: day,
expected: 176_947_200,
},
{
name: "excess=0, current>target, week",
initial: ValidatorState{
Current: 15_000,
Target: 10_000,
Capacity: 20_000,
Excess: 0,
MinFee: 2048,
K: 60_480_000_000,
},
seconds: week,
expected: 1_269_816_464,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
actual := test.initial.CalculateContinuousFee(test.seconds)
require.Equal(t, test.expected, actual)
})
}
}
1 change: 1 addition & 0 deletions vms/platformvm/block/codec.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ func init() {
txs.RegisterUnsignedTxsTypes(c),
RegisterBanffBlockTypes(c),
txs.RegisterDurangoUnsignedTxsTypes(c),
txs.RegisterEtnaUnsignedTxsTypes(c),
)
}

Expand Down
27 changes: 21 additions & 6 deletions vms/platformvm/block/executor/block.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,25 +29,40 @@ func (*Block) ShouldVerifyWithContext(context.Context) (bool, error) {
return true, nil
}

func (b *Block) VerifyWithContext(_ context.Context, ctx *smblock.Context) error {
func (b *Block) VerifyWithContext(ctx context.Context, smCtx *smblock.Context) error {
pChainHeight := uint64(0)
if ctx != nil {
pChainHeight = ctx.PChainHeight
if smCtx != nil {
pChainHeight = smCtx.PChainHeight
}

blkID := b.ID()
if blkState, ok := b.manager.blkIDToState[blkID]; ok {
if !blkState.verifiedHeights.Contains(pChainHeight) {
// PlatformVM blocks are currently valid regardless of the ProposerVM's
// PChainHeight. If this changes, those validity checks should be done prior
// to adding [pChainHeight] to [verifiedHeights].
if err := b.Visit(&warpBlockVerifier{
ctx: ctx,
chainCtx: b.manager.ctx,
state: b.manager.state,
pChainHeight: pChainHeight,
}); err != nil {
return err
}

blkState.verifiedHeights.Add(pChainHeight)
}

// This block has already been verified.
return nil
}

if err := b.Visit(&warpBlockVerifier{
ctx: ctx,
chainCtx: b.manager.ctx,
state: b.manager.state,
pChainHeight: pChainHeight,
}); err != nil {
return err
}

return b.Visit(&verifier{
backend: b.manager.backend,
txExecutorBackend: b.manager.txExecutorBackend,
Expand Down
Loading
Loading