diff --git a/agreement/fuzzer/ledger_test.go b/agreement/fuzzer/ledger_test.go index efe21958ad..6fb752a565 100644 --- a/agreement/fuzzer/ledger_test.go +++ b/agreement/fuzzer/ledger_test.go @@ -19,6 +19,7 @@ package fuzzer import ( "context" "fmt" + "maps" "math/rand" "github.com/algorand/go-algorand/agreement" @@ -152,11 +153,8 @@ func makeTestLedger(state map[basics.Address]basics.AccountData, sync testLedger l.certs = make(map[basics.Round]agreement.Certificate) l.nextRound = 1 - // deep copy of state l.state = make(map[basics.Address]basics.AccountData) - for k, v := range state { - l.state[k] = v - } + maps.Copy(l.state, state) l.notifications = make(map[basics.Round]signal) l.EnsuringDigestStartCh = make(chan struct{}) diff --git a/config/consensus.go b/config/consensus.go index 36daad899b..3045b83eb9 100644 --- a/config/consensus.go +++ b/config/consensus.go @@ -17,6 +17,7 @@ package config import ( + "maps" "time" "github.com/algorand/go-algorand/config/bounds" @@ -768,13 +769,7 @@ func (cp ConsensusProtocols) DeepCopy() ConsensusProtocols { staticConsensus := make(ConsensusProtocols) for consensusVersion, consensusParams := range cp { // recreate the ApprovedUpgrades map since we don't want to modify the original one. - if consensusParams.ApprovedUpgrades != nil { - newApprovedUpgrades := make(map[protocol.ConsensusVersion]uint64) - for ver, when := range consensusParams.ApprovedUpgrades { - newApprovedUpgrades[ver] = when - } - consensusParams.ApprovedUpgrades = newApprovedUpgrades - } + consensusParams.ApprovedUpgrades = maps.Clone(consensusParams.ApprovedUpgrades) staticConsensus[consensusVersion] = consensusParams } return staticConsensus diff --git a/crypto/merkletrie/cache.go b/crypto/merkletrie/cache.go index 6132007559..5d8fd78779 100644 --- a/crypto/merkletrie/cache.go +++ b/crypto/merkletrie/cache.go @@ -256,9 +256,7 @@ func (mtc *merkleTrieCache) loadPage(page uint64) (err error) { mtc.cachedNodeCount += len(mtc.pageToNIDsPtr[page]) } else { mtc.cachedNodeCount -= len(mtc.pageToNIDsPtr[page]) - for nodeID, pnode := range decodedNodes { - mtc.pageToNIDsPtr[page][nodeID] = pnode - } + maps.Copy(mtc.pageToNIDsPtr[page], decodedNodes) mtc.cachedNodeCount += len(mtc.pageToNIDsPtr[page]) } @@ -485,9 +483,7 @@ func (mtc *merkleTrieCache) reallocatePendingPages(stats *CommitStats) (pagesToC delete(createdPages, page) } - for pageID, page := range mtc.reallocatedPages { - createdPages[pageID] = page - } + maps.Copy(createdPages, mtc.reallocatedPages) for _, nodeIDs := range createdPages { for _, node := range nodeIDs { diff --git a/data/account/registeryDbOps.go b/data/account/registeryDbOps.go index b8668d1893..165f53c41d 100644 --- a/data/account/registeryDbOps.go +++ b/data/account/registeryDbOps.go @@ -21,6 +21,7 @@ import ( "database/sql" "errors" "fmt" + "maps" "strings" "github.com/algorand/go-algorand/data/basics" @@ -257,9 +258,7 @@ func (f *flushOp) apply(db *participationDB) error { if err != nil { // put back what we didn't finish with db.mutex.Lock() - for id, v := range dirty { - db.dirty[id] = v - } + maps.Copy(db.dirty, dirty) db.mutex.Unlock() } diff --git a/data/basics/serr.go b/data/basics/serr.go index c788c6ad4a..cf65e9d911 100644 --- a/data/basics/serr.go +++ b/data/basics/serr.go @@ -18,6 +18,7 @@ package basics import ( "errors" + "maps" "strings" "golang.org/x/exp/slog" @@ -108,9 +109,7 @@ func Wrap(err error, msg string, field string, pairs ...any) error { var inner *SError if ok := errors.As(err, &inner); ok { attributes := make(map[string]any, len(inner.Attrs)) - for key, val := range inner.Attrs { - attributes[key] = val - } + maps.Copy(attributes, inner.Attrs) serr.Attrs[field+"-attrs"] = attributes } diff --git a/data/pools/transactionPool.go b/data/pools/transactionPool.go index dfdc633262..936f849922 100644 --- a/data/pools/transactionPool.go +++ b/data/pools/transactionPool.go @@ -19,6 +19,7 @@ package pools import ( "errors" "fmt" + "maps" "sync" "sync/atomic" "time" @@ -268,9 +269,7 @@ func (pool *TransactionPool) rememberCommit(flush bool) { } else { pool.pendingTxGroups = append(pool.pendingTxGroups, pool.rememberedTxGroups...) - for txid, txn := range pool.rememberedTxids { - pool.pendingTxids[txid] = txn - } + maps.Copy(pool.pendingTxids, pool.rememberedTxids) } pool.rememberedTxGroups = nil diff --git a/data/transactions/logic/mocktracer/scenarios.go b/data/transactions/logic/mocktracer/scenarios.go index c1210ee1ee..c0f4d11fb2 100644 --- a/data/transactions/logic/mocktracer/scenarios.go +++ b/data/transactions/logic/mocktracer/scenarios.go @@ -19,6 +19,7 @@ package mocktracer import ( "encoding/hex" "fmt" + "maps" "math" "github.com/algorand/go-algorand/crypto" @@ -836,9 +837,7 @@ func MergeStateDeltas(deltas ...ledgercore.StateDelta) ledgercore.StateDelta { includedTx.Intra += txidBase result.Txids[txid] = includedTx } - for lease, round := range delta.Txleases { - result.Txleases[lease] = round - } + maps.Copy(result.Txleases, delta.Txleases) } return result } diff --git a/ledger/acctdeltas_test.go b/ledger/acctdeltas_test.go index 7c1dd70eb7..6169d89016 100644 --- a/ledger/acctdeltas_test.go +++ b/ledger/acctdeltas_test.go @@ -23,6 +23,7 @@ import ( "encoding/binary" "errors" "fmt" + "maps" "math" "math/rand" "os" @@ -188,9 +189,7 @@ func creatablesFromUpdates(base map[basics.Address]basics.AccountData, updates l func applyPartialDeltas(base map[basics.Address]basics.AccountData, deltas ledgercore.AccountDeltas) map[basics.Address]basics.AccountData { result := make(map[basics.Address]basics.AccountData, len(base)+deltas.Len()) - for addr, ad := range base { - result[addr] = ad - } + maps.Copy(result, base) for i := 0; i < deltas.Len(); i++ { addr, _ := deltas.GetByIdx(i) @@ -1484,18 +1483,10 @@ func (m mockAccountWriter) clone() (m2 mockAccountWriter) { m2.resources = make(map[mockResourcesKey]ledgercore.AccountResource, len(m.resources)) m2.addresses = make(map[basics.Address]trackerdb.AccountRef, len(m.resources)) m2.rowids = make(map[trackerdb.AccountRef]basics.Address, len(m.rowids)) - for k, v := range m.accounts { - m2.accounts[k] = v - } - for k, v := range m.resources { - m2.resources[k] = v - } - for k, v := range m.addresses { - m2.addresses[k] = v - } - for k, v := range m.rowids { - m2.rowids[k] = v - } + maps.Copy(m2.accounts, m.accounts) + maps.Copy(m2.resources, m.resources) + maps.Copy(m2.addresses, m.addresses) + maps.Copy(m2.rowids, m.rowids) m2.lastAcctRef = m.lastAcctRef m2.availAcctRefs = m.availAcctRefs return m2 diff --git a/ledger/acctonline_test.go b/ledger/acctonline_test.go index d45f7da550..6969d48b0b 100644 --- a/ledger/acctonline_test.go +++ b/ledger/acctonline_test.go @@ -19,6 +19,7 @@ package ledger import ( "context" "fmt" + "maps" "sort" "strconv" "testing" @@ -871,9 +872,7 @@ func TestAcctOnlineCacheDBSync(t *testing.T) { copyGenesisAccts := func() []map[basics.Address]basics.AccountData { accounts := []map[basics.Address]basics.AccountData{{}} accounts[0] = make(map[basics.Address]basics.AccountData, numAccts) - for addr, ad := range genesisAccts[0] { - accounts[0][addr] = ad - } + maps.Copy(accounts[0], genesisAccts[0]) return accounts } diff --git a/ledger/acctupdates_test.go b/ledger/acctupdates_test.go index 892cf43766..0d380c3cce 100644 --- a/ledger/acctupdates_test.go +++ b/ledger/acctupdates_test.go @@ -21,6 +21,7 @@ import ( "context" "errors" "fmt" + "maps" "os" "runtime" "strings" @@ -167,15 +168,12 @@ func (ml *mockLedgerForTracker) fork(t testing.TB) *mockLedgerForTracker { log: dblogger, blocks: make([]blockEntry, len(ml.blocks)), deltas: make([]ledgercore.StateDelta, len(ml.deltas)), - accts: make(map[basics.Address]basics.AccountData), + accts: maps.Clone(ml.accts), filename: fn, consensusParams: ml.consensusParams, consensusVersion: ml.consensusVersion, trackers: trackerRegistry{log: dblogger}, } - for k, v := range ml.accts { - newLedgerTracker.accts[k] = v - } copy(newLedgerTracker.blocks, ml.blocks) copy(newLedgerTracker.deltas, ml.deltas) diff --git a/ledger/eval/eval_test.go b/ledger/eval/eval_test.go index c66cc9e182..0f176fb41f 100644 --- a/ledger/eval/eval_test.go +++ b/ledger/eval/eval_test.go @@ -21,6 +21,7 @@ import ( "context" "errors" "fmt" + "maps" "math/rand" "testing" @@ -886,9 +887,7 @@ func (ledger *evalTestLedger) AddValidatedBlock(vb ledgercore.ValidatedBlock, ce newBalances := make(map[basics.Address]basics.AccountData) // copy the previous balances. - for k, v := range ledger.roundBalances[vb.Block().Round()-1] { - newBalances[k] = v - } + maps.Copy(newBalances, ledger.roundBalances[vb.Block().Round()-1]) // update deltas := vb.Delta() diff --git a/ledger/ledgercore/statedelta.go b/ledger/ledgercore/statedelta.go index 4297afc329..4748a5da9f 100644 --- a/ledger/ledgercore/statedelta.go +++ b/ledger/ledgercore/statedelta.go @@ -764,9 +764,7 @@ func (ad AccountDeltas) ApplyToBasicsAccountData(addr basics.Address, prev basic if acct.TotalAppParams > 0 || prev.AppParams != nil { result.AppParams = make(map[basics.AppIndex]basics.AppParams) - for aidx, params := range prev.AppParams { - result.AppParams[aidx] = params - } + maps.Copy(result.AppParams, prev.AppParams) for aapp, idx := range ad.appResourcesCache { if aapp.Address == addr { rec := ad.AppResources[idx] @@ -784,9 +782,7 @@ func (ad AccountDeltas) ApplyToBasicsAccountData(addr basics.Address, prev basic if acct.TotalAppLocalStates > 0 || prev.AppLocalStates != nil { result.AppLocalStates = make(map[basics.AppIndex]basics.AppLocalState) - for aidx, state := range prev.AppLocalStates { - result.AppLocalStates[aidx] = state - } + maps.Copy(result.AppLocalStates, prev.AppLocalStates) for aapp, idx := range ad.appResourcesCache { if aapp.Address == addr { rec := ad.AppResources[idx] @@ -804,9 +800,7 @@ func (ad AccountDeltas) ApplyToBasicsAccountData(addr basics.Address, prev basic if acct.TotalAssetParams > 0 || prev.AssetParams != nil { result.AssetParams = make(map[basics.AssetIndex]basics.AssetParams) - for aidx, params := range prev.AssetParams { - result.AssetParams[aidx] = params - } + maps.Copy(result.AssetParams, prev.AssetParams) for aapp, idx := range ad.assetResourcesCache { if aapp.Address == addr { rec := ad.AssetResources[idx] @@ -824,9 +818,7 @@ func (ad AccountDeltas) ApplyToBasicsAccountData(addr basics.Address, prev basic if acct.TotalAssets > 0 || prev.Assets != nil { result.Assets = make(map[basics.AssetIndex]basics.AssetHolding) - for aidx, params := range prev.Assets { - result.Assets[aidx] = params - } + maps.Copy(result.Assets, prev.Assets) for aapp, idx := range ad.assetResourcesCache { if aapp.Address == addr { rec := ad.AssetResources[idx] diff --git a/network/multiplexer.go b/network/multiplexer.go index 4d498afb17..abe5d209f4 100644 --- a/network/multiplexer.go +++ b/network/multiplexer.go @@ -18,6 +18,7 @@ package network import ( "fmt" + "maps" "sync/atomic" ) @@ -83,11 +84,8 @@ func (m *Multiplexer) ValidateHandle(msg IncomingMessage) OutgoingMessage { func registerMultiplexer[T any](target *atomic.Value, dispatch []taggedMessageDispatcher[T]) { mp := make(map[Tag]T) - if existingMap := getMap[T](target); existingMap != nil { - for k, v := range existingMap { - mp[k] = v - } - } + existingMap := getMap[T](target) + maps.Copy(mp, existingMap) for _, v := range dispatch { if _, has := mp[v.Tag]; has { panic(fmt.Sprintf("Already registered a handler for tag %v", v.Tag)) diff --git a/network/wsNetwork.go b/network/wsNetwork.go index 184616e998..742b1a3d12 100644 --- a/network/wsNetwork.go +++ b/network/wsNetwork.go @@ -23,6 +23,7 @@ import ( "errors" "fmt" "io" + "maps" "net" "net/http" "net/textproto" @@ -2469,9 +2470,7 @@ func (wn *WebsocketNetwork) registerMessageInterest(t protocol.Tag) { if wn.messagesOfInterest == nil { wn.messagesOfInterest = make(map[protocol.Tag]bool) - for tag, flag := range defaultSendMessageTags { - wn.messagesOfInterest[tag] = flag - } + maps.Copy(wn.messagesOfInterest, defaultSendMessageTags) } wn.messagesOfInterest[t] = true @@ -2485,9 +2484,7 @@ func (wn *WebsocketNetwork) DeregisterMessageInterest(t protocol.Tag) { if wn.messagesOfInterest == nil { wn.messagesOfInterest = make(map[protocol.Tag]bool) - for tag, flag := range defaultSendMessageTags { - wn.messagesOfInterest[tag] = flag - } + maps.Copy(wn.messagesOfInterest, defaultSendMessageTags) } delete(wn.messagesOfInterest, t) diff --git a/shared/pingpong/accounts.go b/shared/pingpong/accounts.go index 3b86e868a3..f1d60a9112 100644 --- a/shared/pingpong/accounts.go +++ b/shared/pingpong/accounts.go @@ -20,6 +20,7 @@ import ( "encoding/binary" "fmt" "log" + "maps" "math/rand" "os" "path/filepath" @@ -456,9 +457,7 @@ func (pps *WorkerState) makeNewAssets(client *libgoal.Client) (err error) { break } } - for assetID, ap := range newAssets { - pps.cinfo.AssetParams[assetID] = ap - } + maps.Copy(pps.cinfo.AssetParams, newAssets) return nil } diff --git a/test/e2e-go/stress/transactions/createManyAndGoOnline_test.go b/test/e2e-go/stress/transactions/createManyAndGoOnline_test.go index 380690df65..3f7d779afc 100644 --- a/test/e2e-go/stress/transactions/createManyAndGoOnline_test.go +++ b/test/e2e-go/stress/transactions/createManyAndGoOnline_test.go @@ -17,6 +17,7 @@ package transactions import ( + "maps" "path/filepath" "testing" @@ -82,17 +83,13 @@ func TestManyAccountsCanGoOnline(t *testing.T) { txidsToAccountsWaveTwo := make(map[string]string) for _, account := range txidsToAccountsWaveOne { txidsToChildAccounts := cascadeCreateAndFundAccounts(amountToSend, transactionFee, account, client, a) - for txid, account := range txidsToChildAccounts { - txidsToAccountsWaveTwo[txid] = account - } + maps.Copy(txidsToAccountsWaveTwo, txidsToChildAccounts) } allConfirmed = fixture.WaitForAllTxnsToConfirm(fundingTimeoutRound, txidsToAccountsWaveTwo) a.True(allConfirmed, "Not all transactions confirmed. Failing test and aborting early.") for _, account := range txidsToAccountsWaveOne { txidsToChildAccounts := cascadeCreateAndFundAccounts(amountToSend, transactionFee, account, client, a) - for txid, account := range txidsToChildAccounts { - txidsToAccountsWaveTwo[txid] = account - } + maps.Copy(txidsToAccountsWaveTwo, txidsToChildAccounts) } allConfirmed = fixture.WaitForAllTxnsToConfirm(fundingTimeoutRound, txidsToAccountsWaveTwo) a.True(allConfirmed, "Not all transactions confirmed. Failing test and aborting early.") @@ -103,18 +100,14 @@ func TestManyAccountsCanGoOnline(t *testing.T) { txidsToAccountsWaveThree := make(map[string]string) for _, account := range txidsToAccountsWaveTwo { txidsToChildAccounts := cascadeCreateAndFundAccounts(amountToSend, transactionFee, account, client, a) - for txid, account := range txidsToChildAccounts { - txidsToAccountsWaveThree[txid] = account - } + maps.Copy(txidsToAccountsWaveThree, txidsToChildAccounts) } allConfirmed = fixture.WaitForAllTxnsToConfirm(fundingTimeoutRound, txidsToAccountsWaveThree) a.True(allConfirmed, "Not all transactions confirmed. Failing test and aborting early.") for _, account := range txidsToAccountsWaveTwo { txidsToChildAccounts := cascadeCreateAndFundAccounts(amountToSend, transactionFee, account, client, a) - for txid, account := range txidsToChildAccounts { - txidsToAccountsWaveThree[txid] = account - } + maps.Copy(txidsToAccountsWaveThree, txidsToChildAccounts) } allConfirmed = fixture.WaitForAllTxnsToConfirm(fundingTimeoutRound, txidsToAccountsWaveThree) a.True(allConfirmed, "Not all transactions confirmed. Failing test and aborting early.")