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 ConvertSubnetTx #3217

Merged
merged 129 commits into from
Sep 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
129 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
be79d4c
Merge branch 'master' into disable-permissioned-subnet-txs-post-manager
dhrubabasu Aug 11, 2024
367cf42
disable CreateChainTx
dhrubabasu Aug 11, 2024
413a7a9
Merge branch 'master' into disable-permissioned-subnet-txs-post-manager
dhrubabasu Aug 13, 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
35e0580
wip
dhrubabasu Aug 15, 2024
b42de99
merged
dhrubabasu Aug 19, 2024
4a1ca5c
minimize
dhrubabasu Aug 19, 2024
0b15984
nit
dhrubabasu Aug 19, 2024
99378b4
reduce diff
dhrubabasu Aug 19, 2024
1684fdb
cleanup e2e
dhrubabasu Aug 19, 2024
22ac121
Merge branch 'master' into ConvertSubnetTx
dhrubabasu Aug 19, 2024
a8524ba
cleanup
dhrubabasu Aug 19, 2024
b5df28b
cap address size to 4096
dhrubabasu Aug 19, 2024
bed839d
skip correctly
dhrubabasu Aug 19, 2024
4adc17e
nit
dhrubabasu Aug 19, 2024
4edc421
Merge branch 'master' into ConvertSubnetTx
dhrubabasu Aug 20, 2024
92a7187
cleanup complexity
dhrubabasu Aug 20, 2024
144dad2
fix
dhrubabasu Aug 20, 2024
1503bd4
merged
dhrubabasu Aug 20, 2024
4afac28
merged
dhrubabasu Aug 22, 2024
41127c9
nit
dhrubabasu Aug 22, 2024
13238f1
nit
dhrubabasu Aug 22, 2024
fdc1069
nit
dhrubabasu Aug 22, 2024
85ce497
nit
dhrubabasu Aug 22, 2024
499f19c
Separate codec registries by upgrade
StephenButtolph Sep 2, 2024
dfaff2e
merged
StephenButtolph Sep 2, 2024
6b26b49
nit
StephenButtolph Sep 2, 2024
aeddd28
Merge branch 'separate-codec-by-upgrade' into ConvertSubnetTx
StephenButtolph Sep 2, 2024
3dcdcda
Update naming
StephenButtolph Sep 2, 2024
64a6c53
Use hex output
StephenButtolph Sep 2, 2024
ad664a0
Reduce diff
StephenButtolph Sep 2, 2024
186cf8d
Improve json format
StephenButtolph Sep 2, 2024
de97114
Improve tests
StephenButtolph Sep 2, 2024
40a2cae
Fix error
StephenButtolph Sep 2, 2024
b0ce060
cleanup test
StephenButtolph Sep 2, 2024
0ecfc50
remove static fee support
StephenButtolph Sep 2, 2024
06534fc
reduce diff
StephenButtolph Sep 2, 2024
a44b68a
nit
StephenButtolph Sep 2, 2024
68a6e24
fix comment
StephenButtolph Sep 2, 2024
61640da
Add builder test
StephenButtolph Sep 2, 2024
1619e79
nit
StephenButtolph Sep 2, 2024
f536353
Remove usage of mocks
StephenButtolph Sep 3, 2024
f6339b5
nit
StephenButtolph Sep 3, 2024
91338cb
fix test
StephenButtolph Sep 3, 2024
f602280
Support unmarshalling of json byte slices
StephenButtolph Sep 3, 2024
c3b076b
standardize json and add tests
StephenButtolph Sep 3, 2024
4328bac
fix marshal tests
StephenButtolph Sep 3, 2024
805ae43
fix marshal more tests
StephenButtolph Sep 3, 2024
518cf19
fix even marshal more tests
StephenButtolph Sep 3, 2024
26b3702
merged
StephenButtolph Sep 3, 2024
e1f55a5
Nit use var
StephenButtolph Sep 3, 2024
8895f27
Cleanup serialization tests
StephenButtolph Sep 4, 2024
aa7f222
Add comment
StephenButtolph Sep 4, 2024
91c8619
var block
StephenButtolph Sep 4, 2024
b5638e0
reorder
StephenButtolph Sep 4, 2024
4831205
Merge branch 'master' into ConvertSubnetTx
StephenButtolph Sep 4, 2024
df3fb4c
embed json
StephenButtolph Sep 4, 2024
8f8ebc9
Merge branch 'ConvertSubnetTx' of github.com:ava-labs/avalanchego int…
StephenButtolph Sep 4, 2024
d87a472
huh tabs are os dependent?
StephenButtolph Sep 4, 2024
ff95e5b
I misread the error, it was returns
StephenButtolph Sep 4, 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
101 changes: 101 additions & 0 deletions tests/e2e/p/permissionless_layer_one.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
// 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("creates a Permissionless L1", func() {
env := e2e.GetEnv(tc)
nodeURI := env.GetRandomNodeURI()
infoClient := info.NewClient(nodeURI.URI)

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

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

