Skip to content

Commit

Permalink
[PVM] utxos Lock rewrite (#390)
Browse files Browse the repository at this point in the history
  • Loading branch information
evlekht authored Nov 1, 2024
1 parent 33cfa89 commit 10f07e6
Show file tree
Hide file tree
Showing 8 changed files with 904 additions and 445 deletions.
5 changes: 4 additions & 1 deletion vms/platformvm/fx/camino_fx.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,10 @@ type CaminoFx interface {
RecoverAddresses(msg []byte, credentials []verify.Verifiable) (secp256k1fx.RecoverMap, error)

// Verifies that Multisig aliases are on inputs are only used in supported hierarchy
VerifyMultisigOwner(outIntf, msigIntf interface{}) error
VerifyMultisigOwner(ownerIntf, msigIntf interface{}) error

// Verifies that Multisig aliases are on inputs are only used in supported hierarchy
VerifyMultisigOutputOwner(outIntf, msigIntf interface{}) error

// VerifyMultisigTransfer verifies that the specified transaction can spend the
// provided utxo with no restrictions on the destination. If the transaction
Expand Down
72 changes: 43 additions & 29 deletions vms/platformvm/fx/mock_fx.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions vms/platformvm/test/camino_defaults.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@ const (
)

var (
avaxAssetID = ids.ID{'C', 'A', 'M'}
AVAXAssetID = ids.ID{'C', 'A', 'M'}
OtherAssetID = ids.ID{'O', 'T', 'H', 'E', 'R'}
cChainID = ids.ID{'C', '-', 'C', 'H', 'A', 'I', 'N'}
xChainID = ids.ID{'X', '-', 'C', 'H', 'A', 'I', 'N'}
rewardConfig = reward.Config{
Expand Down Expand Up @@ -210,7 +211,7 @@ func Context(t *testing.T) *snow.Context {
require.NoError(t, aliaser.Alias(constants.PlatformChainID, "P"))

ctx := snow.DefaultContextTest()
ctx.AVAXAssetID = avaxAssetID
ctx.AVAXAssetID = AVAXAssetID
ctx.ChainID = constants.PlatformChainID
ctx.XChainID = xChainID
ctx.CChainID = cChainID
Expand Down
102 changes: 100 additions & 2 deletions vms/platformvm/test/expect/camino_expect.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,11 @@ import (
"github.com/ava-labs/avalanchego/vms/platformvm/test"
"github.com/ava-labs/avalanchego/vms/platformvm/txs"
"github.com/ava-labs/avalanchego/vms/secp256k1fx"
"github.com/stretchr/testify/require"
)

// TODO @evlekht prefix all funcs with corresponding diff/state/chain

func VerifyMultisigPermission(t *testing.T, s *state.MockDiff, addrs []ids.ShortID, aliases []*multisig.AliasWithNonce) {
t.Helper()
GetMultisigAliases(t, s, addrs, aliases)
Expand Down Expand Up @@ -139,14 +142,102 @@ func GetUTXOsFromInputs(t *testing.T, s *state.MockDiff, ins []*avax.Transferabl
}
}

func StateGetAllUTXOs(t *testing.T, s *state.MockState, addrs []ids.ShortID, utxos [][]*avax.UTXO) {
t.Helper()
require.Len(t, addrs, len(utxos))
seen := set.Set[ids.ID]{}
for i, addr := range addrs {
utxoIDs := []ids.ID{}
for _, utxo := range utxos[i] {
utxoID := utxo.InputID()
utxoIDs = append(utxoIDs, utxoID)
if seen.Contains(utxoID) {
continue
}
seen.Add(utxoID)
s.EXPECT().GetUTXO(utxoID).Return(utxo, nil)
}
s.EXPECT().UTXOIDs(addr.Bytes(), ids.Empty, math.MaxInt).Return(utxoIDs, nil)
}
}

// Doesn't support multisig alias yet
func StateSpendMultisig(t *testing.T, s *state.MockState, utxo *avax.UTXO) {
t.Helper()

out := utxo.Out
if lockedOut, ok := utxo.Out.(*locked.Out); ok {
out = lockedOut.TransferableOut
}
secpOut, ok := out.(*secp256k1fx.TransferOutput)
require.True(t, ok)

addrs := secpOut.OutputOwners.Addrs
for _, addr := range addrs {
s.EXPECT().GetMultisigAlias(addr).Return(nil, database.ErrNotFound)
}
}

func StateVerifyMultisigOwner(
t *testing.T,
s *state.MockState,
owner *secp256k1fx.OutputOwners,
msigAliasAddresses []ids.ShortID,
msigAliases []*multisig.AliasWithNonce,
collectAddresses bool,
) {
t.Helper()
if owner == nil {
return
}

aliases := make(map[ids.ShortID]*multisig.AliasWithNonce)
for i := range msigAliasAddresses {
aliases[msigAliasAddresses[i]] = msigAliases[i]
}

addresses := set.Set[ids.ShortID]{}

if collectAddresses {
for _, addr := range owner.Addrs {
addresses.Add(addr)
}
for _, alias := range msigAliases {
owner, ok := alias.Owners.(*secp256k1fx.OutputOwners)
require.True(t, ok)
for _, addr := range owner.Addrs {
addresses.Add(addr)
}
}
}

for _, msigAliasAddress := range msigAliasAddresses {
addresses.Add(msigAliasAddress)
}

for addr := range addresses {
if _, ok := aliases[addr]; ok {
s.EXPECT().GetMultisigAlias(addr).Return(aliases[addr], nil)
} else {
s.EXPECT().GetMultisigAlias(addr).Return(nil, database.ErrNotFound)
}
}
}

func ConsumeUTXOs(t *testing.T, s *state.MockDiff, ins []*avax.TransferableInput) {
t.Helper()
for _, in := range ins {
s.EXPECT().DeleteUTXO(in.InputID())
}
}

func ProduceUTXOs(t *testing.T, s *state.MockDiff, outs []*avax.TransferableOutput, txID ids.ID, baseOutIndex int) {
func ProduceUTXOs(
t *testing.T,
s *state.MockDiff,
outs []*avax.TransferableOutput,
txID ids.ID,
baseOutIndex int,
) {
t.Helper()
for i := range outs {
s.EXPECT().AddUTXO(&avax.UTXO{
Expand All @@ -160,7 +251,14 @@ func ProduceUTXOs(t *testing.T, s *state.MockDiff, outs []*avax.TransferableOutp
}
}

func ProduceNewlyLockedUTXOs(t *testing.T, s *state.MockDiff, outs []*avax.TransferableOutput, txID ids.ID, baseOutIndex int, lockState locked.State) {
func ProduceNewlyLockedUTXOs(
t *testing.T,
s *state.MockDiff,
outs []*avax.TransferableOutput,
txID ids.ID,
baseOutIndex int,
lockState locked.State,
) {
t.Helper()
for i := range outs {
out := outs[i].Out
Expand Down
12 changes: 2 additions & 10 deletions vms/platformvm/txs/executor/camino_tx_executor.go
Original file line number Diff line number Diff line change
Expand Up @@ -247,11 +247,7 @@ func (e *CaminoStandardTxExecutor) AddValidatorTx(tx *txs.AddValidatorTx) error
return errWrongOwnerType
}

if err := e.Fx.VerifyMultisigOwner(
&secp256k1fx.TransferOutput{
OutputOwners: *rewardOwner,
}, e.State,
); err != nil {
if err := e.Fx.VerifyMultisigOwner(rewardOwner, e.State); err != nil {
return err
}

Expand Down Expand Up @@ -741,11 +737,7 @@ func (e *CaminoStandardTxExecutor) DepositTx(tx *txs.DepositTx) error {
return errWrongOwnerType
}

if err := e.Fx.VerifyMultisigOwner(
&secp256k1fx.TransferOutput{
OutputOwners: *rewardOwner,
}, e.State,
); err != nil {
if err := e.Fx.VerifyMultisigOwner(rewardOwner, e.State); err != nil {
return err
}

Expand Down
Loading

0 comments on commit 10f07e6

Please sign in to comment.