From 5803f3198dd954d75eb46abb381effc17fe74b7d Mon Sep 17 00:00:00 2001 From: hhsel <26063868+hhsel@users.noreply.github.com> Date: Mon, 21 Aug 2023 19:25:22 +0900 Subject: [PATCH 01/13] QBFT: prevent maximum request timeout overflow (#1665) --- consensus/istanbul/core/core.go | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/consensus/istanbul/core/core.go b/consensus/istanbul/core/core.go index 6d48c71fc..5f11658a0 100644 --- a/consensus/istanbul/core/core.go +++ b/consensus/istanbul/core/core.go @@ -254,13 +254,32 @@ func (c *core) newRoundChangeTimer() { // set timeout based on the round number baseTimeout := time.Duration(c.config.GetConfig(c.current.Sequence()).RequestTimeoutSeconds) * time.Second round := c.current.Round().Uint64() - - timeout := baseTimeout * time.Duration(math.Pow(2, float64(round))) - maxRequestTimeout := time.Duration(c.config.GetConfig(c.current.Sequence()).MaxRequestTimeoutSeconds) * time.Second - if maxRequestTimeout > time.Duration(0) && timeout > maxRequestTimeout { - timeout = maxRequestTimeout + // If the upper limit of the request timeout is capped by small maxRequestTimeout, round can be a quite large number, + // which leads to float64 overflow, making its value negative or zero forever after some point. + // In this case we cannot simply use math.Pow and have to implement a safeguard on our own, at the cost of performance (which is not important in this case). + var timeout time.Duration + if maxRequestTimeout > time.Duration(0) { + timeout = baseTimeout + for i := uint64(0); i < round; i++ { + timeout = timeout * 2 + if timeout > maxRequestTimeout { + timeout = maxRequestTimeout + break + } + } + // prevent log storm when unexpected overflow happens + if timeout < baseTimeout { + c.currentLogger(true, nil).Error("QBFT: Possible request timeout overflow detected, setting timeout value to maxRequestTimeout", + "timeout", timeout.Seconds(), + "max_request_timeout", maxRequestTimeout.Seconds(), + ) + timeout = maxRequestTimeout + } + } else { + // effectively impossible to observe overflow happen when maxRequestTimeout is disabled + timeout = baseTimeout * time.Duration(math.Pow(2, float64(round))) } c.currentLogger(true, nil).Trace("IBFT: start new ROUND-CHANGE timer", "timeout", timeout.Seconds()) From c3d540cb848e3c824f6396987f147d1db13c265b Mon Sep 17 00:00:00 2001 From: Christopher Harrison Date: Tue, 5 Dec 2023 10:32:07 +0000 Subject: [PATCH 02/13] Change the testnet genesis block and enforce the new hash for testnet rollback to block 0 --- core/genesis.go | 2 +- params/config.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/genesis.go b/core/genesis.go index 39bdb485e..b92595516 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -489,7 +489,7 @@ func DefaultTestnetGenesisBlock() *Genesis { Config: params.TestnetChainConfig, Number: 0, Nonce: 0, - Timestamp: 1693335596, // tue 29 aug 2023 + Timestamp: 1693335597, // tue 29 aug 2023 ExtraData: GenerateGenesisExtraDataForIBFTValSet(validatorSet), GasLimit: 30000000, GasUsed: 0, //ok unless we add a smart contract in the genesis state diff --git a/params/config.go b/params/config.go index 7d6dd84ca..8101dffa9 100644 --- a/params/config.go +++ b/params/config.go @@ -31,7 +31,7 @@ import ( var ( MainnetGenesisHash = common.HexToHash("0x4fda998638776057c8c27989bc021aed4b813fcebd483bf7a6b139f6efb324a6") StagenetGenesisHash = common.HexToHash("0x619e6f8fa6e99eb9829e1f0c7fa62a999d47bf8a7da51a72c2af3cd83cb6e4a3") - TestnetGenesisHash = common.HexToHash("0x31cf4b703626e42f9bded05754f4c6072986a02db46c9c6281a9924aea75a788") + TestnetGenesisHash = common.HexToHash("0xcafc40bfdbfce1f6df3101f231619cab204ea901c0cdc9d403dffd025180161d") ) // TrustedCheckpoints associates each known checkpoint with the genesis hash of From 3daa9c639b56e11a51b645210166402d3d60bb6c Mon Sep 17 00:00:00 2001 From: Christopher Harrison Date: Wed, 6 Dec 2023 16:51:56 +0000 Subject: [PATCH 03/13] SC rollback #2 after contract changes --- core/genesis.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/genesis.go b/core/genesis.go index b92595516..a07358344 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -489,7 +489,7 @@ func DefaultTestnetGenesisBlock() *Genesis { Config: params.TestnetChainConfig, Number: 0, Nonce: 0, - Timestamp: 1693335597, // tue 29 aug 2023 + Timestamp: 1701881196, // wed 6th dec 2023 ExtraData: GenerateGenesisExtraDataForIBFTValSet(validatorSet), GasLimit: 30000000, GasUsed: 0, //ok unless we add a smart contract in the genesis state From 492484f36a3ee2f850065f2970588a73134c1a82 Mon Sep 17 00:00:00 2001 From: Christopher Harrison Date: Mon, 18 Dec 2023 19:02:43 +0000 Subject: [PATCH 04/13] SC reset #3 after oracle changes --- core/genesis.go | 2 +- params/config.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/genesis.go b/core/genesis.go index a07358344..d2c4b3b3a 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -489,7 +489,7 @@ func DefaultTestnetGenesisBlock() *Genesis { Config: params.TestnetChainConfig, Number: 0, Nonce: 0, - Timestamp: 1701881196, // wed 6th dec 2023 + Timestamp: 1702925864, // wed 18th dec 2023 ExtraData: GenerateGenesisExtraDataForIBFTValSet(validatorSet), GasLimit: 30000000, GasUsed: 0, //ok unless we add a smart contract in the genesis state diff --git a/params/config.go b/params/config.go index 8101dffa9..5d71a289f 100644 --- a/params/config.go +++ b/params/config.go @@ -31,7 +31,7 @@ import ( var ( MainnetGenesisHash = common.HexToHash("0x4fda998638776057c8c27989bc021aed4b813fcebd483bf7a6b139f6efb324a6") StagenetGenesisHash = common.HexToHash("0x619e6f8fa6e99eb9829e1f0c7fa62a999d47bf8a7da51a72c2af3cd83cb6e4a3") - TestnetGenesisHash = common.HexToHash("0xcafc40bfdbfce1f6df3101f231619cab204ea901c0cdc9d403dffd025180161d") + TestnetGenesisHash = common.HexToHash("0x8ee4eff129f80e7b58b581a0d002f7be0c6f98ec5f96236f5add83ad540f8a09") ) // TrustedCheckpoints associates each known checkpoint with the genesis hash of From 14b128d1c554954f91d65488e1f7e637d5144c4a Mon Sep 17 00:00:00 2001 From: Christopher Harrison Date: Wed, 3 Jan 2024 14:52:50 +0000 Subject: [PATCH 05/13] Testnet Rollback #4 for final e2e my.electroneum.com --- core/genesis.go | 2 +- params/config.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/genesis.go b/core/genesis.go index d2c4b3b3a..ab7e96f57 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -489,7 +489,7 @@ func DefaultTestnetGenesisBlock() *Genesis { Config: params.TestnetChainConfig, Number: 0, Nonce: 0, - Timestamp: 1702925864, // wed 18th dec 2023 + Timestamp: 1704292320, // wed 3rd jan 2024 ExtraData: GenerateGenesisExtraDataForIBFTValSet(validatorSet), GasLimit: 30000000, GasUsed: 0, //ok unless we add a smart contract in the genesis state diff --git a/params/config.go b/params/config.go index 5d71a289f..84f9f47c0 100644 --- a/params/config.go +++ b/params/config.go @@ -31,7 +31,7 @@ import ( var ( MainnetGenesisHash = common.HexToHash("0x4fda998638776057c8c27989bc021aed4b813fcebd483bf7a6b139f6efb324a6") StagenetGenesisHash = common.HexToHash("0x619e6f8fa6e99eb9829e1f0c7fa62a999d47bf8a7da51a72c2af3cd83cb6e4a3") - TestnetGenesisHash = common.HexToHash("0x8ee4eff129f80e7b58b581a0d002f7be0c6f98ec5f96236f5add83ad540f8a09") + TestnetGenesisHash = common.HexToHash("0x4fda998638776057c8c27989bc021aed4b813fcebd483bf7a6b139f6efb324a6") ) // TrustedCheckpoints associates each known checkpoint with the genesis hash of From 368a11d7a585a632b025c13586e5b74dc0dced24 Mon Sep 17 00:00:00 2001 From: andrepatta Date: Tue, 6 Feb 2024 13:26:17 -0300 Subject: [PATCH 06/13] core: properly set effectiveTip for gas waiver transactions --- core/state_transition.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/state_transition.go b/core/state_transition.go index b96b87410..9c6dfeff2 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -348,6 +348,9 @@ func (st *StateTransition) TransitionDb() (*ExecutionResult, error) { effectiveTip := st.gasPrice if rules.IsLondon { effectiveTip = cmath.BigMin(st.gasTipCap, new(big.Int).Sub(st.gasFeeCap, st.evm.Context.BaseFee)) // gastipcap is zero for priority tx with waiver, so this holds fine + if effectiveTip.Sign() < 0 { + effectiveTip = new(big.Int).SetUint64(0) + } } st.state.AddBalance(st.evm.Context.Coinbase, new(big.Int).Mul(new(big.Int).SetUint64(st.gasUsed()), effectiveTip)) //this is where you do the coinbase payout of the miner tip From 0a0f3bb84e5eb8272ce6e8338af2298b19ad2c26 Mon Sep 17 00:00:00 2001 From: Christopher Harrison Date: Thu, 8 Feb 2024 17:01:48 +0000 Subject: [PATCH 07/13] Testnet Rollback #5 for consensus change & e2e rerun of large wallets --- core/genesis.go | 2 +- params/config.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/genesis.go b/core/genesis.go index ab7e96f57..26942c111 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -489,7 +489,7 @@ func DefaultTestnetGenesisBlock() *Genesis { Config: params.TestnetChainConfig, Number: 0, Nonce: 0, - Timestamp: 1704292320, // wed 3rd jan 2024 + Timestamp: 1707409518, // feb 2024 ExtraData: GenerateGenesisExtraDataForIBFTValSet(validatorSet), GasLimit: 30000000, GasUsed: 0, //ok unless we add a smart contract in the genesis state diff --git a/params/config.go b/params/config.go index 84f9f47c0..19a66e527 100644 --- a/params/config.go +++ b/params/config.go @@ -31,7 +31,7 @@ import ( var ( MainnetGenesisHash = common.HexToHash("0x4fda998638776057c8c27989bc021aed4b813fcebd483bf7a6b139f6efb324a6") StagenetGenesisHash = common.HexToHash("0x619e6f8fa6e99eb9829e1f0c7fa62a999d47bf8a7da51a72c2af3cd83cb6e4a3") - TestnetGenesisHash = common.HexToHash("0x4fda998638776057c8c27989bc021aed4b813fcebd483bf7a6b139f6efb324a6") + TestnetGenesisHash = common.HexToHash("0x322499feda3a070c335633b4b483f90b697f131ea61ba1a18af1d7bc3b9aa994") ) // TrustedCheckpoints associates each known checkpoint with the genesis hash of From 7c19ecccc3147a63366408c2f4c0cf699d0c89dd Mon Sep 17 00:00:00 2001 From: Christopher Harrison Date: Thu, 15 Feb 2024 09:35:28 +0000 Subject: [PATCH 08/13] Testnet rollback #6 for full e2e --- core/genesis.go | 2 +- params/config.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/genesis.go b/core/genesis.go index 26942c111..30ce7e3bd 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -489,7 +489,7 @@ func DefaultTestnetGenesisBlock() *Genesis { Config: params.TestnetChainConfig, Number: 0, Nonce: 0, - Timestamp: 1707409518, // feb 2024 + Timestamp: 1707989393, // feb 15 2024 ExtraData: GenerateGenesisExtraDataForIBFTValSet(validatorSet), GasLimit: 30000000, GasUsed: 0, //ok unless we add a smart contract in the genesis state diff --git a/params/config.go b/params/config.go index 19a66e527..025e6d44d 100644 --- a/params/config.go +++ b/params/config.go @@ -31,7 +31,7 @@ import ( var ( MainnetGenesisHash = common.HexToHash("0x4fda998638776057c8c27989bc021aed4b813fcebd483bf7a6b139f6efb324a6") StagenetGenesisHash = common.HexToHash("0x619e6f8fa6e99eb9829e1f0c7fa62a999d47bf8a7da51a72c2af3cd83cb6e4a3") - TestnetGenesisHash = common.HexToHash("0x322499feda3a070c335633b4b483f90b697f131ea61ba1a18af1d7bc3b9aa994") + TestnetGenesisHash = common.HexToHash("0x10e52a738c4546344d46c0f0b601476cc9a7ed28dfcd62ead9528fdd1fe56a93") ) // TrustedCheckpoints associates each known checkpoint with the genesis hash of From d181ccc1395920dfab8a3a45441c9b7b80bcb084 Mon Sep 17 00:00:00 2001 From: Christopher Harrison Date: Wed, 28 Feb 2024 18:58:58 +0000 Subject: [PATCH 09/13] Mainnet setup --- core/genesis.go | 6 +++--- params/config.go | 11 ++++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/core/genesis.go b/core/genesis.go index 30ce7e3bd..65fcf4540 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -463,7 +463,7 @@ func DefaultGenesisBlock() *Genesis { Config: params.MainnetChainConfig, Number: 0, Nonce: 0, - Timestamp: 0, + Timestamp: 1709141867, // 28 Feb 2024 ExtraData: GenerateGenesisExtraDataForIBFTValSet(validatorSet), GasLimit: 30000000, GasUsed: 0, //ok unless we add a smart contract in the genesis state @@ -471,8 +471,8 @@ func DefaultGenesisBlock() *Genesis { Mixhash: common.HexToHash("0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365"), ParentHash: common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000000"), Coinbase: common.Address{}, - Alloc: GenesisAlloc{ //TODO: get etn circulating supply allocated to the bridge address. the address is already correct - common.HexToAddress("0x7b56c6e6f53498e3e9332b180fe41f1add202f28"): {Balance: math.MustParseBig256("1000000000000000000000000000")}, + Alloc: GenesisAlloc{ + common.HexToAddress("0x7b56c6e6f53498e3e9332b180fe41f1add202f28"): {Balance: math.MustParseBig256("17964946965760000000000000000")}, // = terminal circulating supply for legacy mainnet [0,1806749}. Legacy emissions are burned from height 1806749 onwards }, } } diff --git a/params/config.go b/params/config.go index 025e6d44d..deaf27365 100644 --- a/params/config.go +++ b/params/config.go @@ -29,7 +29,7 @@ import ( // Genesis hashes to enforce below configs on. var ( - MainnetGenesisHash = common.HexToHash("0x4fda998638776057c8c27989bc021aed4b813fcebd483bf7a6b139f6efb324a6") + MainnetGenesisHash = common.HexToHash("0x9ec40a3c9e4165b0150331271abf47984ca2614ca11b08c29a5fdd547566401b") StagenetGenesisHash = common.HexToHash("0x619e6f8fa6e99eb9829e1f0c7fa62a999d47bf8a7da51a72c2af3cd83cb6e4a3") TestnetGenesisHash = common.HexToHash("0x10e52a738c4546344d46c0f0b601476cc9a7ed28dfcd62ead9528fdd1fe56a93") ) @@ -68,10 +68,11 @@ var ( MaxRequestTimeoutSeconds: 60, AllowedFutureBlockTime: 5, }, - GenesisETN: math.MustParseBig256("17000000000000000000000000000"), //TODO: Get the exact circulating supply at time of blockchain migration - LegacyV9ForkHeight: big.NewInt(0), - LegacyToSmartchainMigrationHeight: big.NewInt(0), - PriorityTransactorsContractAddress: common.Address{}, + GenesisETN: math.MustParseBig256("17964946965760000000000000000"), // = terminal circulating supply for legacy mainnet [0,1806749}. Legacy emissions are burned from height 1806749 onwards + LegacyV9ForkHeight: big.NewInt(862866), + LegacyToSmartchainMigrationHeight: big.NewInt(1806749), + PriorityTransactorsContractAddress: common.HexToAddress("0x92cdf1fc0e54d3150f100265ae2717b0689660ee"), + Transitions: []Transition{}, } // StagenetChainConfig is the chain parameters to run a node on the test network. From 7f4efee850930caa1f9292aae8f6d081119f117e Mon Sep 17 00:00:00 2001 From: Christopher Harrison Date: Wed, 28 Feb 2024 19:09:36 +0000 Subject: [PATCH 10/13] Fix lint --- core/genesis.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/genesis.go b/core/genesis.go index 65fcf4540..2f35d4e7f 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -22,9 +22,10 @@ import ( "encoding/json" "errors" "fmt" - "github.com/electroneum/electroneum-sc/rlp" "math/big" + "github.com/electroneum/electroneum-sc/rlp" + "github.com/electroneum/electroneum-sc/common" "github.com/electroneum/electroneum-sc/common/hexutil" "github.com/electroneum/electroneum-sc/common/math" @@ -423,7 +424,6 @@ func GenesisBlockForTesting(db ethdb.Database, addr common.Address, balance *big } func GenerateGenesisExtraDataForIBFTValSet(valset []common.Address) []byte { - // Initialize a pointer to an instance of types.QBFTExtra extra := &types.QBFTExtra{ VanityData: make([]byte, 32), From 86cde6e2391f575feeec40610482e6f8b3ba89f9 Mon Sep 17 00:00:00 2001 From: Christopher Harrison Date: Wed, 28 Feb 2024 19:20:22 +0000 Subject: [PATCH 11/13] Upgrade actions versions in workflows so that node20 is used --- .github/workflows/build-test.yml | 6 +++--- .github/workflows/lint.yml | 6 +++--- .github/workflows/unit-test.yml | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index 245b1ecb0..17d8c4b27 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -20,14 +20,14 @@ jobs: runs-on: ${{ matrix.os }} steps: - name: Install Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v5 with: go-version: ${{ matrix.go-version }} - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v4 - - uses: actions/cache@v2 + - uses: actions/cache@v4 with: # In order: # * Module download cache diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index afdabc769..afbfeecd9 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -20,14 +20,14 @@ jobs: runs-on: ${{ matrix.os }} steps: - name: Install Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v5 with: go-version: ${{ matrix.go-version }} - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v4 - - uses: actions/cache@v2 + - uses: actions/cache@v4 with: # In order: # * Module download cache diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index cd1efa659..7b2e53c53 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -20,14 +20,14 @@ jobs: runs-on: ${{ matrix.os }} steps: - name: Install Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v5 with: go-version: ${{ matrix.go-version }} - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v4 - - uses: actions/cache@v2 + - uses: actions/cache@v4 with: # In order: # * Module download cache From 3ef18544e7fb624e792c7edc3f339bc06281e906 Mon Sep 17 00:00:00 2001 From: Christopher Harrison Date: Wed, 28 Feb 2024 21:04:40 +0000 Subject: [PATCH 12/13] Fix for unit tests --- cmd/etn-sc/consolecmd_test.go | 4 ++-- core/genesis.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cmd/etn-sc/consolecmd_test.go b/cmd/etn-sc/consolecmd_test.go index 52cbc627c..4b69d7651 100644 --- a/cmd/etn-sc/consolecmd_test.go +++ b/cmd/etn-sc/consolecmd_test.go @@ -62,7 +62,7 @@ func TestConsoleWelcome(t *testing.T) { geth.SetTemplateFunc("gover", runtime.Version) geth.SetTemplateFunc("gethver", func() string { return params.VersionWithCommit("", "") }) geth.SetTemplateFunc("niltime", func() string { - return time.Unix(1655988353, 0).Format("Mon Jan 02 2006 15:04:05 GMT-0700 (MST)") + return time.Unix(1707989393, 0).Format("Mon Jan 02 2006 15:04:05 GMT-0700 (MST)") }) geth.SetTemplateFunc("apis", func() string { return ipcAPIs }) @@ -132,7 +132,7 @@ func testAttachWelcome(t *testing.T, geth *testgeth, endpoint, apis string) { attach.SetTemplateFunc("gover", runtime.Version) attach.SetTemplateFunc("gethver", func() string { return params.VersionWithCommit("", "") }) attach.SetTemplateFunc("niltime", func() string { - return time.Unix(1655988353, 0).Format("Mon Jan 02 2006 15:04:05 GMT-0700 (MST)") + return time.Unix(1707989393, 0).Format("Mon Jan 02 2006 15:04:05 GMT-0700 (MST)") }) attach.SetTemplateFunc("ipc", func() bool { return strings.HasPrefix(endpoint, "ipc") }) attach.SetTemplateFunc("datadir", func() string { return geth.Datadir }) diff --git a/core/genesis.go b/core/genesis.go index 2f35d4e7f..7b108d1af 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -439,8 +439,8 @@ func GenerateGenesisExtraDataForIBFTValSet(valset []common.Address) []byte { panic("RLP Encoding of genesis extra failed. Unable to create genesis block") } - genesisExtraDataHex := hex.EncodeToString(extraBytes) - fmt.Println(genesisExtraDataHex) + //genesisExtraDataHex := hex.EncodeToString(extraBytes) + //fmt.Println(genesisExtraDataHex) return extraBytes } From a1cb49460083e0d3fc107390cffb204f5600be15 Mon Sep 17 00:00:00 2001 From: Christopher Harrison Date: Thu, 29 Feb 2024 09:22:22 +0000 Subject: [PATCH 13/13] Tidy up --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 07ae69e2e..acac129ed 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ Electroneum Smart Chain supports cross-chain transfers between our legacy Electr For prerequisites and detailed build instructions please read the [Installation Instructions](https://github.com/electroneum/electroneum-sc/wiki/Install-and-Build). -Building `etn-sc` requires both a Go (version 1.16 or later) and a C compiler. You can install +Building `etn-sc` requires both a Go (version 1.19 or later) and a C compiler. You can install them using your favourite package manager. Once the dependencies are installed, run ```shell @@ -135,7 +135,7 @@ Specifying the `--testnet` flag, however, will reconfigure your `etn-sc` instanc *Note: Although there are some internal protective measures to prevent transactions from crossing over between the main network and test network, you should make sure to always use separate accounts for play-cryptocurrency and real-cryptocurrency. Unless you manually move -accounts, `ls etn-sc` will by default correctly separate the two networks and will not make any +accounts, `etn-sc` will by default correctly separate the two networks and will not make any accounts available between them.* ### Configuration