Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(txSkip): address collisions #1510

Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,6 @@ public static AccountSnapshot fromAccount(
.orElseGet(() -> AccountSnapshot.empty(isWarm, deploymentNumber, deploymentStatus));
}

// TODO: confirm with @Tsvetan that this indeed creates a deep copy
/**
* Creates deep copy of {@code this} {@link AccountSnapshot}.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,105 +104,94 @@ public void resolvePostTransaction(

private void successFinalization(Hub hub) {

if (!senderIsCoinbase()) {
if (!txMetadata.senderIsCoinbase()) {

AccountFragment senderAccountFragment =
final AccountFragment senderAccountFragment =
hub.factories()
.accountFragment()
.make(
senderSnapshotBeforeFinalization,
senderSnapshotAfterTxFinalization,
DomSubStampsSubFragment.standardDomSubStamps(hub.stamp(), 0));

AccountFragment coinbaseAccountFragment =
final AccountFragment coinbaseAccountFragment =
hub.factories()
.accountFragment()
.make(
coinbaseSnapshotBeforeTxFinalization,
coinbaseSnapshotAfterFinalization,
DomSubStampsSubFragment.standardDomSubStamps(hub.stamp(), 1));

TransactionFragment currentTransactionFragment =
TransactionFragment.prepare(hub.txStack().current());
this.addFragments(senderAccountFragment, coinbaseAccountFragment);
} else {
// TODO: verify it works
final AccountFragment senderAccountFragment =
hub.factories()
.accountFragment()
.make(
senderSnapshotBeforeFinalization,
senderSnapshotBeforeFinalization
.deepCopy()
.incrementBalanceBy(txMetadata.getGasRefundInWei()),
DomSubStampsSubFragment.standardDomSubStamps(hub.stamp(), 0));

final AccountFragment coinbaseAccountFragment =
hub.factories()
.accountFragment()
.make(
senderSnapshotBeforeFinalization,
coinbaseSnapshotAfterFinalization,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should indeed work

DomSubStampsSubFragment.standardDomSubStamps(hub.stamp(), 1));

this.addFragments(senderAccountFragment, coinbaseAccountFragment, currentTransactionFragment);
return;
this.addFragments(senderAccountFragment, coinbaseAccountFragment);
}

// TODO: verify it works
AccountFragment senderAccountFragment =
hub.factories()
.accountFragment()
.make(
senderSnapshotBeforeFinalization,
senderSnapshotBeforeFinalization
.deepCopy()
.incrementBalanceBy(txMetadata.getGasRefundInWei()),
DomSubStampsSubFragment.standardDomSubStamps(hub.stamp(), 0));

AccountFragment coinbaseAccountFragment =
hub.factories()
.accountFragment()
.make(
senderSnapshotBeforeFinalization,
coinbaseSnapshotAfterFinalization,
DomSubStampsSubFragment.standardDomSubStamps(hub.stamp(), 1));

TransactionFragment currentTransactionFragment =
final TransactionFragment currentTransactionFragment =
TransactionFragment.prepare(hub.txStack().current());

this.addFragments(senderAccountFragment, coinbaseAccountFragment, currentTransactionFragment);
this.addFragment(currentTransactionFragment);
}

private void failureFinalization(Hub hub) {
if (noAddressCollisions()) {
if (txMetadata.noAddressCollisions()) {

AccountFragment senderAccountFragment =
final AccountFragment senderAccountFragment =
hub.factories()
.accountFragment()
.make(
senderSnapshotBeforeFinalization,
senderSnapshotAfterTxFinalization,
DomSubStampsSubFragment.standardDomSubStamps(hub.stamp(), 0));

AccountFragment recipientAccountFragment =
final AccountFragment recipientAccountFragment =
hub.factories()
.accountFragment()
.make(
recipientSnapshotBeforeFinalization,
recipientSnapshotAfterTxFinalization,
DomSubStampsSubFragment.standardDomSubStamps(hub.stamp(), 1));

AccountFragment coinbaseAccountFragment =
final AccountFragment coinbaseAccountFragment =
hub.factories()
.accountFragment()
.make(
coinbaseSnapshotBeforeTxFinalization,
coinbaseSnapshotAfterFinalization,
DomSubStampsSubFragment.standardDomSubStamps(hub.stamp(), 2));

TransactionFragment currentTransactionFragment =
TransactionFragment.prepare(hub.txStack().current());

this.addFragments(
senderAccountFragment,
recipientAccountFragment,
coinbaseAccountFragment,
currentTransactionFragment);
this.addFragments(senderAccountFragment, recipientAccountFragment, coinbaseAccountFragment);

} else {

Wei transactionValue = (Wei) txMetadata.getBesuTransaction().getValue();
final Wei transactionValue = (Wei) txMetadata.getBesuTransaction().getValue();

// FIRST ROW
////////////
AccountSnapshot senderSnapshotAfterValueAndGasRefunds =
final AccountSnapshot senderSnapshotAfterValueAndGasRefunds =
senderSnapshotBeforeFinalization
.deepCopy()
.incrementBalanceBy(transactionValue)
.incrementBalanceBy(txMetadata.getGasRefundInWei());

AccountFragment senderAccountFragment =
final AccountFragment senderAccountFragment =
hub.factories()
.accountFragment()
.make(
Expand All @@ -211,16 +200,15 @@ private void failureFinalization(Hub hub) {
DomSubStampsSubFragment.standardDomSubStamps(hub.stamp(), 0));

// SECOND ROW
/////////////
AccountSnapshot recipientSnapshotBeforeSecondRow =
(senderIsRecipient())
final AccountSnapshot recipientSnapshotBeforeSecondRow =
(txMetadata.senderIsRecipient())
? senderSnapshotAfterValueAndGasRefunds
: recipientSnapshotBeforeFinalization;

AccountSnapshot recipientSnapshotAfterSecondRow =
final AccountSnapshot recipientSnapshotAfterSecondRow =
recipientSnapshotBeforeSecondRow.deepCopy().decrementBalanceBy(transactionValue);

AccountFragment recipientAccountFragment =
final AccountFragment recipientAccountFragment =
hub.factories()
.accountFragment()
.make(
Expand All @@ -229,54 +217,24 @@ private void failureFinalization(Hub hub) {
DomSubStampsSubFragment.standardDomSubStamps(hub.stamp(), 1));

// THIRD ROW
////////////
AccountSnapshot coinbaseSnapshotBefore =
final AccountSnapshot coinbaseSnapshotBefore =
coinbaseSnapshotAfterFinalization
.deepCopy()
.decrementBalanceBy(txMetadata.getCoinbaseReward());

AccountFragment coinbaseAccountFragment =
final AccountFragment coinbaseAccountFragment =
hub.factories()
.accountFragment()
.make(
coinbaseSnapshotBefore,
coinbaseSnapshotAfterFinalization,
DomSubStampsSubFragment.standardDomSubStamps(hub.stamp(), 2));

TransactionFragment currentTransactionFragment =
TransactionFragment.prepare(hub.txStack().current());

this.addFragments(
senderAccountFragment,
recipientAccountFragment,
coinbaseAccountFragment,
currentTransactionFragment);
this.addFragments(senderAccountFragment, recipientAccountFragment, coinbaseAccountFragment);
}
}

private boolean senderIsCoinbase() {
return this.senderSnapshotBeforeFinalization
.address()
.equals(coinbaseSnapshotBeforeTxFinalization.address());
}

private boolean senderIsRecipient() {
return this.senderSnapshotBeforeFinalization
.address()
.equals(recipientSnapshotBeforeFinalization.address());
}

private boolean recipientIsCoinbase() {
return this.recipientSnapshotBeforeFinalization
.address()
.equals(coinbaseSnapshotBeforeTxFinalization.address());
}

private boolean addressCollision() {
return senderIsCoinbase() || senderIsRecipient() || recipientIsCoinbase();
}
final TransactionFragment currentTransactionFragment =
TransactionFragment.prepare(hub.txStack().current());

private boolean noAddressCollisions() {
return !addressCollision();
this.addFragment(currentTransactionFragment);
}
}
Loading
Loading