keychain := env.NewKeychain()
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(),
},
}

tc.By("issuing a CreateSubnetTx")
subnetTx, err := pWallet.IssueCreateSubnetTx(
owner,
tc.WithDefaultContext(),
)
require.NoError(err)

tc.By("verifying a Permissioned Subnet was successfully created")
subnetID := subnetTx.ID()
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("issuing a ConvertSubnetTx")
_, err = pWallet.IssueConvertSubnetTx(
subnetID,
chainID,
address,
tc.WithDefaultContext(),
)
require.NoError(err)

tc.By("verifying the Permissioned Subnet was converted to a Permissionless L1")
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)
})
})
7 changes: 7 additions & 0 deletions vms/platformvm/block/codec.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ func init() {
RegisterApricotTypes(c),
RegisterBanffTypes(c),
RegisterDurangoTypes(c),
RegisterEtnaTypes(c),
)
}

Expand Down Expand Up @@ -79,3 +80,9 @@ func RegisterBanffTypes(targetCodec linearcodec.Codec) error {
func RegisterDurangoTypes(targetCodec linearcodec.Codec) error {
return txs.RegisterDurangoTypes(targetCodec)
}

// RegisterEtnaTypes registers the type information for blocks that were valid
// during the Etna series of upgrades.
func RegisterEtnaTypes(targetCodec linearcodec.Codec) error {
return txs.RegisterEtnaTypes(targetCodec)
}
5 changes: 5 additions & 0 deletions vms/platformvm/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,9 @@ type GetSubnetClientResponse struct {
Locktime uint64
// subnet transformation tx ID for a permissionless subnet
SubnetTransformationTxID ids.ID
// subnet manager information for a permissionless L1
ManagerChainID ids.ID
ManagerAddress []byte
}

func (c *client) GetSubnet(ctx context.Context, subnetID ids.ID, options ...rpc.Option) (GetSubnetClientResponse, error) {
Expand All @@ -256,6 +259,8 @@ func (c *client) GetSubnet(ctx context.Context, subnetID ids.ID, options ...rpc.
Threshold: uint32(res.Threshold),
Locktime: uint64(res.Locktime),
SubnetTransformationTxID: res.SubnetTransformationTxID,
ManagerChainID: res.ManagerChainID,
ManagerAddress: res.ManagerAddress,
}, nil
}

Expand Down
7 changes: 7 additions & 0 deletions vms/platformvm/metrics/tx_metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,13 @@ func (m *txMetrics) TransferSubnetOwnershipTx(*txs.TransferSubnetOwnershipTx) er
return nil
}

func (m *txMetrics) ConvertSubnetTx(*txs.ConvertSubnetTx) error {
m.numTxs.With(prometheus.Labels{
txLabel: "convert_subnet",
}).Inc()
return nil
}

