Skip to content

Commit

Permalink
Merge pull request #5 from algorandskiy/pavel/cce/newacctdeltas-resou…
Browse files Browse the repository at this point in the history
…rces
  • Loading branch information
cce authored Jan 13, 2022
2 parents ac527ea + a054cc0 commit f144f94
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 19 deletions.
11 changes: 11 additions & 0 deletions ledger/apply/application.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,17 @@ func createApplication(ac *transactions.ApplicationCallTxnFields, balances Balan

// Allocate the new app params (+ 1 to match Assets Idx namespace)
appIdx = basics.AppIndex(txnCounter + 1)

// Sanity check that there isn't an app with this counter value.
_, present, err := balances.GetAppParams(creator, appIdx)
if err != nil {
return
}
if present {
err = fmt.Errorf("already found app with index %d", appIdx)
return
}

params := basics.AppParams{
ApprovalProgram: ac.ApprovalProgram,
ClearStateProgram: ac.ClearStateProgram,
Expand Down
3 changes: 3 additions & 0 deletions ledger/internal/appcow_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -970,6 +970,9 @@ func TestApplyStorageDelta(t *testing.T) {
TotalAppLocalStates: 1,
}},
)
baseCow := makeRoundCowBase(nil, 0, 0, 0, config.ConsensusParams{})
baseCow.updateAppResourceCache(ledgercore.AccountApp{Address: addr, App: 1}, ledgercore.AccountResource{})
cow.lookupParent = baseCow

