Skip to content

Commit

Permalink
Merge new ContractDetails trie with existing ContractDetails in anoth…
Browse files Browse the repository at this point in the history
…er branch
  • Loading branch information
Diego López León committed Sep 28, 2018
1 parent 8d6b687 commit 3fecce8
Show file tree
Hide file tree
Showing 8 changed files with 37 additions and 11 deletions.
8 changes: 7 additions & 1 deletion rskj-core/src/main/java/co/rsk/db/ContractDetailsImpl.java
Expand Up @@ -384,6 +384,12 @@ public boolean isNullObject() {
return (code==null || code.length==0) && keys.isEmpty();
}

@Override
public void mergeStore(ContractDetails storeContractDetails) {
((ContractDetailsImpl) storeContractDetails).getTrie().copyTo(((TrieImpl)this.trie).getStore());
checkExternalStorage();
}

public Trie getTrie() {
return this.trie;
}
Expand All @@ -401,7 +407,7 @@ private void removeKey(byte[] key) {
}

private void checkExternalStorage() {
this.externalStorage = (keys.size() > memoryStorageLimit) || this.externalStorage;
this.externalStorage = true;
}

private String getDataSourceName() {
Expand Down
18 changes: 12 additions & 6 deletions rskj-core/src/main/java/co/rsk/db/RepositoryImpl.java
Expand Up @@ -97,7 +97,7 @@ public synchronized AccountState createAccount(RskAddress addr) {
null,
trieStoreFactory,
memoryStorageLimit
));
), null);
return accountState;
}

Expand Down Expand Up @@ -181,7 +181,7 @@ public synchronized void saveCode(RskAddress addr, byte[] code) {
details.setCode(code);
accountState.setCodeHash(Keccak256Helper.keccak256(code));

updateContractDetails(addr, details);
updateContractDetails(addr, details, null);
updateAccountState(addr, accountState);
}

Expand Down Expand Up @@ -217,7 +217,7 @@ public synchronized void addStorageRow(RskAddress addr, DataWord key, DataWord v

details.put(key, value);

updateContractDetails(addr, details);
updateContractDetails(addr, details, null);
}

@Override
Expand All @@ -231,7 +231,7 @@ public synchronized void addStorageBytes(RskAddress addr, DataWord key, byte[] v

details.putBytes(key, value);

updateContractDetails(addr, details);
updateContractDetails(addr, details, null);
}

@Override
Expand Down Expand Up @@ -366,8 +366,9 @@ public synchronized void updateBatch(Map<RskAddress, AccountState> stateCache,
}

contractDetails = contractDetailsCache.getOriginalContractDetails();
ContractDetails storeContractDetails = detailsDataStore.get(addr);

updateContractDetails(addr, contractDetails);
updateContractDetails(addr, contractDetails, storeContractDetails);

if (!Arrays.equals(accountState.getCodeHash(), EMPTY_TRIE_HASH)) {
accountState.setStateRoot(contractDetails.getStorageHash());
Expand Down Expand Up @@ -423,7 +424,12 @@ public synchronized DetailsDataStore getDetailsDataStore() {
}

@Override
public synchronized void updateContractDetails(RskAddress addr, final ContractDetails contractDetails) {
public synchronized void updateContractDetails(RskAddress addr,
final ContractDetails contractDetails,
final ContractDetails storeContractDetails) {
if (storeContractDetails != null) {
contractDetails.mergeStore(storeContractDetails);
}
detailsDataStore.update(addr, contractDetails);
}

Expand Down
5 changes: 4 additions & 1 deletion rskj-core/src/main/java/org/ethereum/core/Repository.java
Expand Up @@ -199,7 +199,10 @@ void loadAccount(RskAddress addr,

DetailsDataStore getDetailsDataStore();

void updateContractDetails(RskAddress addr, final ContractDetails contractDetails);
void updateContractDetails(
RskAddress addr,
final ContractDetails contractDetails,
ContractDetails storeContractDetails);

void updateAccountState(RskAddress addr, AccountState accountState);

Expand Down
Expand Up @@ -130,7 +130,8 @@ public BlockChainImpl loadBlockchain() {
accountState.setNonce(initialAddressState.getAccountState().getNonce());

if (initialAddressState.getContractDetails()!=null) {
repository.updateContractDetails(addr, initialAddressState.getContractDetails());
repository.updateContractDetails(addr, initialAddressState.getContractDetails(),
null);
accountState.setStateRoot(initialAddressState.getAccountState().getStateRoot());
accountState.setCodeHash(initialAddressState.getAccountState().getCodeHash());
}
Expand Down
2 changes: 2 additions & 0 deletions rskj-core/src/main/java/org/ethereum/db/ContractDetails.java
Expand Up @@ -78,4 +78,6 @@ public interface ContractDetails {
ContractDetails getSnapshotTo(byte[] hash);

boolean isNullObject();

void mergeStore(ContractDetails storeContractDetails);
}
Expand Up @@ -305,6 +305,11 @@ public boolean isNullObject() {
return origContract.isNullObject() && (MapUtils.isEmpty(storage));
}

@Override
public void mergeStore(ContractDetails storeContractDetails) {
throw new UnsupportedOperationException("No merge option during cache state");
}

public ContractDetails getOriginalContractDetails() {
return this.origContract;
}
Expand Down
5 changes: 4 additions & 1 deletion rskj-core/src/main/java/org/ethereum/vm/program/Storage.java
Expand Up @@ -245,7 +245,10 @@ public DetailsDataStore getDetailsDataStore() {
}

@Override
public void updateContractDetails(RskAddress addr, ContractDetails contractDetails) {
public void updateContractDetails(
RskAddress addr,
ContractDetails contractDetails,
ContractDetails storeContractDetails) {
throw new UnsupportedOperationException();
}

Expand Down
Expand Up @@ -135,7 +135,7 @@ public void testContracts() throws Exception {
contractDetails.setCode(new byte[] {1, 2, 3, 4});
contractDetails.put(DataWord.ZERO, DataWord.ONE);
contractDetails.putBytes(DataWord.ONE, new byte[] {5, 6, 7, 8});
repository.updateContractDetails(addr1, contractDetails);
repository.updateContractDetails(addr1, contractDetails, null);
AccountState accountState = repository.getAccountState(addr1);
accountState.setStateRoot(contractDetails.getStorageHash());
repository.updateAccountState(addr1, accountState);
Expand Down

0 comments on commit 3fecce8

Please sign in to comment.