mirror of
https://github.com/status-im/ethereumj-personal.git
synced 2025-02-26 10:45:12 +00:00
Replace GasLedger with Gas enum class
This commit is contained in:
parent
890d06c995
commit
76175bca90
@ -9,6 +9,8 @@ import org.ethereum.util.RLPElement;
|
|||||||
import org.ethereum.util.RLPList;
|
import org.ethereum.util.RLPList;
|
||||||
import org.spongycastle.util.BigIntegers;
|
import org.spongycastle.util.BigIntegers;
|
||||||
|
|
||||||
|
import edu.emory.mathcs.backport.java.util.Arrays;
|
||||||
|
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -320,7 +322,7 @@ public class Block {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public byte[] calcDifficulty() {
|
public byte[] calcDifficulty() {
|
||||||
if (this.header.getParentHash() == null)
|
if (Arrays.equals(this.header.getParentHash(), Genesis.PARENT_HASH))
|
||||||
return Genesis.DIFFICULTY;
|
return Genesis.DIFFICULTY;
|
||||||
else {
|
else {
|
||||||
Block parent = this.getParent();
|
Block parent = this.getParent();
|
||||||
|
33
ethereumj-core/src/main/java/org/ethereum/vm/Gas.java
Normal file
33
ethereumj-core/src/main/java/org/ethereum/vm/Gas.java
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
package org.ethereum.vm;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The fundamental network cost unit. Paid for exclusively by Ether, which is converted
|
||||||
|
* freely to and from Gas as required. Gas does not exist outside of the internal Ethereum
|
||||||
|
* computation engine; its price is set by the Transaction and miners are free to
|
||||||
|
* ignore Transactions whose Gas price is too low.
|
||||||
|
*/
|
||||||
|
public enum Gas {
|
||||||
|
|
||||||
|
G_STEP(1),
|
||||||
|
G_STOP(0),
|
||||||
|
G_SUICIDE(0),
|
||||||
|
G_SLOAD(20),
|
||||||
|
G_SHA3(20),
|
||||||
|
G_SSTORE(100),
|
||||||
|
G_BALANCE(20),
|
||||||
|
G_CREATE(100),
|
||||||
|
G_CALL(20),
|
||||||
|
G_MEMORY(1),
|
||||||
|
G_TXDATA(5),
|
||||||
|
G_TRANSACTION(500);
|
||||||
|
|
||||||
|
private int cost;
|
||||||
|
|
||||||
|
private Gas(int value) {
|
||||||
|
this.cost = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int cost() {
|
||||||
|
return cost;
|
||||||
|
}
|
||||||
|
}
|
@ -1,41 +0,0 @@
|
|||||||
package org.ethereum.vm;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* www.ethereumJ.com
|
|
||||||
* User: Roman Mandeleil
|
|
||||||
* Created on: 04/06/2014 23:58
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class GasLedger {
|
|
||||||
|
|
||||||
/* YP Appendix B.
|
|
||||||
Gstep 1 Default amount of gas to pay for execution cycle.
|
|
||||||
Gstop 0 Nothing paid for the STOP operation.
|
|
||||||
Gsuicide 0 Nothing paid for the SUICIDE operation.
|
|
||||||
Gsha3 20 Paid for a SHA3 operation.
|
|
||||||
Gsload 20 Paid for a SLOAD operation.
|
|
||||||
Gsstore 100 Paid for a normal SSTORE operation (doubled or waived sometimes).
|
|
||||||
Gbalance 20 Paid for a BALANCE operation.
|
|
||||||
Gcreate 100 Paid for a CREATE operation.
|
|
||||||
Gcall 20 Paid for a CALL operation.
|
|
||||||
Gmemory 1 Paid for every additional word when expanding memory.
|
|
||||||
Gtxdata 5 Paid for every byte of data or code for a transaction.
|
|
||||||
Gtransaction 500 Paid for every transaction.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
public static int G_STEP = 1;
|
|
||||||
public static int G_STOP = 0;
|
|
||||||
public static int G_SUICIDE = 0;
|
|
||||||
public static int G_SLOAD = 20;
|
|
||||||
public static int G_SHA3 = 20;
|
|
||||||
public static int G_SSTORE = 100;
|
|
||||||
public static int G_BALANCE = 20;
|
|
||||||
public static int G_CREATE = 100;
|
|
||||||
public static int G_CALL = 20;
|
|
||||||
public static int G_MEMORY = 1;
|
|
||||||
public static int G_TXDATA = 5;
|
|
||||||
public static int G_TRANSACTION = 500;
|
|
||||||
}
|
|
@ -8,6 +8,7 @@ import java.math.BigInteger;
|
|||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
import static org.ethereum.vm.OpCode.PUSH1;
|
import static org.ethereum.vm.OpCode.PUSH1;
|
||||||
|
import static org.ethereum.vm.Gas.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* www.ethereumJ.com
|
* www.ethereumJ.com
|
||||||
@ -34,23 +35,23 @@ public class VM {
|
|||||||
|
|
||||||
switch (OpCode.code(op)) {
|
switch (OpCode.code(op)) {
|
||||||
case SHA3:
|
case SHA3:
|
||||||
program.spendGas( GasLedger.G_SHA3 );
|
program.spendGas(G_SHA3.cost());
|
||||||
break;
|
break;
|
||||||
case SLOAD:
|
case SLOAD:
|
||||||
program.spendGas( GasLedger.G_SLOAD );
|
program.spendGas(G_SLOAD.cost());
|
||||||
break;
|
break;
|
||||||
case SSTORE:
|
case SSTORE:
|
||||||
// todo: calc gas in the execution
|
// todo: calc gas in the execution
|
||||||
// todo: according to the size
|
// todo: according to the size
|
||||||
break;
|
break;
|
||||||
case BALANCE:
|
case BALANCE:
|
||||||
program.spendGas( GasLedger.G_BALANCE );
|
program.spendGas(G_BALANCE.cost());
|
||||||
break;
|
break;
|
||||||
case CREATE:
|
case CREATE:
|
||||||
program.spendGas( GasLedger.G_CREATE );
|
program.spendGas(G_CREATE.cost());
|
||||||
break;
|
break;
|
||||||
case CALL:
|
case CALL:
|
||||||
program.spendGas( GasLedger.G_CALL );
|
program.spendGas(G_CALL.cost());
|
||||||
break;
|
break;
|
||||||
case MSTORE8:
|
case MSTORE8:
|
||||||
case MSTORE:
|
case MSTORE:
|
||||||
@ -58,7 +59,7 @@ public class VM {
|
|||||||
// todo: according to the size
|
// todo: according to the size
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
program.spendGas( GasLedger.G_STEP );
|
program.spendGas( G_STEP.cost() );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -472,11 +473,11 @@ public class VM {
|
|||||||
DataWord oldValue = program.storageLoad(addr);
|
DataWord oldValue = program.storageLoad(addr);
|
||||||
program.storageSave(addr, value);
|
program.storageSave(addr, value);
|
||||||
if (oldValue == null && !value.isZero()){
|
if (oldValue == null && !value.isZero()){
|
||||||
program.spendGas(GasLedger.G_SSTORE * 2);
|
program.spendGas(G_SSTORE.cost() * 2);
|
||||||
} else if (oldValue != null && value.isZero()){
|
} else if (oldValue != null && value.isZero()){
|
||||||
program.spendGas(GasLedger.G_SSTORE * 0);
|
program.spendGas(G_SSTORE.cost() * 0);
|
||||||
} else
|
} else
|
||||||
program.spendGas(GasLedger.G_SSTORE);
|
program.spendGas(G_SSTORE.cost());
|
||||||
|
|
||||||
program.step();
|
program.step();
|
||||||
}
|
}
|
||||||
@ -554,7 +555,7 @@ public class VM {
|
|||||||
|
|
||||||
// memory gas calc
|
// memory gas calc
|
||||||
int newMemSize = program.getMemSize();
|
int newMemSize = program.getMemSize();
|
||||||
program.spendGas(GasLedger.G_MEMORY * (newMemSize - oldMemSize) /32);
|
program.spendGas(G_MEMORY.cost() * (newMemSize - oldMemSize) /32);
|
||||||
}
|
}
|
||||||
program.fullTrace();
|
program.fullTrace();
|
||||||
} catch (RuntimeException e) {
|
} catch (RuntimeException e) {
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package org.ethereum.core;
|
package org.ethereum.core;
|
||||||
|
|
||||||
|
import java.math.BigInteger;
|
||||||
|
|
||||||
import org.ethereum.net.message.BlocksMessage;
|
import org.ethereum.net.message.BlocksMessage;
|
||||||
import org.ethereum.net.message.StaticMessages;
|
import org.ethereum.net.message.StaticMessages;
|
||||||
import org.ethereum.util.RLPList;
|
import org.ethereum.util.RLPList;
|
||||||
@ -89,7 +91,10 @@ public class BlockTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCalcDifficulty() {
|
public void testCalcDifficulty() {
|
||||||
// Block.calcDifficulty()
|
Block genesis = Genesis.getInstance();
|
||||||
|
byte[] diffBytes = genesis.calcDifficulty();
|
||||||
|
BigInteger difficulty = new BigInteger(1, diffBytes);
|
||||||
|
System.out.println(difficulty.toString());
|
||||||
fail("Yet to be implemented.");
|
fail("Yet to be implemented.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user