err := applyStorageDelta(cow, addr, storagePtr{1, true}, &sd)
a.NoError(err)
Expand Down
20 changes: 16 additions & 4 deletions ledger/internal/eval.go
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,10 @@ func (x *roundCowBase) updateAppResourceCache(aa ledgercore.AccountApp, r ledger
func (x *roundCowBase) lookupAppParams(addr basics.Address, aidx basics.AppIndex, fromCache bool) (ledgercore.AppParamsDelta, bool, error) {
aa := ledgercore.AccountApp{Address: addr, App: aidx}
if result, ok := x.appParams[aa]; ok {
return ledgercore.AppParamsDelta{Params: &result.value}, result.exists, nil
if !result.exists {
return ledgercore.AppParamsDelta{}, false, nil
}
return ledgercore.AppParamsDelta{Params: &result.value}, true, nil
}

if fromCache { // hasn't been found yet; we were asked not to query DB
Expand All @@ -239,7 +242,10 @@ func (x *roundCowBase) lookupAppParams(addr basics.Address, aidx basics.AppIndex
func (x *roundCowBase) lookupAssetParams(addr basics.Address, aidx basics.AssetIndex, fromCache bool) (ledgercore.AssetParamsDelta, bool, error) {
aa := ledgercore.AccountAsset{Address: addr, Asset: aidx}
if result, ok := x.assetParams[aa]; ok {
return ledgercore.AssetParamsDelta{Params: &result.value}, result.exists, nil
if !result.exists {
return ledgercore.AssetParamsDelta{}, false, nil
}
return ledgercore.AssetParamsDelta{Params: &result.value}, true, nil
}

if fromCache { // hasn't been found yet; we were asked not to query DB
Expand All @@ -262,7 +268,10 @@ func (x *roundCowBase) lookupAssetParams(addr basics.Address, aidx basics.AssetI
func (x *roundCowBase) lookupAppLocalState(addr basics.Address, aidx basics.AppIndex, fromCache bool) (ledgercore.AppLocalStateDelta, bool, error) {
aa := ledgercore.AccountApp{Address: addr, App: aidx}
if result, ok := x.appLocalStates[aa]; ok {
return ledgercore.AppLocalStateDelta{State: &result.value}, result.exists, nil
if !result.exists {
return ledgercore.AppLocalStateDelta{}, false, nil
}
return ledgercore.AppLocalStateDelta{State: &result.value}, true, nil
}

if fromCache { // hasn't been found yet; we were asked not to query DB
Expand All @@ -285,7 +294,10 @@ func (x *roundCowBase) lookupAppLocalState(addr basics.Address, aidx basics.AppI
func (x *roundCowBase) lookupAssetHolding(addr basics.Address, aidx basics.AssetIndex, fromCache bool) (ledgercore.AssetHoldingDelta, bool, error) {
aa := ledgercore.AccountAsset{Address: addr, Asset: aidx}
if result, ok := x.assets[aa]; ok {
return ledgercore.AssetHoldingDelta{Holding: &result.value}, result.exists, nil
if !result.exists {
return ledgercore.AssetHoldingDelta{}, false, nil
}
return ledgercore.AssetHoldingDelta{Holding: &result.value}, true, nil
}

if fromCache { // hasn't been found yet; we were asked not to query DB
Expand Down
42 changes: 27 additions & 15 deletions ledger/ledgercore/statedelta.go
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ type NewAccountDeltas struct {
// cache for addr to deltas index resolution
acctsCache map[basics.Address]int

// AppResources deltas. If app params or local state is deleted, there is a nil value in appResources.Params or appResources.State
// AppResources deltas. If app params or local state is deleted, there is a nil value in appResources.Params or appResources.State and Deleted flag set
appResources []AppResourceRecord
// caches for {addr, app id} to app params delta resolution
appResourcesCache map[AccountApp]int
Expand Down Expand Up @@ -213,40 +213,48 @@ func (ad NewAccountDeltas) GetData(addr basics.Address) (AccountData, bool) {
func (ad NewAccountDeltas) GetAppParams(addr basics.Address, aidx basics.AppIndex) (AppParamsDelta, bool) {
idx, ok := ad.appResourcesCache[AccountApp{addr, aidx}]
var result AppParamsDelta
var exist bool
if ok {
result = ad.appResources[idx].Params
exist = result.Deleted || result.Params != nil
}
return result, ok
return result, exist
}

// GetAssetParams returns asset params delta value
func (ad NewAccountDeltas) GetAssetParams(addr basics.Address, aidx basics.AssetIndex) (AssetParamsDelta, bool) {
idx, ok := ad.assetResourcesCache[AccountAsset{addr, aidx}]
var result AssetParamsDelta
var exist bool
if ok {
result = ad.assetResources[idx].Params
exist = result.Deleted || result.Params != nil
}
return result, ok
return result, exist
}

// GetAppLocalState returns app local state delta value
func (ad NewAccountDeltas) GetAppLocalState(addr basics.Address, aidx basics.AppIndex) (AppLocalStateDelta, bool) {
idx, ok := ad.appResourcesCache[AccountApp{addr, aidx}]
var result AppLocalStateDelta
var exist bool
if ok {
result = ad.appResources[idx].State
exist = result.Deleted || result.State != nil
}
return result, ok
return result, exist
}

// GetAssetHolding returns asset holding delta value
func (ad NewAccountDeltas) GetAssetHolding(addr basics.Address, aidx basics.AssetIndex) (AssetHoldingDelta, bool) {
idx, ok := ad.assetResourcesCache[AccountAsset{addr, aidx}]
var result AssetHoldingDelta
var exist bool
if ok {
result = ad.assetResources[idx].Holding
exist = result.Deleted || result.Holding != nil
}
return result, ok
return result, exist
}

// ModifiedAccounts returns list of addresses of modified accounts
Expand Down Expand Up @@ -505,11 +513,13 @@ func (ad NewAccountDeltas) ToModifiedCreatables(seen map[basics.CreatableIndex]s
Created: false,
Creator: aapp.Address,
}
} else if _, ok := seen[basics.CreatableIndex(rec.Aidx)]; !ok {
result[basics.CreatableIndex(rec.Aidx)] = ModifiedCreatable{
Ctype: basics.AppCreatable,
Created: true,
Creator: aapp.Address,
} else if rec.Params.Params != nil {
if _, ok := seen[basics.CreatableIndex(rec.Aidx)]; !ok {
result[basics.CreatableIndex(rec.Aidx)] = ModifiedCreatable{
Ctype: basics.AppCreatable,
Created: true,
Creator: aapp.Address,
}
}
}
}
Expand All @@ -522,11 +532,13 @@ func (ad NewAccountDeltas) ToModifiedCreatables(seen map[basics.CreatableIndex]s
Created: false,
Creator: aapp.Address,
}
} else if _, ok := seen[basics.CreatableIndex(rec.Aidx)]; !ok {
result[basics.CreatableIndex(rec.Aidx)] = ModifiedCreatable{
Ctype: basics.AssetCreatable,
Created: true,
Creator: aapp.Address,
} else if rec.Params.Params != nil {
if _, ok := seen[basics.CreatableIndex(rec.Aidx)]; !ok {
result[basics.CreatableIndex(rec.Aidx)] = ModifiedCreatable{
Ctype: basics.AssetCreatable,
Created: true,
Creator: aapp.Address,
}
}
}
}
Expand Down

0 comments on commit f144f94

Please sign in to comment.