Skip to content

Commit

Permalink
move warp to precompiles package (#1034)
Browse files Browse the repository at this point in the history
* move warp to precompiles package

* move warp params to warp package

* use log gas cost from contract package

---------

Co-authored-by: Darioush Jalali <[email protected]>
  • Loading branch information
ceyonur and darioush committed Jan 4, 2024
1 parent 36120e9 commit 84e86b4
Show file tree
Hide file tree
Showing 15 changed files with 50 additions and 59 deletions.
10 changes: 0 additions & 10 deletions params/avalanche_params.go

This file was deleted.

16 changes: 8 additions & 8 deletions plugin/evm/vm_warp_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import (
"github.com/ava-labs/avalanchego/snow/choices"
"github.com/ava-labs/avalanchego/snow/engine/snowman/block"
"github.com/ava-labs/avalanchego/snow/validators"
"github.com/ava-labs/avalanchego/utils"
avagoUtils "github.com/ava-labs/avalanchego/utils"
"github.com/ava-labs/avalanchego/utils/crypto/bls"
"github.com/ava-labs/avalanchego/utils/set"
"github.com/ava-labs/avalanchego/vms/components/chain"
Expand All @@ -29,9 +29,9 @@ import (
"github.com/ava-labs/subnet-evm/params"
"github.com/ava-labs/subnet-evm/plugin/evm/message"
"github.com/ava-labs/subnet-evm/precompile/contract"
"github.com/ava-labs/subnet-evm/precompile/contracts/warp"
"github.com/ava-labs/subnet-evm/predicate"
subnetEVMUtils "github.com/ava-labs/subnet-evm/utils"
"github.com/ava-labs/subnet-evm/x/warp"
"github.com/ava-labs/subnet-evm/utils"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
"github.com/stretchr/testify/require"
Expand All @@ -49,7 +49,7 @@ func TestSendWarpMessage(t *testing.T) {
genesis := &core.Genesis{}
require.NoError(genesis.UnmarshalJSON([]byte(genesisJSONDurango)))
genesis.Config.GenesisPrecompiles = params.Precompiles{
warp.ConfigKey: warp.NewDefaultConfig(subnetEVMUtils.NewUint64(0)),
warp.ConfigKey: warp.NewDefaultConfig(utils.NewUint64(0)),
}
genesisJSON, err := genesis.MarshalJSON()
require.NoError(err)
Expand All @@ -63,7 +63,7 @@ func TestSendWarpMessage(t *testing.T) {
logsSub := vm.eth.APIBackend.SubscribeAcceptedLogsEvent(acceptedLogsChan)
defer logsSub.Unsubscribe()

payloadData := utils.RandomBytes(100)
payloadData := avagoUtils.RandomBytes(100)

warpSendMessageInput, err := warp.PackSendWarpMessage(payloadData)
require.NoError(err)
Expand Down Expand Up @@ -249,7 +249,7 @@ func testWarpVMTransaction(t *testing.T, unsignedMessage *avalancheWarp.Unsigned
genesis := &core.Genesis{}
require.NoError(genesis.UnmarshalJSON([]byte(genesisJSONDurango)))
genesis.Config.GenesisPrecompiles = params.Precompiles{
warp.ConfigKey: warp.NewDefaultConfig(subnetEVMUtils.NewUint64(0)),
warp.ConfigKey: warp.NewDefaultConfig(utils.NewUint64(0)),
}
genesisJSON, err := genesis.MarshalJSON()
require.NoError(err)
Expand Down Expand Up @@ -406,7 +406,7 @@ func TestReceiveWarpMessage(t *testing.T) {
genesis := &core.Genesis{}
require.NoError(genesis.UnmarshalJSON([]byte(genesisJSONDurango)))
genesis.Config.GenesisPrecompiles = params.Precompiles{
warp.ConfigKey: warp.NewDefaultConfig(subnetEVMUtils.NewUint64(0)),
warp.ConfigKey: warp.NewDefaultConfig(utils.NewUint64(0)),
}
genesisJSON, err := genesis.MarshalJSON()
require.NoError(err)
Expand All @@ -420,7 +420,7 @@ func TestReceiveWarpMessage(t *testing.T) {
logsSub := vm.eth.APIBackend.SubscribeAcceptedLogsEvent(acceptedLogsChan)
defer logsSub.Unsubscribe()

payloadData := utils.RandomBytes(100)
payloadData := avagoUtils.RandomBytes(100)

addressedPayload, err := payload.NewAddressedCall(
testEthAddrs[0].Bytes(),
Expand Down
File renamed without changes.
21 changes: 13 additions & 8 deletions x/warp/config.go → precompile/contracts/warp/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import (

"github.com/ava-labs/avalanchego/vms/platformvm/warp"
"github.com/ava-labs/avalanchego/vms/platformvm/warp/payload"
"github.com/ava-labs/subnet-evm/params"
"github.com/ava-labs/subnet-evm/precompile/precompileconfig"
"github.com/ava-labs/subnet-evm/predicate"
warpValidators "github.com/ava-labs/subnet-evm/warp/validators"
Expand All @@ -19,6 +18,12 @@ import (
"github.com/ethereum/go-ethereum/log"
)

const (
WarpDefaultQuorumNumerator uint64 = 67
WarpQuorumNumeratorMinimum uint64 = 33
WarpQuorumDenominator uint64 = 100
)

var (
_ precompileconfig.Config = &Config{}
_ precompileconfig.Predicater = &Config{}
Expand Down Expand Up @@ -85,12 +90,12 @@ func (c *Config) Verify(chainConfig precompileconfig.ChainConfig) error {
}
}

if c.QuorumNumerator > params.WarpQuorumDenominator {
return fmt.Errorf("cannot specify quorum numerator (%d) > quorum denominator (%d)", c.QuorumNumerator, params.WarpQuorumDenominator)
if c.QuorumNumerator > WarpQuorumDenominator {
return fmt.Errorf("cannot specify quorum numerator (%d) > quorum denominator (%d)", c.QuorumNumerator, WarpQuorumDenominator)
}
// If a non-default quorum numerator is specified and it is less than the minimum, return an error
if c.QuorumNumerator != 0 && c.QuorumNumerator < params.WarpQuorumNumeratorMinimum {
return fmt.Errorf("cannot specify quorum numerator (%d) < min quorum numerator (%d)", c.QuorumNumerator, params.WarpQuorumNumeratorMinimum)
if c.QuorumNumerator != 0 && c.QuorumNumerator < WarpQuorumNumeratorMinimum {
return fmt.Errorf("cannot specify quorum numerator (%d) < min quorum numerator (%d)", c.QuorumNumerator, WarpQuorumNumeratorMinimum)
}
return nil
}
Expand Down Expand Up @@ -187,20 +192,20 @@ func (c *Config) VerifyPredicate(predicateContext *precompileconfig.PredicateCon
return fmt.Errorf("%w: %w", errCannotParseWarpMsg, err)
}

quorumNumerator := params.WarpDefaultQuorumNumerator
quorumNumerator := WarpDefaultQuorumNumerator
if c.QuorumNumerator != 0 {
quorumNumerator = c.QuorumNumerator
}

log.Debug("verifying warp message", "warpMsg", warpMsg, "quorumNum", quorumNumerator, "quorumDenom", params.WarpQuorumDenominator)
log.Debug("verifying warp message", "warpMsg", warpMsg, "quorumNum", quorumNumerator, "quorumDenom", WarpQuorumDenominator)
err = warpMsg.Signature.Verify(
context.Background(),
&warpMsg.UnsignedMessage,
predicateContext.SnowCtx.NetworkID,
warpValidators.NewState(predicateContext.SnowCtx), // Wrap validators.State on the chain snow context to special case the Primary Network
predicateContext.ProposerVMBlockCtx.PChainHeight,
quorumNumerator,
params.WarpQuorumDenominator,
WarpQuorumDenominator,
)

if err != nil {
Expand Down
21 changes: 10 additions & 11 deletions x/warp/config_test.go → precompile/contracts/warp/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (
"fmt"
"testing"

"github.com/ava-labs/subnet-evm/params"
"github.com/ava-labs/subnet-evm/precompile/precompileconfig"
"github.com/ava-labs/subnet-evm/precompile/testutils"
"github.com/ava-labs/subnet-evm/utils"
Expand All @@ -17,21 +16,21 @@ import (
func TestVerify(t *testing.T) {
tests := map[string]testutils.ConfigVerifyTest{
"quorum numerator less than minimum": {
Config: NewConfig(utils.NewUint64(3), params.WarpQuorumNumeratorMinimum-1),
ExpectedError: fmt.Sprintf("cannot specify quorum numerator (%d) < min quorum numerator (%d)", params.WarpQuorumNumeratorMinimum-1, params.WarpQuorumNumeratorMinimum),
Config: NewConfig(utils.NewUint64(3), WarpQuorumNumeratorMinimum-1),
ExpectedError: fmt.Sprintf("cannot specify quorum numerator (%d) < min quorum numerator (%d)", WarpQuorumNumeratorMinimum-1, WarpQuorumNumeratorMinimum),
},
"quorum numerator greater than quorum denominator": {
Config: NewConfig(utils.NewUint64(3), params.WarpQuorumDenominator+1),
ExpectedError: fmt.Sprintf("cannot specify quorum numerator (%d) > quorum denominator (%d)", params.WarpQuorumDenominator+1, params.WarpQuorumDenominator),
Config: NewConfig(utils.NewUint64(3), WarpQuorumDenominator+1),
ExpectedError: fmt.Sprintf("cannot specify quorum numerator (%d) > quorum denominator (%d)", WarpQuorumDenominator+1, WarpQuorumDenominator),
},
"default quorum numerator": {
Config: NewDefaultConfig(utils.NewUint64(3)),
},
"valid quorum numerator 1 less than denominator": {
Config: NewConfig(utils.NewUint64(3), params.WarpQuorumDenominator-1),
Config: NewConfig(utils.NewUint64(3), WarpQuorumDenominator-1),
},
"valid quorum numerator 1 more than minimum": {
Config: NewConfig(utils.NewUint64(3), params.WarpQuorumNumeratorMinimum+1),
Config: NewConfig(utils.NewUint64(3), WarpQuorumNumeratorMinimum+1),
},
"invalid cannot activated before Durango activation": {
Config: NewConfig(utils.NewUint64(3), 0),
Expand Down Expand Up @@ -67,8 +66,8 @@ func TestEqualWarpConfig(t *testing.T) {
},

"different quorum numerator": {
Config: NewConfig(utils.NewUint64(3), params.WarpQuorumNumeratorMinimum+1),
Other: NewConfig(utils.NewUint64(3), params.WarpQuorumNumeratorMinimum+2),
Config: NewConfig(utils.NewUint64(3), WarpQuorumNumeratorMinimum+1),
Other: NewConfig(utils.NewUint64(3), WarpQuorumNumeratorMinimum+2),
Expected: false,
},

Expand All @@ -79,8 +78,8 @@ func TestEqualWarpConfig(t *testing.T) {
},

"same non-default config": {
Config: NewConfig(utils.NewUint64(3), params.WarpQuorumNumeratorMinimum+5),
Other: NewConfig(utils.NewUint64(3), params.WarpQuorumNumeratorMinimum+5),
Config: NewConfig(utils.NewUint64(3), WarpQuorumNumeratorMinimum+5),
Other: NewConfig(utils.NewUint64(3), WarpQuorumNumeratorMinimum+5),
Expected: true,
},
}
Expand Down
File renamed without changes.
5 changes: 2 additions & 3 deletions x/warp/contract.go → precompile/contracts/warp/contract.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import (
"github.com/ava-labs/avalanchego/vms/platformvm/warp"
"github.com/ava-labs/avalanchego/vms/platformvm/warp/payload"
"github.com/ava-labs/subnet-evm/accounts/abi"
"github.com/ava-labs/subnet-evm/params"
"github.com/ava-labs/subnet-evm/precompile/contract"
"github.com/ava-labs/subnet-evm/vmerrs"

Expand All @@ -28,9 +27,9 @@ const (
// Note: using trie write for the gas cost results in a conservative overestimate since the message is stored in a
// flat database that can be cleaned up after a period of time instead of the EVM trie.

SendWarpMessageGasCost uint64 = params.LogGas + 3*params.LogTopicGas + AddWarpMessageGasCost + contract.WriteGasCostPerSlot
SendWarpMessageGasCost uint64 = contract.LogGas + 3*contract.LogTopicGas + AddWarpMessageGasCost + contract.WriteGasCostPerSlot
// SendWarpMessageGasCostPerByte cost accounts for producing a signed message of a given size
SendWarpMessageGasCostPerByte uint64 = params.LogDataGas
SendWarpMessageGasCostPerByte uint64 = contract.LogDataGas

GasCostPerWarpSigner uint64 = 500
GasCostPerWarpMessageBytes uint64 = 100
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ import (
"github.com/ava-labs/avalanchego/utils/set"
avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp"
"github.com/ava-labs/avalanchego/vms/platformvm/warp/payload"
"github.com/ava-labs/subnet-evm/params"
"github.com/ava-labs/subnet-evm/precompile/precompileconfig"
"github.com/ava-labs/subnet-evm/precompile/testutils"
"github.com/ava-labs/subnet-evm/predicate"
Expand Down Expand Up @@ -457,17 +456,17 @@ func TestWarpSignatureWeightsDefaultQuorumNumerator(t *testing.T) {
tests := make(map[string]testutils.PredicateTest)
for _, numSigners := range []int{
1,
int(params.WarpDefaultQuorumNumerator) - 1,
int(params.WarpDefaultQuorumNumerator),
int(params.WarpDefaultQuorumNumerator) + 1,
int(params.WarpQuorumDenominator) - 1,
int(params.WarpQuorumDenominator),
int(params.WarpQuorumDenominator) + 1,
int(WarpDefaultQuorumNumerator) - 1,
int(WarpDefaultQuorumNumerator),
int(WarpDefaultQuorumNumerator) + 1,
int(WarpQuorumDenominator) - 1,
int(WarpQuorumDenominator),
int(WarpQuorumDenominator) + 1,
} {
predicateBytes := createPredicate(numSigners)
// The predicate is valid iff the number of signers is >= the required numerator and does not exceed the denominator.
var expectedErr error
if numSigners >= int(params.WarpDefaultQuorumNumerator) && numSigners <= int(params.WarpQuorumDenominator) {
if numSigners >= int(WarpDefaultQuorumNumerator) && numSigners <= int(WarpQuorumDenominator) {
expectedErr = nil
} else {
expectedErr = errFailedVerification
Expand Down Expand Up @@ -510,7 +509,7 @@ func TestWarpMultiplePredicates(t *testing.T) {
{true, true},
} {
var (
numSigners = int(params.WarpQuorumDenominator)
numSigners = int(WarpQuorumDenominator)
invalidPredicateBytes = createPredicate(1)
validPredicateBytes = createPredicate(numSigners)
)
Expand Down Expand Up @@ -562,13 +561,13 @@ func TestWarpSignatureWeightsNonDefaultQuorumNumerator(t *testing.T) {
tests := make(map[string]testutils.PredicateTest)
nonDefaultQuorumNumerator := 50
// Ensure this test fails if the DefaultQuroumNumerator is changed to an unexpected value during development
require.NotEqual(t, nonDefaultQuorumNumerator, int(params.WarpDefaultQuorumNumerator))
require.NotEqual(t, nonDefaultQuorumNumerator, int(WarpDefaultQuorumNumerator))
// Add cases with default quorum
for _, numSigners := range []int{nonDefaultQuorumNumerator, nonDefaultQuorumNumerator + 1, 99, 100, 101} {
predicateBytes := createPredicate(numSigners)
// The predicate is valid iff the number of signers is >= the required numerator and does not exceed the denominator.
var expectedErr error
if numSigners >= nonDefaultQuorumNumerator && numSigners <= int(params.WarpQuorumDenominator) {
if numSigners >= nonDefaultQuorumNumerator && numSigners <= int(WarpQuorumDenominator) {
expectedErr = nil
} else {
expectedErr = errFailedVerification
Expand Down
File renamed without changes.
2 changes: 1 addition & 1 deletion precompile/registry/registry.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import (

_ "github.com/ava-labs/subnet-evm/precompile/contracts/rewardmanager"

_ "github.com/ava-labs/subnet-evm/x/warp"
_ "github.com/ava-labs/subnet-evm/precompile/contracts/warp"
// ADD YOUR PRECOMPILE HERE
// _ "github.com/ava-labs/subnet-evm/precompile/contracts/yourprecompile"
)
Expand Down
8 changes: 4 additions & 4 deletions tests/warp/warp_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,12 @@ import (
"github.com/ava-labs/subnet-evm/interfaces"
"github.com/ava-labs/subnet-evm/params"
"github.com/ava-labs/subnet-evm/plugin/evm"
"github.com/ava-labs/subnet-evm/precompile/contracts/warp"
"github.com/ava-labs/subnet-evm/predicate"
"github.com/ava-labs/subnet-evm/tests/utils"
"github.com/ava-labs/subnet-evm/tests/utils/runner"
warpBackend "github.com/ava-labs/subnet-evm/warp"
"github.com/ava-labs/subnet-evm/warp/aggregator"
"github.com/ava-labs/subnet-evm/x/warp"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/log"
Expand Down Expand Up @@ -452,12 +452,12 @@ func (w *warpTest) aggregateSignatures() {
if w.sendingSubnet.SubnetID == constants.PrimaryNetworkID {
subnetIDStr = w.receivingSubnet.SubnetID.String()
}
signedWarpMessageBytes, err := client.GetMessageAggregateSignature(ctx, w.addressedCallSignedMessage.ID(), params.WarpQuorumDenominator, subnetIDStr)
signedWarpMessageBytes, err := client.GetMessageAggregateSignature(ctx, w.addressedCallSignedMessage.ID(), warp.WarpQuorumDenominator, subnetIDStr)
require.NoError(err)
require.Equal(w.addressedCallSignedMessage.Bytes(), signedWarpMessageBytes)

log.Info("Fetching block payload aggregate signature via p2p API")
signedWarpBlockBytes, err := client.GetBlockAggregateSignature(ctx, w.blockID, params.WarpQuorumDenominator, subnetIDStr)
signedWarpBlockBytes, err := client.GetBlockAggregateSignature(ctx, w.blockID, warp.WarpQuorumDenominator, subnetIDStr)
require.NoError(err)
require.Equal(w.blockPayloadSignedMessage.Bytes(), signedWarpBlockBytes)
}
Expand Down Expand Up @@ -697,7 +697,7 @@ func (w *warpTest) warpLoad() {
}
log.Info("Fetching addressed call aggregate signature via p2p API")

signedWarpMessageBytes, err := warpClient.GetMessageAggregateSignature(ctx, unsignedMessage.ID(), params.WarpDefaultQuorumNumerator, subnetIDStr)
signedWarpMessageBytes, err := warpClient.GetMessageAggregateSignature(ctx, unsignedMessage.ID(), warp.WarpDefaultQuorumNumerator, subnetIDStr)
if err != nil {
return nil, err
}
Expand Down
5 changes: 2 additions & 3 deletions warp/aggregator/aggregator.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,12 @@ import (
"context"
"fmt"

"github.com/ava-labs/subnet-evm/params"

"github.com/ethereum/go-ethereum/log"

"github.com/ava-labs/avalanchego/utils/crypto/bls"
"github.com/ava-labs/avalanchego/utils/set"
avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp"
"github.com/ava-labs/subnet-evm/precompile/contracts/warp"
)

type AggregateSignatureResult struct {
Expand Down Expand Up @@ -130,7 +129,7 @@ func (a *Aggregator) AggregateSignatures(ctx context.Context, unsignedMessage *a
)

// If the signature weight meets the requested threshold, cancel signature fetching
if err := avalancheWarp.VerifyWeight(signaturesWeight, a.totalWeight, quorumNum, params.WarpQuorumDenominator); err == nil {
if err := avalancheWarp.VerifyWeight(signaturesWeight, a.totalWeight, quorumNum, warp.WarpQuorumDenominator); err == nil {
log.Debug("Verify weight passed, exiting aggregation early",
"quorumNum", quorumNum,
"totalWeight", a.totalWeight,
Expand Down

0 comments on commit 84e86b4

Please sign in to comment.