Skip to content

Commit

Permalink
Persist address ans slot warmth in CREATE[2] calls. (#1468)
Browse files Browse the repository at this point in the history
The warm address/slot data was not returned to the calling messageFrame
for CREATE[2] calls as it was for CALL series calls.

Also, improve performance by using more efficient copy constructors and
reusing objects were relevant.

Signed-off-by: Danno Ferrin <[email protected]>
(cherry picked from commit 43abf83)
Signed-off-by: Danno Ferrin <[email protected]>
  • Loading branch information
shemnon committed Oct 20, 2020
1 parent 7002007 commit 23f3c28
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ public OperationResult execute(final MessageFrame frame, final EVM evm) {
.returnStack(frame.getReturnStack())
.build();
frame.incrementRemainingGas(cost);
childFrame.mergeWarmedUpFields(frame);
childFrame.copyWarmedUpFields(frame);

frame.getMessageFrameStack().addFirst(childFrame);
frame.setState(MessageFrame.State.CODE_SUSPENDED);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -214,8 +214,8 @@ public enum Type {
private Gas gasRefund;
private final Set<Address> selfDestructs;
private final Map<Address, Wei> refunds;
private final Set<Address> warmedUpAddresses;
private final Multimap<Address, Bytes32> warmedUpStorage;
private Set<Address> warmedUpAddresses;
private Multimap<Address, Bytes32> warmedUpStorage;

// Execution Environment fields.
private final Address recipient;
Expand Down Expand Up @@ -858,13 +858,22 @@ public boolean warmUpStorage(final Address address, final Bytes32 slot) {
return !warmedUpStorage.put(address, slot);
}

public void copyWarmedUpFields(final MessageFrame parentFrame) {
if (parentFrame == this) {
return;
}

warmedUpAddresses = new HashSet<>(parentFrame.warmedUpAddresses);
warmedUpStorage = HashMultimap.create(parentFrame.warmedUpStorage);
}

public void mergeWarmedUpFields(final MessageFrame childFrame) {
if (childFrame == this) {
return;
}

warmedUpAddresses.addAll(childFrame.warmedUpAddresses);
warmedUpStorage.putAll(childFrame.warmedUpStorage);
warmedUpAddresses = childFrame.warmedUpAddresses;
warmedUpStorage = childFrame.warmedUpStorage;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ private void spawnChildMessage(final MessageFrame frame) {
.build();

frame.incrementRemainingGas(cost);
childFrame.mergeWarmedUpFields(frame);
childFrame.copyWarmedUpFields(frame);

frame.getMessageFrameStack().addFirst(childFrame);
frame.setState(MessageFrame.State.CODE_SUSPENDED);
Expand All @@ -165,6 +165,7 @@ private void complete(final MessageFrame frame, final MessageFrame childFrame) {
frame.popStackItems(getStackItemsConsumed());

if (childFrame.getState() == MessageFrame.State.COMPLETED_SUCCESS) {
frame.mergeWarmedUpFields(childFrame);
frame.pushStackItem(Words.fromAddress(childFrame.getContractAddress()));
} else {
frame.setReturnData(childFrame.getOutputData());
Expand Down

0 comments on commit 23f3c28

Please sign in to comment.