Skip to content
This repository has been archived by the owner on Dec 5, 2024. It is now read-only.

Commit

Permalink
Make casper epoch switch free
Browse files Browse the repository at this point in the history
  • Loading branch information
zilm13 committed Mar 14, 2018
1 parent 0423bbf commit 8ec6864
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
public class CasperFacade {

private static final byte[] CASPER_VOTE_DATA_HEAD = Hex.decode("e9dc0614");
private static final byte[] CASPER_EPOCH_DATA_HEAD = Hex.decode("5dcffc17");

private CasperProperties systemProperties;

Expand Down Expand Up @@ -96,10 +97,23 @@ public Object[] constCall(Block block, String func, Object... funcArgs) {
return casper.getByName(func).decodeResult(r.getHReturn());
}

/**
* All service txs shouldn't use gas
* Currently it's votes and epoch change
*/
public boolean isServiceTx(Transaction transaction) {
return isServiceTx(transaction, getAddress());
}

public boolean isVote(Transaction transaction) {
return isVote(transaction, getAddress());
}

public static boolean isServiceTx(Transaction transaction, byte[] casperAddress) {
return isVote(transaction, casperAddress) ||
isEpochSwitch(transaction, casperAddress);
}

public static boolean isVote(Transaction transaction, byte[] casperAddress) {
if (!Arrays.equals(transaction.getSender(), Transaction.NULL_SENDER))
return false;
Expand All @@ -112,6 +126,18 @@ public static boolean isVote(Transaction transaction, byte[] casperAddress) {
CASPER_VOTE_DATA_HEAD, 0, CASPER_VOTE_DATA_HEAD.length) == 0;
}

private static boolean isEpochSwitch(Transaction transaction, byte[] casperAddress) {
if (!Arrays.equals(transaction.getSender(), NULL_SIGN_SENDER.getAddress()))
return false;
if (casperAddress == null)
return false;
if (!Arrays.equals(transaction.getReceiveAddress(), casperAddress))
return false;

return FastByteComparisons.compareTo(transaction.getData(), 0, CASPER_EPOCH_DATA_HEAD.length,
CASPER_EPOCH_DATA_HEAD, 0, CASPER_EPOCH_DATA_HEAD.length) == 0;
}

public byte[] getAddress() {
init();
return systemProperties.getCasperAddress();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,15 +76,15 @@ public void init() {

@Override
protected boolean isSignatureValid() {
return isCasperVote() || super.isSignatureValid();
return CasperFacade.isVote(tx, ((CasperProperties) config).getCasperAddress()) || super.isSignatureValid();
}

@Override
public void execute() {

if (!readyToExecute) return;

if (!localCall && !isCasperVote()) {
if (!localCall && !isCasperServiceTx()) {
track.increaseNonce(tx.getSender());

BigInteger txGasLimit = toBI(tx.getGasLimit());
Expand All @@ -102,14 +102,14 @@ public void execute() {
}
}

private boolean isCasperVote() {
return CasperFacade.isVote(tx, ((CasperProperties) config).getCasperAddress());
private boolean isCasperServiceTx() {
return CasperFacade.isServiceTx(tx, ((CasperProperties) config).getCasperAddress());
}

@Override
protected void payRewards(final TransactionExecutionSummary summary) {
if (execError == null && isCasperVote()) {
// Return money to sender for succesful Casper vote
if (execError == null && isCasperServiceTx()) {
// Return money to sender for service Casper tx
track.addBalance(tx.getSender(), summary.getFee());
logger.info("Refunded successful Casper Vote from [{}]", Hex.toHexString(tx.getSender()));
} else {
Expand All @@ -124,7 +124,7 @@ protected void payRewards(final TransactionExecutionSummary summary) {
public long getGasUsed() {
long gasUsed = super.getGasUsed();
// Successful Casper vote 0 cost
if (getResult() != null && execError == null && isCasperVote()) {
if (getResult() != null && execError == null && isCasperServiceTx()) {
gasUsed = 0;
}
return gasUsed;
Expand Down

0 comments on commit 8ec6864

Please sign in to comment.