Skip to content

Commit

Permalink
Add Quorum Privacy Precompile to ActivePrecompiles list
Browse files Browse the repository at this point in the history
This is currently only used for the experimental YoloV2 EIP 2929 (where all active precompiles for the current block height must be known) so not critical but worth fixing ahead of the concrete release that will be pulled in from a future upstream geth merge
  • Loading branch information
chris-j-h committed Oct 28, 2021
1 parent b029b99 commit a8338d8
Show file tree
Hide file tree
Showing 2 changed files with 112 additions and 0 deletions.
15 changes: 15 additions & 0 deletions core/vm/evm.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,13 @@ type (
// ActivePrecompiles returns the addresses of the precompiles enabled with the current
// configuration
func (evm *EVM) ActivePrecompiles() []common.Address {
return append(evm.activePrecompiles(), evm.activeQuorumPrecompiles()...)
}

// (Quorum) moved upstream ActivePrecompiles() logic to new method activePrecompiles()
// This functionality is part of an experimental feature so may be subject to future changes. Keeping the original code
// untouched in a new method should flag any changes from future merges.
func (evm *EVM) activePrecompiles() []common.Address {
switch {
case evm.chainRules.IsYoloV2:
return PrecompiledAddressesYoloV2
Expand All @@ -72,6 +79,14 @@ func (evm *EVM) ActivePrecompiles() []common.Address {
}
}

func (evm *EVM) activeQuorumPrecompiles() []common.Address {
var p []common.Address
if evm.chainRules.IsPrivacyPrecompile {
p = append(p, common.QuorumPrivacyPrecompileContractAddress())
}
return p
}

func (evm *EVM) precompile(addr common.Address) (PrecompiledContract, bool) {
var precompiles map[common.Address]PrecompiledContract
switch {
Expand Down
97 changes: 97 additions & 0 deletions core/vm/evm_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package vm

import (
"testing"

"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/params"
"github.com/stretchr/testify/require"
)

func TestActivePrecompiles(t *testing.T) {
tests := []struct {
name string
evm *EVM
want []common.Address
}{
{
name: "istanbul-plus-quorum-privacy",
evm: &EVM{
chainRules: params.Rules{
IsIstanbul: true,
IsPrivacyPrecompile: true,
},
},
want: []common.Address{
common.BytesToAddress([]byte{1}),
common.BytesToAddress([]byte{2}),
common.BytesToAddress([]byte{3}),
common.BytesToAddress([]byte{4}),
common.BytesToAddress([]byte{5}),
common.BytesToAddress([]byte{6}),
common.BytesToAddress([]byte{7}),
common.BytesToAddress([]byte{8}),
common.BytesToAddress([]byte{9}),
common.QuorumPrivacyPrecompileContractAddress(),
},
},
{
name: "homestead-plus-quorum-privacy",
evm: &EVM{
chainRules: params.Rules{
IsHomestead: true,
IsPrivacyPrecompile: true,
},
},
want: []common.Address{
common.BytesToAddress([]byte{1}),
common.BytesToAddress([]byte{2}),
common.BytesToAddress([]byte{3}),
common.BytesToAddress([]byte{4}),
common.QuorumPrivacyPrecompileContractAddress(),
},
},
{
name: "istanbul",
evm: &EVM{
chainRules: params.Rules{
IsIstanbul: true,
IsPrivacyPrecompile: false,
},
},
want: []common.Address{
common.BytesToAddress([]byte{1}),
common.BytesToAddress([]byte{2}),
common.BytesToAddress([]byte{3}),
common.BytesToAddress([]byte{4}),
common.BytesToAddress([]byte{5}),
common.BytesToAddress([]byte{6}),
common.BytesToAddress([]byte{7}),
common.BytesToAddress([]byte{8}),
common.BytesToAddress([]byte{9}),
},
},
{
name: "homestead",
evm: &EVM{
chainRules: params.Rules{
IsHomestead: true,
IsPrivacyPrecompile: false,
},
},
want: []common.Address{
common.BytesToAddress([]byte{1}),
common.BytesToAddress([]byte{2}),
common.BytesToAddress([]byte{3}),
common.BytesToAddress([]byte{4}),
},
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := tt.evm.ActivePrecompiles()
require.ElementsMatchf(t, tt.want, got, "want: %v, got: %v", tt.want, got)
})
}
}

0 comments on commit a8338d8

Please sign in to comment.