From 65a27020452c16ac52067063792d76241f8adbc8 Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Mon, 8 Apr 2024 19:19:34 +0300 Subject: [PATCH] config, native: introduce Cockatrice hard-fork With all associated native API changes ported from https://github.com/neo-project/neo/pull/2925 and https://github.com/neo-project/neo/pull/3154. Signed-off-by: Anna Shaleva --- cli/vm/cli_test.go | 8 +++++++- docs/node-configuration.md | 2 +- pkg/config/hardfork.go | 5 +++++ pkg/config/hardfork_string.go | 8 ++++++-- pkg/core/blockchain_core_test.go | 4 +++- pkg/core/native/crypto.go | 2 +- pkg/core/native/native_neo.go | 2 +- pkg/services/rpcsrv/server_test.go | 2 +- 8 files changed, 25 insertions(+), 8 deletions(-) diff --git a/cli/vm/cli_test.go b/cli/vm/cli_test.go index 81c2d56b09..63454271a9 100644 --- a/cli/vm/cli_test.go +++ b/cli/vm/cli_test.go @@ -134,6 +134,10 @@ func newTestVMClIWithState(t *testing.T) *executor { } bc, validators, committee, err := chain.NewMultiWithCustomConfigAndStoreNoCheck(t, customConfig, store) require.NoError(t, err) + + // Save config for future usage. + protoCfg := bc.GetConfig() + go bc.Run() e := neotest.NewExecutor(t, bc, validators, committee) basicchain.InitSimple(t, "../../", e) @@ -145,7 +149,9 @@ func newTestVMClIWithState(t *testing.T) *executor { require.NoError(t, err) cfg.ApplicationConfiguration.DBConfiguration.Type = dbconfig.LevelDB cfg.ApplicationConfiguration.DBConfiguration.LevelDBOptions = opts - cfg.ProtocolConfiguration.StateRootInHeader = true + cfg.ProtocolConfiguration.StateRootInHeader = protoCfg.StateRootInHeader + cfg.ProtocolConfiguration.P2PStateExchangeExtensions = protoCfg.P2PStateExchangeExtensions + cfg.ProtocolConfiguration.Hardforks = protoCfg.Hardforks return newTestVMCLIWithLogoAndCustomConfig(t, false, &cfg) } diff --git a/docs/node-configuration.md b/docs/node-configuration.md index 7fb205db1c..c6299105c0 100644 --- a/docs/node-configuration.md +++ b/docs/node-configuration.md @@ -332,7 +332,7 @@ protocol-related settings described in the table below. | --- | --- | --- | --- | --- | | CommitteeHistory | map[uint32]uint32 | none | Number of committee members after the given height, for example `{0: 1, 20: 4}` sets up a chain with one committee member since the genesis and then changes the setting to 4 committee members at the height of 20. `StandbyCommittee` committee setting must have the number of keys equal or exceeding the highest value in this option. Blocks numbers where the change happens must be divisible by the old and by the new values simultaneously. If not set, committee size is derived from the `StandbyCommittee` setting and never changes. | | Genesis | [Genesis](#Genesis-Configuration) | none | The set of genesis block settings including NeoGo-specific protocol extensions that should be enabled at the genesis block or during native contracts initialisation. | -| Hardforks | `map[string]uint32` | [] | The set of incompatible changes that affect node behaviour starting from the specified height. The default value is an empty set which should be interpreted as "each known hard-fork is applied from the zero blockchain height". The list of valid hard-fork names:
• `Aspidochelone` represents hard-fork introduced in [#2469](https://github.com/nspcc-dev/neo-go/pull/2469) (ported from the [reference](https://github.com/neo-project/neo/pull/2712)). It adjusts the prices of `System.Contract.CreateStandardAccount` and `System.Contract.CreateMultisigAccount` interops so that the resulting prices are in accordance with `sha256` method of native `CryptoLib` contract. It also includes [#2519](https://github.com/nspcc-dev/neo-go/pull/2519) (ported from the [reference](https://github.com/neo-project/neo/pull/2749)) that adjusts the price of `System.Runtime.GetRandom` interop and fixes its vulnerability. A special NeoGo-specific change is included as well for ContractManagement's update/deploy call flags behaviour to be compatible with pre-0.99.0 behaviour that was changed because of the [3.2.0 protocol change](https://github.com/neo-project/neo/pull/2653).
• `Basilisk` represents hard-fork introduced in [#3056](https://github.com/nspcc-dev/neo-go/pull/3056) (ported from the [reference](https://github.com/neo-project/neo/pull/2881)). It enables strict smart contract script check against a set of JMP instructions and against method boundaries enabled on contract deploy or update. It also includes [#3080](https://github.com/nspcc-dev/neo-go/pull/3080) (ported from the [reference](https://github.com/neo-project/neo/pull/2883)) that increases `stackitem.Integer` JSON parsing precision up to the maximum value supported by the NeoVM. It also includes [#3085](https://github.com/nspcc-dev/neo-go/pull/3085) (ported from the [reference](https://github.com/neo-project/neo/pull/2810)) that enables strict check for notifications emitted by a contract to precisely match the events specified in the contract manifest. | +| Hardforks | `map[string]uint32` | [] | The set of incompatible changes that affect node behaviour starting from the specified height. The default value is an empty set which should be interpreted as "each known hard-fork is applied from the zero blockchain height". The list of valid hard-fork names:
• `Aspidochelone` represents hard-fork introduced in [#2469](https://github.com/nspcc-dev/neo-go/pull/2469) (ported from the [reference](https://github.com/neo-project/neo/pull/2712)). It adjusts the prices of `System.Contract.CreateStandardAccount` and `System.Contract.CreateMultisigAccount` interops so that the resulting prices are in accordance with `sha256` method of native `CryptoLib` contract. It also includes [#2519](https://github.com/nspcc-dev/neo-go/pull/2519) (ported from the [reference](https://github.com/neo-project/neo/pull/2749)) that adjusts the price of `System.Runtime.GetRandom` interop and fixes its vulnerability. A special NeoGo-specific change is included as well for ContractManagement's update/deploy call flags behaviour to be compatible with pre-0.99.0 behaviour that was changed because of the [3.2.0 protocol change](https://github.com/neo-project/neo/pull/2653).
• `Basilisk` represents hard-fork introduced in [#3056](https://github.com/nspcc-dev/neo-go/pull/3056) (ported from the [reference](https://github.com/neo-project/neo/pull/2881)). It enables strict smart contract script check against a set of JMP instructions and against method boundaries enabled on contract deploy or update. It also includes [#3080](https://github.com/nspcc-dev/neo-go/pull/3080) (ported from the [reference](https://github.com/neo-project/neo/pull/2883)) that increases `stackitem.Integer` JSON parsing precision up to the maximum value supported by the NeoVM. It also includes [#3085](https://github.com/nspcc-dev/neo-go/pull/3085) (ported from the [reference](https://github.com/neo-project/neo/pull/2810)) that enables strict check for notifications emitted by a contract to precisely match the events specified in the contract manifest.
• `Cockatrice` represents hard-fork introduced in [#3402](https://github.com/nspcc-dev/neo-go/pull/3402) (ported from the [reference](https://github.com/neo-project/neo/pull/2942)). Initially it is introduced along with the ability to update native contracts. This hard-fork also includes a couple of new native smart contract APIs: `keccaak256` of native CryptoLib contract introduced in [#3301](https://github.com/nspcc-dev/neo-go/pull/3301) (ported from the [reference](https://github.com/neo-project/neo/pull/2925)) and `getCommitteeAddress` of native NeoToken contract inctroduced in [#3362](https://github.com/nspcc-dev/neo-go/pull/3362) (ported from the [reference](https://github.com/neo-project/neo/pull/3154)). | | Magic | `uint32` | `0` | Magic number which uniquely identifies Neo network. | | MaxBlockSize | `uint32` | `262144` | Maximum block size in bytes. | | MaxBlockSystemFee | `int64` | `900000000000` | Maximum overall transactions system fee per block. | diff --git a/pkg/config/hardfork.go b/pkg/config/hardfork.go index 5e1539c12d..80a8657292 100644 --- a/pkg/config/hardfork.go +++ b/pkg/config/hardfork.go @@ -22,6 +22,11 @@ const ( // https://github.com/neo-project/neo/pull/2883) and #3085 (ported from // https://github.com/neo-project/neo/pull/2810). HFBasilisk // Basilisk + // HFCockatrice represents hard-fork introduced in #3402 (ported from + // https://github.com/neo-project/neo/pull/2942), #3301 (ported from + // https://github.com/neo-project/neo/pull/2925) and #3362 (ported from + // https://github.com/neo-project/neo/pull/3154). + HFCockatrice // Cockatrice // hfLast denotes the end of hardforks enum. Consider adding new hardforks // before hfLast. hfLast diff --git a/pkg/config/hardfork_string.go b/pkg/config/hardfork_string.go index f3e22254b6..92e3799815 100644 --- a/pkg/config/hardfork_string.go +++ b/pkg/config/hardfork_string.go @@ -11,12 +11,14 @@ func _() { _ = x[HFDefault-0] _ = x[HFAspidochelone-1] _ = x[HFBasilisk-2] - _ = x[hfLast-4] + _ = x[HFCockatrice-4] + _ = x[hfLast-8] } const ( _Hardfork_name_0 = "HFDefaultAspidocheloneBasilisk" - _Hardfork_name_1 = "hfLast" + _Hardfork_name_1 = "Cockatrice" + _Hardfork_name_2 = "hfLast" ) var ( @@ -29,6 +31,8 @@ func (i Hardfork) String() string { return _Hardfork_name_0[_Hardfork_index_0[i]:_Hardfork_index_0[i+1]] case i == 4: return _Hardfork_name_1 + case i == 8: + return _Hardfork_name_2 default: return "Hardfork(" + strconv.FormatInt(int64(i), 10) + ")" } diff --git a/pkg/core/blockchain_core_test.go b/pkg/core/blockchain_core_test.go index 111202829e..dac7abee22 100644 --- a/pkg/core/blockchain_core_test.go +++ b/pkg/core/blockchain_core_test.go @@ -369,6 +369,7 @@ func TestNewBlockchain_InitHardforks(t *testing.T) { require.Equal(t, map[string]uint32{ config.HFAspidochelone.String(): 0, config.HFBasilisk.String(): 0, + config.HFCockatrice.String(): 0, }, bc.GetConfig().Hardforks) }) t.Run("missing old", func(t *testing.T) { @@ -392,12 +393,13 @@ func TestNewBlockchain_InitHardforks(t *testing.T) { }) t.Run("all present", func(t *testing.T) { bc := newTestChainWithCustomCfg(t, func(c *config.Config) { - c.ProtocolConfiguration.Hardforks = map[string]uint32{config.HFAspidochelone.String(): 5, config.HFBasilisk.String(): 10} + c.ProtocolConfiguration.Hardforks = map[string]uint32{config.HFAspidochelone.String(): 5, config.HFBasilisk.String(): 10, config.HFCockatrice.String(): 15} require.NoError(t, c.ProtocolConfiguration.Validate()) }) require.Equal(t, map[string]uint32{ config.HFAspidochelone.String(): 5, config.HFBasilisk.String(): 10, + config.HFCockatrice.String(): 15, }, bc.GetConfig().Hardforks) }) } diff --git a/pkg/core/native/crypto.go b/pkg/core/native/crypto.go index a03d2d552f..2f43a328b0 100644 --- a/pkg/core/native/crypto.go +++ b/pkg/core/native/crypto.go @@ -104,7 +104,7 @@ func newCrypto() *Crypto { desc = newDescriptor("keccak256", smartcontract.ByteArrayType, manifest.NewParameter("data", smartcontract.ByteArrayType)) - md = newMethodAndPrice(c.keccak256, 1<<15, callflag.NoneFlag) + md = newMethodAndPrice(c.keccak256, 1<<15, callflag.NoneFlag, config.HFCockatrice) c.AddMethod(md, desc) return c } diff --git a/pkg/core/native/native_neo.go b/pkg/core/native/native_neo.go index cc4e14daf1..bf23753ef5 100644 --- a/pkg/core/native/native_neo.go +++ b/pkg/core/native/native_neo.go @@ -233,7 +233,7 @@ func newNEO(cfg config.ProtocolConfiguration) *NEO { n.AddMethod(md, desc) desc = newDescriptor("getCommitteeAddress", smartcontract.Hash160Type) - md = newMethodAndPrice(n.getCommitteeAddress, 1<<16, callflag.ReadStates) + md = newMethodAndPrice(n.getCommitteeAddress, 1<<16, callflag.ReadStates, config.HFCockatrice) n.AddMethod(md, desc) desc = newDescriptor("getNextBlockValidators", smartcontract.ArrayType) diff --git a/pkg/services/rpcsrv/server_test.go b/pkg/services/rpcsrv/server_test.go index 51b17e1578..57e5ed4efd 100644 --- a/pkg/services/rpcsrv/server_test.go +++ b/pkg/services/rpcsrv/server_test.go @@ -89,7 +89,7 @@ const ( faultedTxHashLE = "82279bfe9bada282ca0f8cb8e0bb124b921af36f00c69a518320322c6f4fef60" faultedTxBlock uint32 = 23 invokescriptContractAVM = "VwIADBQBDAMOBQYMDQIODw0DDgcJAAAAAErZMCQE2zBwaEH4J+yMqiYEEUAMFA0PAwIJAAIBAwcDBAUCAQAOBgwJStkwJATbMHFpQfgn7IyqJgQSQBNA" - block20StateRootLE = "637aac452ef781dee7ac5e898a1edf4d3c5b6420288ea5232dad620f39d2152a" + block20StateRootLE = "397c69adbc0201d59623fa913bfff4a2da25c792c484d1d278c061709f2c21cf" ) var (