func (m *txMetrics) BaseTx(*txs.BaseTx) error {
m.numTxs.With(prometheus.Labels{
txLabel: "base",
Expand Down
18 changes: 17 additions & 1 deletion vms/platformvm/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import (
"github.com/ava-labs/avalanchego/vms/platformvm/status"
"github.com/ava-labs/avalanchego/vms/platformvm/txs"
"github.com/ava-labs/avalanchego/vms/secp256k1fx"
"github.com/ava-labs/avalanchego/vms/types"

avajson "github.com/ava-labs/avalanchego/utils/json"
safemath "github.com/ava-labs/avalanchego/utils/math"
Expand Down Expand Up @@ -436,8 +437,11 @@ type GetSubnetResponse struct {
ControlKeys []string `json:"controlKeys"`
Threshold avajson.Uint32 `json:"threshold"`
Locktime avajson.Uint64 `json:"locktime"`
// subnet transformation tx ID for a permissionless subnet
// subnet transformation tx ID for an elastic subnet
SubnetTransformationTxID ids.ID `json:"subnetTransformationTxID"`
// subnet manager information for a permissionless L1
ManagerChainID ids.ID `json:"managerChainID"`
ManagerAddress types.JSONByteSlice `json:"managerAddress"`
}

func (s *Service) GetSubnet(_ *http.Request, args *GetSubnetArgs, response *GetSubnetResponse) error {
Expand Down Expand Up @@ -486,6 +490,18 @@ func (s *Service) GetSubnet(_ *http.Request, args *GetSubnetArgs, response *GetS
return err
}

switch chainID, addr, err := s.vm.state.GetSubnetManager(args.SubnetID); err {
case nil:
response.IsPermissioned = false
response.ManagerChainID = chainID
response.ManagerAddress = addr
case database.ErrNotFound:
response.ManagerChainID = ids.Empty
response.ManagerAddress = []byte(nil)
default:
return err
}

return nil
}

Expand Down
13 changes: 12 additions & 1 deletion vms/platformvm/txs/codec.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,10 @@ func init() {

c.SkipRegistrations(4)

errs.Add(RegisterDurangoTypes(c))
errs.Add(
RegisterDurangoTypes(c),
RegisterEtnaTypes(c),
)
}

Codec = codec.NewDefaultManager()
Expand Down Expand Up @@ -114,3 +117,11 @@ func RegisterDurangoTypes(targetCodec linearcodec.Codec) error {
targetCodec.RegisterType(&BaseTx{}),
)
}

// RegisterEtnaTypes registers the type information for transactions that
// were valid during the Etna series of upgrades.
func RegisterEtnaTypes(targetCodec linearcodec.Codec) error {
return errors.Join(
targetCodec.RegisterType(&ConvertSubnetTx{}),
)
}
64 changes: 64 additions & 0 deletions vms/platformvm/txs/convert_subnet_tx.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
// Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.

package txs

import (
"errors"

"github.com/ava-labs/avalanchego/ids"
"github.com/ava-labs/avalanchego/snow"
"github.com/ava-labs/avalanchego/utils/constants"
"github.com/ava-labs/avalanchego/vms/components/verify"
"github.com/ava-labs/avalanchego/vms/types"
)

const MaxSubnetAddressLength = 4096

var (
_ UnsignedTx = (*TransferSubnetOwnershipTx)(nil)

ErrConvertPermissionlessSubnet = errors.New("cannot convert a permissionless subnet")
ErrAddressTooLong = errors.New("address is too long")
)

type ConvertSubnetTx struct {
// Metadata, inputs and outputs
BaseTx `serialize:"true"`
// ID of the Subnet to transform
Subnet ids.ID `serialize:"true" json:"subnetID"`
// Chain where the Subnet manager lives
ChainID ids.ID `serialize:"true" json:"chainID"`
// Address of the Subnet manager
Address types.JSONByteSlice `serialize:"true" json:"address"`
// Authorizes this conversion
SubnetAuth verify.Verifiable `serialize:"true" json:"subnetAuthorization"`
}

func (tx *ConvertSubnetTx) SyntacticVerify(ctx *snow.Context) error {
switch {
case tx == nil:
return ErrNilTx
case tx.SyntacticallyVerified:
// already passed syntactic verification
return nil
case tx.Subnet == constants.PrimaryNetworkID:
return ErrConvertPermissionlessSubnet
case len(tx.Address) > MaxSubnetAddressLength:
return ErrAddressTooLong
}

if err := tx.BaseTx.SyntacticVerify(ctx); err != nil {
return err
}
if err := tx.SubnetAuth.Verify(); err != nil {
return err
}

tx.SyntacticallyVerified = true
return nil
}

func (tx *ConvertSubnetTx) Visit(visitor Visitor) error {
return visitor.ConvertSubnetTx(tx)
}
Loading
Loading