Succesfull app run:
Replaced spring framework with robospring. Changed ethereumj-core build to android-library. Disabled BlockStoreImpl until we make it android compatible( use InMemoryBlockstore ). Disabled antlr4 dependencies. Commented some dependencies(needs testing before enabling). Excluded dom4j and org.jboss.spec.javax.transaction dependencies (problems with android). Change to netty 4.0.18.Final (this seems to work with android; latest 4.1 and 5.0 presented some problems; needs additional testing).
This commit is contained in:
parent
781e23ec70
commit
3d3e8f82c5
|
@ -1,243 +1,144 @@
|
|||
buildscript {
|
||||
repositories {
|
||||
jcenter()
|
||||
maven { url 'http://repo.spring.io/plugins-release-local' }
|
||||
}
|
||||
dependencies {
|
||||
classpath 'org.springframework.build.gradle:propdeps-plugin:0.0.7'
|
||||
classpath 'org.jfrog.buildinfo:build-info-extractor-gradle:3.0.1'
|
||||
apply plugin: 'com.android.library'
|
||||
|
||||
repositories {
|
||||
maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
|
||||
mavenCentral()
|
||||
maven { url 'http://repo.spring.io/plugins-release-local' }
|
||||
|
||||
flatDir {
|
||||
dirs "libs"
|
||||
}
|
||||
}
|
||||
|
||||
plugins {
|
||||
id 'application'
|
||||
id 'jacoco'
|
||||
id 'com.github.johnrengelman.shadow' version '1.2.0'
|
||||
id 'me.champeau.gradle.antlr4' version '0.1'
|
||||
id 'com.github.kt3k.coveralls' version '2.0.1x'
|
||||
id 'com.jfrog.bintray' version '1.0'
|
||||
}
|
||||
android {
|
||||
compileSdkVersion 21
|
||||
buildToolsVersion "21.1.2"
|
||||
|
||||
apply plugin: 'propdeps-maven'
|
||||
apply plugin: 'com.jfrog.artifactory-upload'
|
||||
|
||||
sourceCompatibility = 1.7
|
||||
|
||||
mainClassName = 'org.ethereum.Start'
|
||||
|
||||
ext.generatedSrcDir = file('src/gen/java')
|
||||
|
||||
sourceSets.main.java.srcDirs += generatedSrcDir
|
||||
|
||||
antlr4 {
|
||||
extraArgs = ['-package', 'org.ethereum.serpent']
|
||||
output = file("${generatedSrcDir}/org/ethereum/serpent")
|
||||
}
|
||||
|
||||
compileJava.dependsOn antlr4
|
||||
|
||||
test {
|
||||
|
||||
useTestNG()
|
||||
|
||||
jvmArgs '-Xss16m'
|
||||
|
||||
testLogging {
|
||||
events "failed"
|
||||
exceptionFormat "short"
|
||||
defaultConfig {
|
||||
minSdkVersion 14
|
||||
targetSdkVersion 21
|
||||
versionCode 1
|
||||
versionName "1.0"
|
||||
}
|
||||
|
||||
systemProperty "file.encoding", "UTF-8"
|
||||
buildTypes {
|
||||
release {
|
||||
minifyEnabled false
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||
}
|
||||
}
|
||||
}
|
||||
//ext.generatedSrcDir = file('src/gen/java')
|
||||
|
||||
configurations {
|
||||
compile.extendsFrom antlr4
|
||||
}
|
||||
//sourceSets.main.java.srcDirs += generatedSrcDir
|
||||
|
||||
//antlr4 {
|
||||
// extraArgs = ['-package', 'org.ethereum.serpent']
|
||||
// output = file("${generatedSrcDir}/org/ethereum/serpent")
|
||||
//}
|
||||
|
||||
//compileJava.dependsOn antlr4
|
||||
|
||||
ext {
|
||||
slf4jVersion = '1.7.7'
|
||||
leveldbVersion = '0.7'
|
||||
scastleVersion = '1.51.0.0'
|
||||
log4jVersion = '1.2.17'
|
||||
springVersion = '4.1.2.RELEASE'
|
||||
hibernateVersion = '4.3.7.Final'
|
||||
junitVersion = '4.11'
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compile "io.netty:netty-all:4.0.23.Final"
|
||||
compile "com.madgag.spongycastle:core:${scastleVersion}" // for SHA3 and SECP256K1
|
||||
compile "com.madgag.spongycastle:prov:${scastleVersion}" // for SHA3 and SECP256K1
|
||||
//compile 'com.android.support:appcompat-v7:+'
|
||||
compile fileTree(include: ['*.jar'], dir: 'libs')
|
||||
compile 'com.j256.ormlite:ormlite-core:4.48'
|
||||
compile('com.j256.ormlite:ormlite-android:4.48') {
|
||||
exclude group: 'commons-logging', module: 'commons-logging'
|
||||
}
|
||||
compile('com.j256.ormlite:ormlite-jdbc:4.48') {
|
||||
exclude group: 'commons-logging', module: 'commons-logging'
|
||||
}
|
||||
//compile(name:'android-leveldb', ext:'aar')
|
||||
//compile 'com.snappydb:snappydb-lib:0.5.0'
|
||||
//compile files('./libs/android.jar')
|
||||
|
||||
//compile files('./libs/commons-io-2.4.jar')
|
||||
|
||||
//compile files('./libs/robospring-1.0.7.jar')
|
||||
|
||||
//compile "com.octo.android.robospice:robospice-spring-android:1.4.14"
|
||||
|
||||
//compile 'com.octo.android.robospice:robospice-ormlite:1.4.14'
|
||||
compile('io.netty:netty-all:4.0.18.Final') {
|
||||
exclude group: 'commons-logging', module: 'commons-logging'
|
||||
}
|
||||
compile "com.madgag.spongycastle:core:${scastleVersion}"
|
||||
// for SHA3 and SECP256K1
|
||||
compile "com.madgag.spongycastle:prov:${scastleVersion}"
|
||||
// for SHA3 and SECP256K1
|
||||
|
||||
compile "org.iq80.leveldb:leveldb:${leveldbVersion}"
|
||||
compile "com.cedarsoftware:java-util:1.8.0" // for deep equals
|
||||
compile "org.antlr:antlr4-runtime:4.5" // for serpent compilation
|
||||
compile "com.yuvalshavit:antlr-denter:1.1"
|
||||
compile "org.javassist:javassist:3.15.0-GA"
|
||||
compile "org.slf4j:slf4j-api:${slf4jVersion}"
|
||||
compile "log4j:log4j:${log4jVersion}"
|
||||
compile "org.codehaus.jackson:jackson-mapper-asl:1.9.13"
|
||||
compile "com.google.code.findbugs:jsr305:3.0.0"
|
||||
compile "com.fasterxml.jackson.core:jackson-databind:2.2.0"
|
||||
compile "org.apache.commons:commons-collections4:4.0"
|
||||
compile "commons-codec:commons-codec:1.10"
|
||||
compile "org.springframework:spring-context:${springVersion}"
|
||||
compile "org.springframework:spring-tx:${springVersion}"
|
||||
compile "org.springframework:spring-orm:${springVersion}"
|
||||
compile "org.hsqldb:hsqldb:1.8.0.10" // best performance - do not upgrade!
|
||||
compile "org.hibernate:hibernate-core:${hibernateVersion}"
|
||||
compile "org.hibernate:hibernate-entitymanager:${hibernateVersion}"
|
||||
compile "commons-dbcp:commons-dbcp:1.4"
|
||||
compile "redis.clients:jedis:2.6.0"
|
||||
|
||||
compile("com.googlecode.json-simple:json-simple:1.1.1") {
|
||||
//compile "im.amomo.leveldb:leveldb:1.0.1"
|
||||
//compile 'com.google.guava:guava:18.0'
|
||||
compile('com.cedarsoftware:java-util:1.8.0') {
|
||||
exclude group: 'commons-logging', module: 'commons-logging'
|
||||
}
|
||||
// for deep equals
|
||||
|
||||
//compile 'org.antlr:antlr4-runtime:4.5'
|
||||
|
||||
// for serpent compilation
|
||||
|
||||
//compile 'com.yuvalshavit:antlr-denter:1.1'
|
||||
|
||||
//compile 'org.javassist:javassist:3.15.0-GA'
|
||||
compile 'org.slf4j:slf4j-android:1.6.1-RC1'
|
||||
//compile "org.slf4j:slf4j-api:${slf4jVersion}"
|
||||
|
||||
//compile "log4j:log4j:${log4jVersion}"
|
||||
|
||||
//compile 'org.codehaus.jackson:jackson-mapper-asl:1.9.13'
|
||||
compile 'com.google.code.findbugs:jsr305:3.0.0'
|
||||
compile 'com.fasterxml.jackson.core:jackson-databind:2.2.0'
|
||||
compile 'org.apache.commons:commons-collections4:4.0'
|
||||
//compile 'commons-codec:commons-codec:1.10'
|
||||
|
||||
// compile "org.springframework:spring-context:${springVersion}"
|
||||
|
||||
//compile "org.springframework:spring-tx:${springVersion}"
|
||||
|
||||
//compile "org.springframework:spring-orm:${springVersion}"
|
||||
compile 'org.hsqldb:hsqldb:1.8.0.10'
|
||||
// best performance - do not upgrade!
|
||||
compile 'javax.el:javax.el-api:2.2.4'
|
||||
compile 'org.glassfish.web:javax.el:2.2.4'
|
||||
compile("org.hibernate:hibernate-core:${hibernateVersion}") {
|
||||
exclude group: 'dom4j', module: 'dom4j'
|
||||
exclude group: 'org.jboss.spec.javax.transaction', module: 'jboss-transaction-api_1.2_spec'
|
||||
}
|
||||
compile("org.hibernate:hibernate-entitymanager:${hibernateVersion}") {
|
||||
exclude group: 'dom4j', module: 'dom4j'
|
||||
exclude group: 'org.jboss.spec.javax.transaction', module: 'jboss-transaction-api_1.2_spec'
|
||||
}
|
||||
//compile ('commons-dbcp:commons-dbcp:1.4') {
|
||||
|
||||
// exclude group: 'commons-logging', module: 'commons-logging'
|
||||
|
||||
// }
|
||||
compile('redis.clients:jedis:2.6.0') {
|
||||
exclude group: 'org.apache.commons', module: 'commons-pool2'
|
||||
}
|
||||
compile('com.googlecode.json-simple:json-simple:1.1.1') {
|
||||
exclude group: 'junit', module: 'junit'
|
||||
exclude group: 'xml-apis', module: 'xml-apis'
|
||||
}
|
||||
optional "commons-logging:commons-logging:1.0"
|
||||
optional "org.slf4j:jcl-over-slf4j:${slf4jVersion}"
|
||||
optional "org.slf4j:slf4j-log4j12:${slf4jVersion}"
|
||||
optional "log4j:apache-log4j-extras:${log4jVersion}"
|
||||
//optional "org.slf4j:jcl-over-slf4j:${slf4jVersion}"
|
||||
|
||||
//optional "de.mindpipe.android:android-logging-log4j:1.0.2"
|
||||
|
||||
//optional "log4j:apache-log4j-extras:${log4jVersion}"
|
||||
testCompile "junit:junit:${junitVersion}"
|
||||
testCompile "org.springframework:spring-test:${springVersion}"
|
||||
}
|
||||
|
||||
javadoc {
|
||||
options.author = true
|
||||
options.header = project.name
|
||||
options.addStringOption('Xdoclint:all,-missing', '-quiet')
|
||||
options.encoding = "UTF-8"
|
||||
options.links(
|
||||
"http://docs.oracle.com/javase/8/docs/api/",
|
||||
"http://netty.io/4.0/api/"
|
||||
)
|
||||
}
|
||||
|
||||
task sourcesJar(type: Jar, dependsOn: classes) {
|
||||
classifier = 'sources'
|
||||
from sourceSets.main.allSource
|
||||
}
|
||||
|
||||
task javadocJar(type: Jar) {
|
||||
classifier = "javadoc"
|
||||
from javadoc
|
||||
}
|
||||
|
||||
artifacts {
|
||||
archives sourcesJar
|
||||
archives javadocJar
|
||||
}
|
||||
|
||||
jacocoTestReport {
|
||||
reports {
|
||||
xml.enabled = true
|
||||
html.enabled = true
|
||||
}
|
||||
}
|
||||
|
||||
def bintrayUsername = project.hasProperty('bintrayUser') ? project.bintrayUser : ''
|
||||
def bintrayPassword = project.hasProperty('bintrayKey') ? project.bintrayKey : ''
|
||||
def pullRequest = System.getenv('TRAVIS_PULL_REQUEST')
|
||||
def branchName = System.getenv('TRAVIS_BRANCH')
|
||||
|
||||
artifactory {
|
||||
contextUrl = 'http://oss.jfrog.org/artifactory'
|
||||
publish {
|
||||
repository {
|
||||
repoKey = 'oss-snapshot-local'
|
||||
username = bintrayUsername
|
||||
password = bintrayPassword
|
||||
}
|
||||
}
|
||||
resolve {
|
||||
repository {
|
||||
repoKey = 'libs-release'
|
||||
}
|
||||
}
|
||||
//testCompile "org.springframework:spring-test:${springVersion}"
|
||||
|
||||
}
|
||||
|
||||
artifactoryPublish.onlyIf {
|
||||
(!pullRequest || pullRequest == 'false') &&
|
||||
project.version.endsWith('-SNAPSHOT') &&
|
||||
branchName.startsWith('master')
|
||||
}
|
||||
|
||||
bintray {
|
||||
user = bintrayUsername
|
||||
key = bintrayPassword
|
||||
|
||||
configurations = ['archives']
|
||||
|
||||
dryRun = false //Whether to run this as dry-run, without deploying
|
||||
publish = true //If version should be auto published after an upload
|
||||
pkg {
|
||||
userOrg = 'ethereum' //An optional organization name when the repo belongs to one of the user's orgs
|
||||
repo = 'maven'
|
||||
name = 'org.ethereum'
|
||||
}
|
||||
}
|
||||
|
||||
bintrayUpload.onlyIf {
|
||||
(!pullRequest || pullRequest == 'false') && !project.version.endsWith('-SNAPSHOT')
|
||||
}
|
||||
|
||||
install {
|
||||
repositories.mavenInstaller {
|
||||
customizePom(pom, project)
|
||||
}
|
||||
}
|
||||
|
||||
task publish {
|
||||
|
||||
println "publishing if master current branch: " + branchName
|
||||
description = "Publishes snapshots to oss.jfrog.org and releases to Bintray/JCenter"
|
||||
dependsOn artifactoryPublish, bintrayUpload
|
||||
}
|
||||
|
||||
|
||||
def customizePom(pom, gradleProject) {
|
||||
pom.whenConfigured { generatedPom ->
|
||||
// eliminate test-scoped dependencies (no need in maven central poms)
|
||||
generatedPom.dependencies.removeAll { dep ->
|
||||
dep.scope == "test"
|
||||
}
|
||||
|
||||
// sort to make pom dependencies order consistent to ease comparison of older poms
|
||||
generatedPom.dependencies = generatedPom.dependencies.sort { dep ->
|
||||
"$dep.scope:$dep.groupId:$dep.artifactId"
|
||||
}
|
||||
|
||||
// add all items necessary for maven central publication
|
||||
generatedPom.project {
|
||||
name = "ethereumj"
|
||||
description = "Java implementation of the Ethereum protocol"
|
||||
url = "https://github.com/ethereum/ethereumj"
|
||||
organization {
|
||||
name = "Ethereum"
|
||||
url = "https://ethereum.org"
|
||||
}
|
||||
licenses {
|
||||
license {
|
||||
name "The MIT License"
|
||||
url "http://mit-license.org/"
|
||||
distribution "repo"
|
||||
}
|
||||
}
|
||||
scm {
|
||||
url = "https://github.com/ethereum/ethereumj"
|
||||
connection = "scm:git:git://github.com/ethereum/ethereumj"
|
||||
developerConnection = "scm:git:git://github.com/ethereum/ethereumj"
|
||||
}
|
||||
developers {
|
||||
developer {
|
||||
id = "rmandeleil"
|
||||
name = "Roman Mandeleil"
|
||||
email = "roman.mandeleil@gmail.com"
|
||||
}
|
||||
}
|
||||
issueManagement {
|
||||
system = "GitHub Issues"
|
||||
url = "https://github.com/ethereum/ethereumj/issues"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,9 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.ethereum" >
|
||||
|
||||
<application android:allowBackup="true" android:label="@string/app_name">
|
||||
|
||||
</application>
|
||||
|
||||
</manifest>
|
|
@ -0,0 +1,26 @@
|
|||
package org.ethereum;
|
||||
|
||||
import org.ethereum.cli.CLIInterface;
|
||||
import org.ethereum.config.SystemProperties;
|
||||
import org.ethereum.facade.Ethereum;
|
||||
import org.robospring.RoboSpring;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
||||
|
||||
public class MyClass {
|
||||
|
||||
public static ApplicationContext context = null;
|
||||
|
||||
public static void start(android.content.Context androidContext) {
|
||||
|
||||
|
||||
//CLIInterface.call(args);RoboSpring.getContext("applicationContext.xml");
|
||||
RoboSpring.autowire(androidContext);
|
||||
context = RoboSpring.getContext();
|
||||
Ethereum ethereum = context.getBean(Ethereum.class);
|
||||
ethereum.setContext(context);
|
||||
ethereum.connect(SystemProperties.CONFIG.activePeerIP(),
|
||||
SystemProperties.CONFIG.activePeerPort());
|
||||
|
||||
}
|
||||
}
|
|
@ -3,7 +3,7 @@ package org.ethereum.cli;
|
|||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import org.springframework.stereotype.Component;
|
||||
//import org.springframework.stereotype.Component;
|
||||
|
||||
import static org.ethereum.config.SystemProperties.CONFIG;
|
||||
|
||||
|
@ -11,7 +11,7 @@ import static org.ethereum.config.SystemProperties.CONFIG;
|
|||
* @author Roman Mandeleil
|
||||
* @since 13.11.2014
|
||||
*/
|
||||
@Component
|
||||
//@Component
|
||||
public class CLIInterface {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger("cli");
|
||||
|
|
|
@ -5,8 +5,8 @@ import org.ethereum.manager.WorldManager;
|
|||
import org.ethereum.util.Utils;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Scope;
|
||||
import org.springframework.stereotype.Component;
|
||||
//import org.springframework.context.annotation.Scope;
|
||||
//import org.springframework.stereotype.Component;
|
||||
|
||||
import java.math.BigInteger;
|
||||
|
||||
|
@ -18,8 +18,8 @@ import java.util.Set;
|
|||
/**
|
||||
* Representation of an actual account or contract
|
||||
*/
|
||||
@Component
|
||||
@Scope("prototype")
|
||||
//@Component
|
||||
//@Scope("prototype")
|
||||
public class Account {
|
||||
|
||||
private ECKey ecKey;
|
||||
|
|
|
@ -17,10 +17,11 @@ import org.spongycastle.util.encoders.Hex;
|
|||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.FileSystemUtils;
|
||||
//import org.springframework.stereotype.Component;
|
||||
//import org.springframework.util.FileSystemUtils;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
//import javax.annotation.Resource;
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
import java.io.FileWriter;
|
||||
|
@ -62,7 +63,7 @@ import static org.ethereum.core.Denomination.SZABO;
|
|||
* @author Nick Savers
|
||||
* @since 20.05.2014
|
||||
*/
|
||||
@Component
|
||||
//@Component
|
||||
public class BlockchainImpl implements Blockchain {
|
||||
|
||||
/* A scalar value equal to the minimum limit of gas expenditure per block */
|
||||
|
@ -74,8 +75,6 @@ public class BlockchainImpl implements Blockchain {
|
|||
// to avoid using minGasPrice=0 from Genesis for the wallet
|
||||
private static final long INITIAL_MIN_GAS_PRICE = 10 * SZABO.longValue();
|
||||
|
||||
@Resource
|
||||
@Qualifier("pendingTransactions")
|
||||
private Set<Transaction> pendingTransactions;
|
||||
|
||||
@Autowired
|
||||
|
@ -111,6 +110,10 @@ public class BlockchainImpl implements Blockchain {
|
|||
private List<Chain> altChains = new ArrayList<>();
|
||||
private List<Block> garbage = new ArrayList<>();
|
||||
|
||||
public BlockchainImpl(final Set<Transaction> pendingTransactions) {
|
||||
this.pendingTransactions = Collections.synchronizedSet(pendingTransactions);
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getBestBlockHash() {
|
||||
return getBestBlock().getHash();
|
||||
|
@ -352,8 +355,8 @@ public class BlockchainImpl implements Blockchain {
|
|||
receipt.setPostTxState(repository.getRoot());
|
||||
receipt.setTransaction(tx);
|
||||
|
||||
stateLogger.info("block: [{}] executed tx: [{}] \n state: [{}]", block.getNumber(), i,
|
||||
Hex.toHexString(repository.getRoot()));
|
||||
//stateLogger.info("block: [{}] executed tx: [{}] \n state: [{}]", block.getNumber(), i,
|
||||
// Hex.toHexString(repository.getRoot()));
|
||||
|
||||
stateLogger.info("[{}] ", receipt.toString());
|
||||
|
||||
|
@ -376,7 +379,7 @@ public class BlockchainImpl implements Blockchain {
|
|||
|
||||
long totalTime = System.nanoTime() - saveTime;
|
||||
adminInfo.addBlockExecTime(totalTime);
|
||||
logger.info("block: num: [{}] hash: [{}], executed after: [{}]nano", block.getNumber(), block.getShortHash(), totalTime);
|
||||
//logger.info("block: num: [{}] hash: [{}], executed after: [{}]nano", block.getNumber(), block.getShortHash(), totalTime);
|
||||
|
||||
return receipts;
|
||||
}
|
||||
|
@ -494,7 +497,12 @@ public class BlockchainImpl implements Blockchain {
|
|||
if (!CONFIG.recordBlocks()) return;
|
||||
|
||||
if (bestBlock.isGenesis()) {
|
||||
FileSystemUtils.deleteRecursively(new File(CONFIG.dumpDir()));
|
||||
//FileSystemUtils.deleteRecursively(new File(CONFIG.dumpDir()));
|
||||
try{
|
||||
FileUtils.forceDelete(new File(CONFIG.dumpDir()));
|
||||
}catch(IOException e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
String dir = CONFIG.dumpDir() + "/";
|
||||
|
|
|
@ -170,12 +170,13 @@ public class TransactionExecutor {
|
|||
track.addBalance(receiverAddress, txValue); // balance will be read again below
|
||||
track.addBalance(senderAddress, txValue.negate());
|
||||
|
||||
if (stateLogger.isDebugEnabled())
|
||||
/*if (stateLogger.isDebugEnabled())
|
||||
stateLogger.debug("Update value balance \n "
|
||||
+ "sender={}, receiver={}, value={}",
|
||||
Hex.toHexString(senderAddress),
|
||||
Hex.toHexString(receiverAddress),
|
||||
new BigInteger(tx.getValue()));
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
|
@ -243,6 +244,7 @@ public class TransactionExecutor {
|
|||
if (CONFIG.vmTrace()) {
|
||||
String traceAsJson = "{}";
|
||||
if (program != null) {
|
||||
ProgramResult result = program.getResult();
|
||||
ProgramTrace trace = program.getProgramTrace();
|
||||
trace.setResult(result.getHReturn());
|
||||
trace.setError(result.getException());
|
||||
|
@ -290,12 +292,13 @@ public class TransactionExecutor {
|
|||
result.getGasUsed()).multiply(gasPrice));
|
||||
|
||||
if (refund.signum() > 0) {
|
||||
if (stateLogger.isDebugEnabled())
|
||||
/*if (stateLogger.isDebugEnabled())
|
||||
stateLogger
|
||||
.debug("After contract execution the sender address refunded with gas leftover, "
|
||||
+ "\n sender={} \n contract={} \n gas_refund= {}",
|
||||
Hex.toHexString(senderAddress),
|
||||
Hex.toHexString(contractAddress), refund);
|
||||
*/
|
||||
// gas refund
|
||||
repository.addBalance(senderAddress, refund);
|
||||
repository.addBalance(coinbase, refund.negate());
|
||||
|
@ -307,12 +310,13 @@ public class TransactionExecutor {
|
|||
BigInteger futureRefundBI = BigInteger.valueOf(futureRefund);
|
||||
BigInteger futureRefundVal = futureRefundBI.multiply(gasPrice);
|
||||
|
||||
if (stateLogger.isDebugEnabled())
|
||||
/* if (stateLogger.isDebugEnabled())
|
||||
stateLogger
|
||||
.debug("After contract execution the sender address refunded with storage save refunds, "
|
||||
+ "\n sender={} \n contract={} \n gas_refund= {}",
|
||||
Hex.toHexString(senderAddress),
|
||||
Hex.toHexString(contractAddress), futureRefundVal);
|
||||
*/
|
||||
repository.addBalance(senderAddress, futureRefundVal);
|
||||
repository.addBalance(coinbase, futureRefundVal.negate());
|
||||
}
|
||||
|
|
|
@ -12,8 +12,8 @@ import org.spongycastle.util.encoders.Hex;
|
|||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.annotation.DependsOn;
|
||||
import org.springframework.stereotype.Component;
|
||||
//import org.springframework.context.annotation.DependsOn;
|
||||
//import org.springframework.stereotype.Component;
|
||||
|
||||
import org.w3c.dom.Attr;
|
||||
import org.w3c.dom.Document;
|
||||
|
@ -48,8 +48,8 @@ import javax.xml.transform.stream.StreamResult;
|
|||
* The Wallet handles the management of accounts with addresses and private keys.
|
||||
* New accounts can be generated and added to the wallet and existing accounts can be queried.
|
||||
*/
|
||||
@Component
|
||||
@DependsOn("worldManager")
|
||||
//@Component
|
||||
//@DependsOn("worldManager")
|
||||
public class Wallet {
|
||||
|
||||
private Logger logger = LoggerFactory.getLogger("wallet");
|
||||
|
|
|
@ -0,0 +1,112 @@
|
|||
package org.ethereum.datasource;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import org.ethereum.config.SystemProperties;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import static org.iq80.leveldb.impl.Iq80DBFactory.factory;
|
||||
|
||||
/**
|
||||
* @author Roman Mandeleil
|
||||
* @since 18.01.2015
|
||||
*/
|
||||
public class InMemoryDbDataSource implements KeyValueDataSource {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger("db");
|
||||
|
||||
String name;
|
||||
HashMap<ByteBuffer, byte[]> db;
|
||||
private Context context;
|
||||
|
||||
public InMemoryDbDataSource() {
|
||||
}
|
||||
|
||||
public InMemoryDbDataSource(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public void setContext(Context context) {
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init() {
|
||||
|
||||
db = new HashMap<ByteBuffer, byte[]>();
|
||||
}
|
||||
|
||||
|
||||
public void destroyDB(File fileLocation) {
|
||||
logger.debug("Destroying existing database");
|
||||
db = new HashMap<ByteBuffer, byte[]>();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] get(byte[] key) {
|
||||
return db.get(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] put(byte[] key, byte[] value) {
|
||||
ByteBuffer wrapped = ByteBuffer.wrap(key);
|
||||
db.put(wrapped, value);
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(byte[] key) {
|
||||
db.remove(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<byte[]> keys() {
|
||||
|
||||
Set<byte[]> keys = new HashSet<>();
|
||||
Set bufferKeys = db.keySet();
|
||||
|
||||
for (Iterator i = bufferKeys.iterator(); i.hasNext();)
|
||||
{
|
||||
ByteBuffer key = (ByteBuffer) i.next();
|
||||
keys.add(key.array());
|
||||
}
|
||||
|
||||
return keys;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateBatch(Map<byte[], byte[]> rows) {
|
||||
|
||||
|
||||
for (Map.Entry<byte[], byte[]> row : rows.entrySet()) {
|
||||
ByteBuffer wrapped = ByteBuffer.wrap(row.getKey());
|
||||
db.put(wrapped, row.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
try {
|
||||
logger.info("Close db: {}", name);
|
||||
init();
|
||||
} catch (Exception e) {
|
||||
logger.error("Failed to find the db file on the close: {} ", name);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -17,8 +17,10 @@ import java.io.IOException;
|
|||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import org.iq80.leveldb.impl.Iq80DBFactory;
|
||||
|
||||
import static org.iq80.leveldb.impl.Iq80DBFactory.factory;
|
||||
import android.content.Context;
|
||||
|
||||
/**
|
||||
* @author Roman Mandeleil
|
||||
|
@ -30,6 +32,7 @@ public class LevelDbDataSource implements KeyValueDataSource {
|
|||
|
||||
String name;
|
||||
private DB db;
|
||||
private Context context;
|
||||
|
||||
public LevelDbDataSource() {
|
||||
}
|
||||
|
@ -38,6 +41,10 @@ public class LevelDbDataSource implements KeyValueDataSource {
|
|||
this.name = name;
|
||||
}
|
||||
|
||||
public void setContext(Context context) {
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init() {
|
||||
|
||||
|
@ -46,20 +53,26 @@ public class LevelDbDataSource implements KeyValueDataSource {
|
|||
Options options = new Options();
|
||||
options.createIfMissing(true);
|
||||
options.compressionType(CompressionType.NONE);
|
||||
org.iq80.leveldb.Logger logger1 = new org.iq80.leveldb.Logger() {
|
||||
public void log(String message) {
|
||||
logger.debug(message);
|
||||
}
|
||||
};
|
||||
options.logger(logger1);
|
||||
try {
|
||||
logger.debug("Opening database");
|
||||
File dbLocation = new File(System.getProperty("user.dir") + "/" +
|
||||
SystemProperties.CONFIG.databaseDir() + "/");
|
||||
File dbLocation = context.getDir(SystemProperties.CONFIG.databaseDir(), 0);
|
||||
File fileLocation = new File(dbLocation, name);
|
||||
|
||||
if (SystemProperties.CONFIG.databaseReset()) {
|
||||
destroyDB(fileLocation);
|
||||
}
|
||||
|
||||
logger.debug("Initializing new or existing database: '{}'", name);
|
||||
logger.debug("Initializing new or existing database: '{}'", fileLocation.getAbsolutePath());
|
||||
db = factory.open(fileLocation, options);
|
||||
|
||||
} catch (IOException ioe) {
|
||||
} catch (Exception ioe) {
|
||||
logger.debug("x");
|
||||
logger.error(ioe.getMessage(), ioe);
|
||||
throw new RuntimeException("Can't initialize database");
|
||||
}
|
||||
|
|
|
@ -5,34 +5,31 @@ import org.ethereum.core.Transaction;
|
|||
import org.ethereum.datasource.KeyValueDataSource;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Component;
|
||||
//import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.StringUtils;
|
||||
import redis.clients.jedis.Jedis;
|
||||
import redis.clients.jedis.JedisPool;
|
||||
import redis.clients.jedis.JedisPoolConfig;
|
||||
import redis.clients.jedis.Protocol;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.annotation.PreDestroy;
|
||||
import java.net.URI;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import static org.springframework.util.StringUtils.isEmpty;
|
||||
import static org.springframework.util.StringUtils.hasLength;
|
||||
|
||||
@Component
|
||||
//@Component
|
||||
public class RedisConnectionImpl implements RedisConnection {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger("db");
|
||||
|
||||
private JedisPool jedisPool;
|
||||
|
||||
@PostConstruct
|
||||
public void tryConnect() {
|
||||
if (!SystemProperties.CONFIG.isRedisEnabled()) return;
|
||||
|
||||
String redisCloudUrl = System.getenv(REDISCLOUD_URL);
|
||||
if (isEmpty(redisCloudUrl)) {
|
||||
if (hasLength(redisCloudUrl)) {
|
||||
logger.info("Cannot connect to Redis. 'REDISCLOUD_URL' environment variable is not defined.");
|
||||
return;
|
||||
}
|
||||
|
@ -50,20 +47,23 @@ public class RedisConnectionImpl implements RedisConnection {
|
|||
private static JedisPool createJedisPool(URI redisUri) {
|
||||
String userInfo = redisUri.getUserInfo();
|
||||
if (StringUtils.hasText(userInfo)) {
|
||||
/*
|
||||
return new JedisPool(new JedisPoolConfig(),
|
||||
redisUri.getHost(),
|
||||
redisUri.getPort(),
|
||||
Protocol.DEFAULT_TIMEOUT,
|
||||
userInfo.split(":", 2)[1]);
|
||||
*/
|
||||
}
|
||||
|
||||
/*
|
||||
return new JedisPool(new JedisPoolConfig(),
|
||||
redisUri.getHost(),
|
||||
redisUri.getPort(),
|
||||
Protocol.DEFAULT_TIMEOUT);
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
|
||||
@PreDestroy
|
||||
public void destroy() {
|
||||
if (jedisPool != null) {
|
||||
jedisPool.destroy();
|
||||
|
|
|
@ -3,7 +3,7 @@ package org.ethereum.db;
|
|||
import org.ethereum.core.Block;
|
||||
import org.ethereum.core.TransactionReceipt;
|
||||
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
//import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.math.BigInteger;
|
||||
|
||||
|
@ -17,36 +17,36 @@ public interface BlockStore {
|
|||
|
||||
public byte[] getBlockHashByNumber(long blockNumber);
|
||||
|
||||
@Transactional(readOnly = true)
|
||||
//@Transactional(readOnly = true)
|
||||
Block getBlockByNumber(long blockNumber);
|
||||
|
||||
@Transactional(readOnly = true)
|
||||
//@Transactional(readOnly = true)
|
||||
Block getBlockByHash(byte[] hash);
|
||||
|
||||
@Transactional(readOnly = true)
|
||||
//@Transactional(readOnly = true)
|
||||
@SuppressWarnings("unchecked")
|
||||
List<byte[]> getListOfHashesStartFrom(byte[] hash, int qty);
|
||||
|
||||
@Transactional
|
||||
//@Transactional
|
||||
void deleteBlocksSince(long number);
|
||||
|
||||
@Transactional
|
||||
//@Transactional
|
||||
void saveBlock(Block block, List<TransactionReceipt> receipts);
|
||||
|
||||
@Transactional(readOnly = true)
|
||||
//@Transactional(readOnly = true)
|
||||
BigInteger getTotalDifficultySince(long number);
|
||||
|
||||
@Transactional(readOnly = true)
|
||||
//@Transactional(readOnly = true)
|
||||
BigInteger getTotalDifficulty();
|
||||
|
||||
@Transactional(readOnly = true)
|
||||
//@Transactional(readOnly = true)
|
||||
Block getBestBlock();
|
||||
|
||||
@Transactional(readOnly = true)
|
||||
//@Transactional(readOnly = true)
|
||||
@SuppressWarnings("unchecked")
|
||||
List<Block> getAllBlocks();
|
||||
|
||||
@Transactional
|
||||
//@Transactional
|
||||
void reset();
|
||||
|
||||
TransactionReceipt getTransactionReceiptByHash(byte[] hash);
|
||||
|
|
|
@ -8,9 +8,9 @@ import org.hibernate.SessionFactory;
|
|||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import org.springframework.transaction.annotation.Propagation;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
//import org.springframework.stereotype.Repository;
|
||||
//import org.springframework.transaction.annotation.Propagation;
|
||||
//import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.math.BigInteger;
|
||||
|
||||
|
@ -23,10 +23,11 @@ import java.util.List;
|
|||
*/
|
||||
public class BlockStoreImpl implements BlockStore {
|
||||
|
||||
@Autowired
|
||||
private SessionFactory sessionFactory;
|
||||
|
||||
public BlockStoreImpl(SessionFactory sessionFactory) {
|
||||
this.sessionFactory = sessionFactory;
|
||||
public BlockStoreImpl() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -38,7 +39,7 @@ public class BlockStoreImpl implements BlockStore {
|
|||
}
|
||||
|
||||
@Override
|
||||
@Transactional(readOnly = true)
|
||||
//@Transactional(readOnly = true)
|
||||
public Block getBlockByNumber(long blockNumber) {
|
||||
|
||||
List result = sessionFactory.getCurrentSession().
|
||||
|
@ -52,7 +53,7 @@ public class BlockStoreImpl implements BlockStore {
|
|||
}
|
||||
|
||||
@Override
|
||||
@Transactional(readOnly = true)
|
||||
//@Transactional(readOnly = true)
|
||||
public Block getBlockByHash(byte[] hash) {
|
||||
|
||||
List result = sessionFactory.getCurrentSession().
|
||||
|
@ -66,7 +67,7 @@ public class BlockStoreImpl implements BlockStore {
|
|||
}
|
||||
|
||||
@Override
|
||||
@Transactional(readOnly = true)
|
||||
//@Transactional(readOnly = true)
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<byte[]> getListOfHashesStartFrom(byte[] hash, int qty) {
|
||||
|
||||
|
@ -89,7 +90,7 @@ public class BlockStoreImpl implements BlockStore {
|
|||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
//@Transactional
|
||||
public void deleteBlocksSince(long number) {
|
||||
|
||||
sessionFactory.getCurrentSession().
|
||||
|
@ -100,7 +101,7 @@ public class BlockStoreImpl implements BlockStore {
|
|||
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
//@Transactional
|
||||
public void saveBlock(Block block, List<TransactionReceipt> receipts) {
|
||||
|
||||
BlockVO blockVO = new BlockVO(block.getNumber(), block.getHash(),
|
||||
|
@ -119,7 +120,7 @@ public class BlockStoreImpl implements BlockStore {
|
|||
}
|
||||
|
||||
@Override
|
||||
@Transactional(readOnly = true)
|
||||
//@Transactional(readOnly = true)
|
||||
public BigInteger getTotalDifficultySince(long number) {
|
||||
|
||||
return (BigInteger) sessionFactory.getCurrentSession().
|
||||
|
@ -130,7 +131,7 @@ public class BlockStoreImpl implements BlockStore {
|
|||
|
||||
|
||||
@Override
|
||||
@Transactional(readOnly = true)
|
||||
//@Transactional(readOnly = true)
|
||||
public BigInteger getTotalDifficulty() {
|
||||
|
||||
return (BigInteger) sessionFactory.getCurrentSession().
|
||||
|
@ -139,7 +140,7 @@ public class BlockStoreImpl implements BlockStore {
|
|||
|
||||
|
||||
@Override
|
||||
@Transactional(readOnly = true)
|
||||
//@Transactional(readOnly = true)
|
||||
public Block getBestBlock() {
|
||||
|
||||
Long bestNumber = (Long)
|
||||
|
@ -154,7 +155,7 @@ public class BlockStoreImpl implements BlockStore {
|
|||
}
|
||||
|
||||
@Override
|
||||
@Transactional(readOnly = true)
|
||||
//@Transactional(readOnly = true)
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<Block> getAllBlocks() {
|
||||
|
||||
|
@ -170,7 +171,7 @@ public class BlockStoreImpl implements BlockStore {
|
|||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
//@Transactional
|
||||
public void reset() {
|
||||
sessionFactory.getCurrentSession().
|
||||
createQuery("delete from BlockVO").executeUpdate();
|
|
@ -74,13 +74,14 @@ public class RepositoryDummy extends RepositoryImpl {
|
|||
accountState.setStateRoot(contractDetails.getStorageHash());
|
||||
accountState.setCodeHash(sha3(contractDetails.getCode()));
|
||||
worldState.put(hash, accountState);
|
||||
if (logger.isDebugEnabled()) {
|
||||
/* if (logger.isDebugEnabled()) {
|
||||
logger.debug("update: [{}],nonce: [{}] balance: [{}] \n [{}]",
|
||||
Hex.toHexString(hash.getData()),
|
||||
accountState.getNonce(),
|
||||
accountState.getBalance(),
|
||||
contractDetails.getStorage());
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -18,8 +18,8 @@ import org.slf4j.LoggerFactory;
|
|||
|
||||
import org.spongycastle.util.encoders.Hex;
|
||||
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.FileSystemUtils;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
//import org.springframework.util.FileSystemUtils;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
|
@ -65,17 +65,25 @@ public class RepositoryImpl implements Repository {
|
|||
|
||||
public RepositoryImpl(KeyValueDataSource detailsDS, KeyValueDataSource stateDS) {
|
||||
|
||||
logger.debug("test1");
|
||||
detailsDS.setName(DETAILS_DB);
|
||||
logger.debug("test2");
|
||||
detailsDS.init();
|
||||
logger.debug("test3");
|
||||
this.detailsDS = detailsDS;
|
||||
|
||||
stateDS.setName(STATE_DB);
|
||||
logger.debug("test4");
|
||||
stateDS.init();
|
||||
logger.debug("test5");
|
||||
this.stateDS = stateDS;
|
||||
|
||||
detailsDB = new DatabaseImpl(detailsDS);
|
||||
logger.debug("test6");
|
||||
stateDB = new DatabaseImpl(stateDS);
|
||||
logger.debug("test7");
|
||||
worldState = new TrieImpl(stateDB.getDb());
|
||||
logger.debug("test8");
|
||||
}
|
||||
|
||||
public RepositoryImpl(String detailsDbName, String stateDbName) {
|
||||
|
@ -137,14 +145,14 @@ public class RepositoryImpl implements Repository {
|
|||
accountState.setStateRoot(contractDetails.getStorageHash());
|
||||
accountState.setCodeHash(sha3(contractDetails.getCode()));
|
||||
worldState.update(hash.getData(), accountState.getEncoded());
|
||||
if (logger.isDebugEnabled()) {
|
||||
/*if (logger.isDebugEnabled()) {
|
||||
logger.debug("update: [{}],nonce: [{}] balance: [{}] \n [{}]",
|
||||
Hex.toHexString(hash.getData()),
|
||||
accountState.getNonce(),
|
||||
accountState.getBalance(),
|
||||
contractDetails.getStorage());
|
||||
}
|
||||
|
||||
*/
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -193,7 +201,13 @@ public class RepositoryImpl implements Repository {
|
|||
|
||||
if (block.getNumber() == 0 && txNumber == 0)
|
||||
if (CONFIG.dumpCleanOnRestart()) {
|
||||
FileSystemUtils.deleteRecursively(new File(CONFIG.dumpDir()));
|
||||
try{
|
||||
FileUtils.forceDelete(new File(CONFIG.dumpDir()));
|
||||
}catch(IOException e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
//FileSystemUtils.deleteRecursively(new File(CONFIG.dumpDir()));
|
||||
}
|
||||
|
||||
String dir = CONFIG.dumpDir() + "/";
|
||||
|
|
|
@ -125,8 +125,8 @@ public class RepositoryTrack implements Repository {
|
|||
BigInteger saveNonce = accountState.getNonce();
|
||||
accountState.incrementNonce();
|
||||
|
||||
logger.trace("increase nonce addr: [{}], from: [{}], to: [{}]", Hex.toHexString(addr),
|
||||
saveNonce, accountState.getNonce());
|
||||
//logger.trace("increase nonce addr: [{}], from: [{}], to: [{}]", Hex.toHexString(addr),
|
||||
// saveNonce, accountState.getNonce());
|
||||
|
||||
return accountState.getNonce();
|
||||
}
|
||||
|
@ -140,8 +140,8 @@ public class RepositoryTrack implements Repository {
|
|||
BigInteger saveNonce = accountState.getNonce();
|
||||
accountState.setNonce(bigInteger);
|
||||
|
||||
logger.trace("increase nonce addr: [{}], from: [{}], to: [{}]", Hex.toHexString(addr),
|
||||
saveNonce, accountState.getNonce());
|
||||
//logger.trace("increase nonce addr: [{}], from: [{}], to: [{}]", Hex.toHexString(addr),
|
||||
// saveNonce, accountState.getNonce());
|
||||
|
||||
return accountState.getNonce();
|
||||
|
||||
|
@ -170,8 +170,8 @@ public class RepositoryTrack implements Repository {
|
|||
|
||||
BigInteger newBalance = accountState.addToBalance(value);
|
||||
|
||||
logger.trace("adding to balance addr: [{}], balance: [{}], delta: [{}]", Hex.toHexString(addr),
|
||||
newBalance, value);
|
||||
//logger.trace("adding to balance addr: [{}], balance: [{}], delta: [{}]", Hex.toHexString(addr),
|
||||
// newBalance, value);
|
||||
|
||||
return newBalance;
|
||||
}
|
||||
|
@ -192,8 +192,8 @@ public class RepositoryTrack implements Repository {
|
|||
@Override
|
||||
public void addStorageRow(byte[] addr, DataWord key, DataWord value) {
|
||||
|
||||
logger.trace("add storage row, addr: [{}], key: [{}] val: [{}]", Hex.toHexString(addr),
|
||||
key.toString(), value.toString());
|
||||
//logger.trace("add storage row, addr: [{}], key: [{}] val: [{}]", Hex.toHexString(addr),
|
||||
// key.toString(), value.toString());
|
||||
|
||||
getContractDetails(addr).put(key, value);
|
||||
}
|
||||
|
|
|
@ -71,13 +71,13 @@ public class RepositoryVMTestDummy extends RepositoryImpl{
|
|||
accountState.setStateRoot(contractDetails.getStorageHash());
|
||||
accountState.setCodeHash(sha3(contractDetails.getCode()));
|
||||
worldState.put(hash, accountState);
|
||||
if (logger.isDebugEnabled()) {
|
||||
/*if (logger.isDebugEnabled()) {
|
||||
logger.debug("update: [{}],nonce: [{}] balance: [{}] \n [{}]",
|
||||
Hex.toHexString(hash.getData()),
|
||||
accountState.getNonce(),
|
||||
accountState.getBalance(),
|
||||
contractDetails.getStorage());
|
||||
}
|
||||
}*/
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -1,42 +1,30 @@
|
|||
package org.ethereum.facade;
|
||||
|
||||
import org.ethereum.config.SystemProperties;
|
||||
import org.ethereum.core.Transaction;
|
||||
import org.ethereum.datasource.KeyValueDataSource;
|
||||
import org.ethereum.datasource.LevelDbDataSource;
|
||||
import org.ethereum.datasource.redis.RedisConnection;
|
||||
import org.ethereum.db.RepositoryImpl;
|
||||
import org.hibernate.SessionFactory;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.ComponentScan;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Scope;
|
||||
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
|
||||
import org.springframework.jdbc.datasource.DriverManagerDataSource;
|
||||
import org.springframework.orm.hibernate4.LocalSessionFactoryBuilder;
|
||||
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
||||
//import org.springframework.beans.factory.annotation.Autowired;
|
||||
//import org.springframework.context.annotation.Bean;
|
||||
//import org.springframework.context.annotation.ComponentScan;
|
||||
//import org.springframework.context.annotation.Configuration;
|
||||
//import org.springframework.context.annotation.Scope;
|
||||
//import org.springframework.jdbc.datasource.DataSourceTransactionManager;
|
||||
//import org.springframework.jdbc.datasource.DriverManagerDataSource;
|
||||
//import org.springframework.orm.hibernate4.LocalSessionFactoryBuilder;
|
||||
//import org.springframework.transaction.annotation.EnableTransactionManagement;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Properties;
|
||||
import java.util.Set;
|
||||
|
||||
import static org.ethereum.config.SystemProperties.CONFIG;
|
||||
|
||||
@Configuration
|
||||
@EnableTransactionManagement
|
||||
@ComponentScan(basePackages = "org.ethereum")
|
||||
//@Configuration
|
||||
//@EnableTransactionManagement
|
||||
//@ComponentScan(basePackages = "org.ethereum")
|
||||
public class CommonConfig {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger("general");
|
||||
|
||||
@Autowired
|
||||
private RedisConnection redisConnection;
|
||||
|
||||
//@Autowired
|
||||
//private RedisConnection redisConnection;
|
||||
/*
|
||||
@Bean
|
||||
Repository repository() {
|
||||
return new RepositoryImpl(keyValueDataSource(), keyValueDataSource());
|
||||
|
@ -83,7 +71,7 @@ public class CommonConfig {
|
|||
|
||||
return builder.buildSessionFactory();
|
||||
}
|
||||
|
||||
*/
|
||||
private Properties getHibernateProperties() {
|
||||
|
||||
Properties prop = new Properties();
|
||||
|
@ -100,7 +88,7 @@ public class CommonConfig {
|
|||
return prop;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@Bean
|
||||
public DataSourceTransactionManager transactionManager() {
|
||||
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
|
||||
|
@ -108,7 +96,8 @@ public class CommonConfig {
|
|||
|
||||
return dataSourceTransactionManager;
|
||||
}
|
||||
|
||||
*/
|
||||
/*
|
||||
@Bean(name = "dataSource")
|
||||
public DriverManagerDataSource dataSource() {
|
||||
|
||||
|
@ -131,5 +120,6 @@ public class CommonConfig {
|
|||
|
||||
return ds;
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
||||
|
|
|
@ -1,29 +1,29 @@
|
|||
package org.ethereum.facade;
|
||||
|
||||
import org.ethereum.db.BlockStore;
|
||||
import org.ethereum.db.BlockStoreImpl;
|
||||
import org.ethereum.db.InMemoryBlockStore;
|
||||
import org.hibernate.SessionFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Import;
|
||||
import org.springframework.transaction.annotation.Propagation;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
//import org.springframework.context.annotation.Bean;
|
||||
//import org.springframework.context.annotation.Configuration;
|
||||
//import org.springframework.context.annotation.Import;
|
||||
//import org.springframework.transaction.annotation.Propagation;
|
||||
//import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author: Roman Mandeleil
|
||||
* Created on: 27/01/2015 01:05
|
||||
*/
|
||||
@Configuration
|
||||
@Import(CommonConfig.class)
|
||||
//@Configuration
|
||||
//@Import(CommonConfig.class)
|
||||
public class DefaultConfig {
|
||||
|
||||
@Autowired CommonConfig commonConfig;
|
||||
|
||||
@Bean
|
||||
@Transactional(propagation = Propagation.SUPPORTS)
|
||||
//@Bean
|
||||
//@Transactional(propagation = Propagation.SUPPORTS)
|
||||
public BlockStore blockStore(SessionFactory sessionFactory){
|
||||
return new BlockStoreImpl(sessionFactory);
|
||||
return new InMemoryBlockStore();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ import org.ethereum.manager.AdminInfo;
|
|||
import org.ethereum.net.client.PeerClient;
|
||||
import org.ethereum.net.peerdiscovery.PeerInfo;
|
||||
import org.ethereum.net.server.ChannelManager;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
|
||||
import java.math.BigInteger;
|
||||
|
||||
|
@ -63,6 +64,8 @@ public interface Ethereum {
|
|||
*/
|
||||
public Set<PeerInfo> getPeers();
|
||||
|
||||
public void setContext(ApplicationContext context);
|
||||
|
||||
public void startPeerDiscovery();
|
||||
|
||||
public void stopPeerDiscovery();
|
||||
|
|
|
@ -8,6 +8,7 @@ import org.ethereum.manager.WorldManager;
|
|||
import org.ethereum.net.client.PeerClient;
|
||||
import org.ethereum.net.peerdiscovery.PeerInfo;
|
||||
import org.ethereum.net.server.ChannelManager;
|
||||
import org.ethereum.net.server.EthereumChannelInitializer;
|
||||
import org.ethereum.net.server.PeerServer;
|
||||
import org.ethereum.net.submit.TransactionExecutor;
|
||||
import org.ethereum.net.submit.TransactionTask;
|
||||
|
@ -16,9 +17,8 @@ import org.slf4j.Logger;
|
|||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.stereotype.Component;
|
||||
//import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import java.math.BigInteger;
|
||||
import java.net.InetAddress;
|
||||
import java.util.HashSet;
|
||||
|
@ -26,13 +26,15 @@ import java.util.Set;
|
|||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
import org.robospring.RoboSpring;
|
||||
|
||||
import static org.ethereum.config.SystemProperties.CONFIG;
|
||||
|
||||
/**
|
||||
* @author Roman Mandeleil
|
||||
* @since 27.07.2014
|
||||
*/
|
||||
@Component
|
||||
//@Component
|
||||
public class EthereumImpl implements Ethereum {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger("facade");
|
||||
|
@ -54,9 +56,10 @@ public class EthereumImpl implements Ethereum {
|
|||
|
||||
public EthereumImpl() {
|
||||
System.out.println();
|
||||
logger.info("EthereumImpl constructor");
|
||||
//RoboSpring.autowire(ctx);
|
||||
}
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
worldManager.loadBlockchain();
|
||||
if (CONFIG.listenPort() > 0) {
|
||||
|
@ -70,6 +73,10 @@ public class EthereumImpl implements Ethereum {
|
|||
}
|
||||
}
|
||||
|
||||
public void setContext(ApplicationContext ctx) {
|
||||
this.ctx = ctx;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find a peer but not this one
|
||||
*
|
||||
|
@ -180,7 +187,6 @@ public class EthereumImpl implements Ethereum {
|
|||
|
||||
PeerClient peer = worldManager.getActivePeer();
|
||||
if (peer == null) {
|
||||
|
||||
peer = new PeerClient();
|
||||
worldManager.setActivePeer(peer);
|
||||
}
|
||||
|
|
|
@ -4,19 +4,19 @@ import org.ethereum.db.BlockStore;
|
|||
import org.ethereum.db.InMemoryBlockStore;
|
||||
import org.hibernate.SessionFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Import;
|
||||
import org.springframework.transaction.annotation.Propagation;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
//import org.springframework.context.annotation.Bean;
|
||||
//import org.springframework.context.annotation.Configuration;
|
||||
//import org.springframework.context.annotation.Import;
|
||||
//import org.springframework.transaction.annotation.Propagation;
|
||||
//import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author: Roman Mandeleil
|
||||
* Created on: 27/01/2015 01:05
|
||||
*/
|
||||
@Configuration
|
||||
@Import(CommonConfig.class)
|
||||
//@Configuration
|
||||
//@Import(CommonConfig.class)
|
||||
public class RemoteConfig {
|
||||
|
||||
@Autowired CommonConfig commonConfig;
|
||||
|
@ -24,8 +24,8 @@ public class RemoteConfig {
|
|||
// todo: init total difficulty
|
||||
// todo: init last 1000 blocks
|
||||
|
||||
@Bean
|
||||
@Transactional(propagation = Propagation.SUPPORTS)
|
||||
//@Bean
|
||||
//@Transactional(propagation = Propagation.SUPPORTS)
|
||||
public BlockStore blockStore(SessionFactory sessionFactory){
|
||||
return new InMemoryBlockStore();
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@ import org.ethereum.core.TransactionReceipt;
|
|||
import org.ethereum.net.message.Message;
|
||||
import org.ethereum.net.p2p.HelloMessage;
|
||||
|
||||
import org.springframework.stereotype.Component;
|
||||
//import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
@ -16,7 +16,7 @@ import java.util.Set;
|
|||
* @author Roman Mandeleil
|
||||
* @since 12.11.2014
|
||||
*/
|
||||
@Component(value = "EthereumListener")
|
||||
//@Component(value = "EthereumListener")
|
||||
public class CompositeEthereumListener implements EthereumListener {
|
||||
|
||||
List<EthereumListener> listeners = new ArrayList<>();
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
package org.ethereum.manager;
|
||||
|
||||
import org.springframework.stereotype.Component;
|
||||
//import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
@ -11,7 +10,7 @@ import java.util.List;
|
|||
* @author Roman Mandeleil
|
||||
* @since 11.12.2014
|
||||
*/
|
||||
@Component
|
||||
//@Component
|
||||
public class AdminInfo {
|
||||
|
||||
|
||||
|
@ -20,7 +19,6 @@ public class AdminInfo {
|
|||
private List<Long> blockExecTime = new LinkedList<>();
|
||||
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
startupTimeStamp = System.currentTimeMillis();
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@ import org.slf4j.LoggerFactory;
|
|||
import org.spongycastle.util.encoders.Hex;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
//import org.springframework.stereotype.Component;
|
||||
|
||||
import java.math.BigInteger;
|
||||
|
||||
|
@ -27,9 +27,6 @@ import java.util.HashSet;
|
|||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.annotation.PreDestroy;
|
||||
|
||||
import static org.ethereum.config.SystemProperties.CONFIG;
|
||||
|
||||
/**
|
||||
|
@ -38,7 +35,7 @@ import static org.ethereum.config.SystemProperties.CONFIG;
|
|||
* @author Roman Mandeleil
|
||||
* @since 01.06.2014
|
||||
*/
|
||||
@Component
|
||||
//@Component
|
||||
public class WorldManager {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger("general");
|
||||
|
@ -52,7 +49,6 @@ public class WorldManager {
|
|||
@Autowired
|
||||
private Wallet wallet;
|
||||
|
||||
@Autowired
|
||||
private PeerClient activePeer;
|
||||
|
||||
@Autowired
|
||||
|
@ -71,7 +67,10 @@ public class WorldManager {
|
|||
@Autowired
|
||||
private EthereumListener listener;
|
||||
|
||||
@PostConstruct
|
||||
public WorldManager() {
|
||||
logger.info("World manager instantiated");
|
||||
}
|
||||
|
||||
public void init() {
|
||||
byte[] cowAddr = HashUtil.sha3("cow".getBytes());
|
||||
wallet.importKey(cowAddr);
|
||||
|
@ -164,10 +163,10 @@ public class WorldManager {
|
|||
BigInteger totalDifficulty = blockStore.getTotalDifficulty();
|
||||
blockchain.setTotalDifficulty(totalDifficulty);
|
||||
|
||||
logger.info("*** Loaded up to block [{}] totalDifficulty [{}] with stateRoot [{}]",
|
||||
blockchain.getBestBlock().getNumber(),
|
||||
blockchain.getTotalDifficulty().toString(),
|
||||
Hex.toHexString(blockchain.getBestBlock().getStateRoot()));
|
||||
//logger.info("*** Loaded up to block [{}] totalDifficulty [{}] with stateRoot [{}]",
|
||||
// blockchain.getBestBlock().getNumber(),
|
||||
// blockchain.getTotalDifficulty().toString(),
|
||||
// Hex.toHexString(blockchain.getBestBlock().getStateRoot()));
|
||||
}
|
||||
|
||||
if (CONFIG.rootHashStart() != null) {
|
||||
|
@ -200,7 +199,6 @@ public class WorldManager {
|
|||
}
|
||||
|
||||
|
||||
@PreDestroy
|
||||
public void close() {
|
||||
stopPeerDiscovery();
|
||||
repository.close();
|
||||
|
|
|
@ -9,7 +9,7 @@ import org.slf4j.LoggerFactory;
|
|||
import org.spongycastle.util.encoders.Hex;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
//import org.springframework.stereotype.Component;
|
||||
|
||||
import java.math.BigInteger;
|
||||
|
||||
|
@ -34,7 +34,7 @@ import static org.ethereum.config.SystemProperties.CONFIG;
|
|||
* @author Roman Mandeleil
|
||||
* @since 27.07.2014
|
||||
*/
|
||||
@Component
|
||||
//@Component
|
||||
public class BlockQueue {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger("blockqueue");
|
||||
|
|
|
@ -11,8 +11,8 @@ import org.slf4j.Logger;
|
|||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Scope;
|
||||
import org.springframework.stereotype.Component;
|
||||
//import org.springframework.context.annotation.Scope;
|
||||
//import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.Queue;
|
||||
import java.util.Timer;
|
||||
|
@ -36,8 +36,8 @@ import static org.ethereum.net.message.StaticMessages.DISCONNECT_MESSAGE;
|
|||
*
|
||||
* @author Roman Mandeleil
|
||||
*/
|
||||
@Component
|
||||
@Scope("prototype")
|
||||
//@Component
|
||||
//@Scope("prototype")
|
||||
public class MessageQueue {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger("net");
|
||||
|
|
|
@ -16,8 +16,8 @@ import org.slf4j.Logger;
|
|||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Scope;
|
||||
import org.springframework.stereotype.Component;
|
||||
//import org.springframework.context.annotation.Scope;
|
||||
//import org.springframework.stereotype.Component;
|
||||
|
||||
import static org.ethereum.config.SystemProperties.CONFIG;
|
||||
|
||||
|
@ -26,8 +26,8 @@ import static org.ethereum.config.SystemProperties.CONFIG;
|
|||
*
|
||||
* @see <a href="http://netty.io">http://netty.io</a>
|
||||
*/
|
||||
@Component
|
||||
@Scope("prototype")
|
||||
//@Component
|
||||
//@Scope("prototype")
|
||||
public class PeerClient {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger("net");
|
||||
|
@ -43,6 +43,11 @@ public class PeerClient {
|
|||
@Autowired
|
||||
public EthereumChannelInitializer ethereumChannelInitializer;
|
||||
|
||||
|
||||
public PeerClient() {
|
||||
logger.info("Peer client instantiated");
|
||||
}
|
||||
|
||||
public void connect(String host, int port) {
|
||||
|
||||
EventLoopGroup workerGroup = new NioEventLoopGroup();
|
||||
|
|
|
@ -19,8 +19,8 @@ import org.slf4j.Logger;
|
|||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Scope;
|
||||
import org.springframework.stereotype.Component;
|
||||
//import org.springframework.context.annotation.Scope;
|
||||
//import org.springframework.stereotype.Component;
|
||||
|
||||
import java.math.BigInteger;
|
||||
|
||||
|
@ -50,8 +50,8 @@ import static org.ethereum.net.message.StaticMessages.GET_TRANSACTIONS_MESSAGE;
|
|||
* <li>BLOCKS : Send a list of blocks</li>
|
||||
* </ul>
|
||||
*/
|
||||
@Component
|
||||
@Scope("prototype")
|
||||
//@Component
|
||||
//@Scope("prototype")
|
||||
public class EthHandler extends SimpleChannelInboundHandler<EthMessage> {
|
||||
|
||||
public final static byte VERSION = 54;
|
||||
|
|
|
@ -22,8 +22,8 @@ import org.slf4j.Logger;
|
|||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Scope;
|
||||
import org.springframework.stereotype.Component;
|
||||
//import org.springframework.context.annotation.Scope;
|
||||
//import org.springframework.stereotype.Component;
|
||||
|
||||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
|
@ -51,8 +51,8 @@ import static org.ethereum.net.message.StaticMessages.*;
|
|||
* <li>PONG : Confirm that they themselves are still alive</li>
|
||||
* </ul>
|
||||
*/
|
||||
@Component
|
||||
@Scope("prototype")
|
||||
//@Component
|
||||
//@Scope("prototype")
|
||||
public class P2pHandler extends SimpleChannelInboundHandler<P2pMessage> {
|
||||
|
||||
public final static byte VERSION = 3;
|
||||
|
|
|
@ -27,8 +27,8 @@ import org.slf4j.LoggerFactory;
|
|||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.annotation.Scope;
|
||||
import org.springframework.stereotype.Component;
|
||||
//import org.springframework.context.annotation.Scope;
|
||||
//import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
|
@ -39,8 +39,8 @@ import static org.ethereum.config.SystemProperties.CONFIG;
|
|||
*
|
||||
* @see <a href="http://netty.io">http://netty.io</a>
|
||||
*/
|
||||
@Component
|
||||
@Scope("prototype")
|
||||
//@Component
|
||||
//@Scope("prototype")
|
||||
public class DiscoveryChannel {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger("net");
|
||||
|
|
|
@ -7,7 +7,7 @@ import org.slf4j.LoggerFactory;
|
|||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.stereotype.Component;
|
||||
//import org.springframework.stereotype.Component;
|
||||
|
||||
import java.net.InetAddress;
|
||||
import java.net.UnknownHostException;
|
||||
|
@ -33,7 +33,7 @@ import static org.ethereum.config.SystemProperties.CONFIG;
|
|||
* @author Roman Mandeleil
|
||||
* @since 22.05.2014
|
||||
*/
|
||||
@Component
|
||||
//@Component
|
||||
public class PeerDiscovery {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger("peerdiscovery");
|
||||
|
|
|
@ -5,8 +5,8 @@ import org.slf4j.LoggerFactory;
|
|||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.annotation.Scope;
|
||||
import org.springframework.stereotype.Component;
|
||||
//import org.springframework.context.annotation.Scope;
|
||||
//import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
|
||||
|
@ -14,8 +14,8 @@ import java.util.concurrent.ThreadPoolExecutor;
|
|||
* @author Roman Mandeleil
|
||||
* @since 22.05.2014
|
||||
*/
|
||||
@Component
|
||||
@Scope("prototype")
|
||||
//@Component
|
||||
//@Scope("prototype")
|
||||
public class WorkerThread implements Runnable {
|
||||
|
||||
private final static Logger logger = LoggerFactory.getLogger("peerdiscovery");
|
||||
|
|
|
@ -11,8 +11,8 @@ import org.ethereum.net.wire.MessageDecoder;
|
|||
import org.ethereum.net.wire.MessageEncoder;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Scope;
|
||||
import org.springframework.stereotype.Component;
|
||||
//import org.springframework.context.annotation.Scope;
|
||||
//import org.springframework.stereotype.Component;
|
||||
|
||||
import java.math.BigInteger;
|
||||
|
||||
|
@ -22,8 +22,8 @@ import java.net.InetSocketAddress;
|
|||
* @author Roman Mandeleil
|
||||
* @since 01.11.2014
|
||||
*/
|
||||
@Component
|
||||
@Scope("prototype")
|
||||
//@Component
|
||||
//@Scope("prototype")
|
||||
public class Channel {
|
||||
|
||||
@Autowired
|
||||
|
|
|
@ -9,7 +9,7 @@ import org.slf4j.Logger;
|
|||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
//import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
|
@ -20,13 +20,12 @@ import java.util.Map;
|
|||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
|
||||
/**
|
||||
* @author Roman Mandeleil
|
||||
* @since 11.11.2014
|
||||
*/
|
||||
@Component
|
||||
//@Component
|
||||
public class ChannelManager {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger("net");
|
||||
|
@ -43,7 +42,6 @@ public class ChannelManager {
|
|||
}
|
||||
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
scheduleChannelCollector();
|
||||
}
|
||||
|
|
|
@ -15,7 +15,7 @@ import org.slf4j.LoggerFactory;
|
|||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.stereotype.Component;
|
||||
//import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
|
@ -25,7 +25,7 @@ import static org.ethereum.config.SystemProperties.CONFIG;
|
|||
* @author Roman Mandeleil
|
||||
* @since 01.11.2014
|
||||
*/
|
||||
@Component
|
||||
//@Component
|
||||
public class EthereumChannelInitializer extends ChannelInitializer<NioSocketChannel> {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger("net");
|
||||
|
@ -43,6 +43,7 @@ public class EthereumChannelInitializer extends ChannelInitializer<NioSocketChan
|
|||
WorldManager worldManager;
|
||||
|
||||
public EthereumChannelInitializer() {
|
||||
logger.info("Channel initializer instantiated");
|
||||
}
|
||||
|
||||
public void initChannel(NioSocketChannel ch) throws Exception {
|
||||
|
|
|
@ -15,7 +15,7 @@ import org.slf4j.Logger;
|
|||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
//import org.springframework.stereotype.Component;
|
||||
|
||||
import static org.ethereum.config.SystemProperties.CONFIG;
|
||||
|
||||
|
@ -26,7 +26,7 @@ import static org.ethereum.config.SystemProperties.CONFIG;
|
|||
* @author Roman Mandeleil
|
||||
* @since 01.11.2014
|
||||
*/
|
||||
@Component
|
||||
//@Component
|
||||
public class PeerServer {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger("net");
|
||||
|
|
|
@ -10,16 +10,16 @@ import org.slf4j.Logger;
|
|||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Scope;
|
||||
import org.springframework.stereotype.Component;
|
||||
//import org.springframework.context.annotation.Scope;
|
||||
//import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* Process the messages between peers with 'shh' capability on the network.
|
||||
*
|
||||
* Peers with 'shh' capability can send/receive:
|
||||
*/
|
||||
@Component
|
||||
@Scope("prototype")
|
||||
//@Component
|
||||
//@Scope("prototype")
|
||||
public class ShhHandler extends SimpleChannelInboundHandler<ShhMessage> {
|
||||
|
||||
public final static byte VERSION = 1;
|
||||
|
|
|
@ -15,16 +15,16 @@ import org.slf4j.LoggerFactory;
|
|||
import org.spongycastle.util.encoders.Hex;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Scope;
|
||||
import org.springframework.stereotype.Component;
|
||||
//import org.springframework.context.annotation.Scope;
|
||||
//import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* The PacketDecoder parses every valid Ethereum packet to a Message object
|
||||
*/
|
||||
@Component
|
||||
@Scope("prototype")
|
||||
//@Component
|
||||
//@Scope("prototype")
|
||||
public class MessageDecoder extends ByteToMessageDecoder {
|
||||
|
||||
private static final Logger loggerWire = LoggerFactory.getLogger("wire");
|
||||
|
@ -80,8 +80,8 @@ public class MessageDecoder extends ByteToMessageDecoder {
|
|||
// Don't have the full message yet
|
||||
long msgSize = in.getInt(in.readerIndex());
|
||||
if (msgSize > in.readableBytes()) {
|
||||
loggerWire.trace("msg decode: magicBytes: [{}], readBytes: [{}] / msgSize: [{}] ",
|
||||
syncToken, in.readableBytes(), msgSize);
|
||||
//loggerWire.trace("msg decode: magicBytes: [{}], readBytes: [{}] / msgSize: [{}] ",
|
||||
// syncToken, in.readableBytes(), msgSize);
|
||||
in.resetReaderIndex();
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -15,14 +15,14 @@ import org.slf4j.LoggerFactory;
|
|||
import org.spongycastle.util.encoders.Hex;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Scope;
|
||||
import org.springframework.stereotype.Component;
|
||||
//import org.springframework.context.annotation.Scope;
|
||||
//import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* The PacketEncoder encodes the message and adds a sync token to every packet.
|
||||
*/
|
||||
@Component
|
||||
@Scope("prototype")
|
||||
//@Component
|
||||
//@Scope("prototype")
|
||||
public class MessageEncoder extends MessageToByteEncoder<Message> {
|
||||
|
||||
private static final Logger loggerWire = LoggerFactory.getLogger("wire");
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package org.ethereum.util;
|
||||
|
||||
import org.apache.log4j.PropertyConfigurator;
|
||||
//import org.apache.log4j.PropertyConfigurator;
|
||||
|
||||
import java.net.URL;
|
||||
|
||||
|
@ -16,7 +16,7 @@ public class AdvancedDeviceUtils {
|
|||
// here we can turn on the detail tracing in the middle of the chain
|
||||
if (blockNum >= CONFIG.traceStartBlock() && CONFIG.traceStartBlock() != -1) {
|
||||
URL configFile = ClassLoader.getSystemResource("log4j-detailed.properties");
|
||||
PropertyConfigurator.configure(configFile);
|
||||
//PropertyConfigurator.configure(configFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,8 +16,6 @@ import java.util.Date;
|
|||
import java.util.List;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
public class Utils {
|
||||
|
||||
private static SecureRandom random = new SecureRandom();
|
||||
|
@ -48,13 +46,7 @@ public class Utils {
|
|||
return formatter.format(date);
|
||||
}
|
||||
|
||||
public static ImageIcon getImageIcon(String resource) {
|
||||
URL imageURL = ClassLoader.getSystemResource(resource);
|
||||
ImageIcon image = new ImageIcon(imageURL);
|
||||
return image;
|
||||
}
|
||||
|
||||
static BigInteger _1000_ = new BigInteger("1000");
|
||||
static BigInteger _1000_ = new BigInteger("1000");
|
||||
|
||||
public static String getValueShortString(BigInteger number) {
|
||||
BigInteger result = number;
|
||||
|
|
|
@ -20,9 +20,10 @@ import java.math.BigInteger;
|
|||
import java.nio.ByteBuffer;
|
||||
import java.util.*;
|
||||
|
||||
import static java.lang.String.format;
|
||||
import static org.ethereum.config.SystemProperties.CONFIG;
|
||||
import static org.ethereum.util.ByteUtil.EMPTY_BYTE_ARRAY;
|
||||
import static org.springframework.util.StringUtils.isEmpty;
|
||||
import static org.springframework.util.StringUtils.hasLength;
|
||||
|
||||
/**
|
||||
* @author Roman Mandeleil
|
||||
|
@ -190,8 +191,7 @@ public class Program {
|
|||
*/
|
||||
public void stackRequire(int stackSize) {
|
||||
if (stack.size() < stackSize) {
|
||||
throw new StackTooSmallException("Expected: " + stackSize
|
||||
+ ", found: " + stack.size());
|
||||
throw Program.Exception.tooSmallStack(stackSize, stack.size());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -445,17 +445,18 @@ public class Program {
|
|||
// FETCH THE CODE
|
||||
byte[] programCode = this.result.getRepository().getCode(codeAddress);
|
||||
|
||||
if (logger.isInfoEnabled())
|
||||
/* if (logger.isInfoEnabled())
|
||||
logger.info(msg.getType().name() + " for existing contract: address: [{}], outDataOffs: [{}], outDataSize: [{}] ",
|
||||
Hex.toHexString(contextAddress), msg.getOutDataOffs().longValue(), msg.getOutDataSize().longValue());
|
||||
|
||||
*/
|
||||
// 2.1 PERFORM THE GAS VALUE TX
|
||||
// (THIS STAGE IS NOT REVERTED BY ANY EXCEPTION)
|
||||
if (this.getGas().longValue() - msg.getGas().longValue() < 0) {
|
||||
gasLogger.info("No gas for the internal call, \n" +
|
||||
"fromAddress={}, codeAddress={}",
|
||||
OutOfGasException ex = new OutOfGasException("Not enough gas for the internal call: fromAddress[%s], codeAddress[%s];",
|
||||
Hex.toHexString(senderAddress), Hex.toHexString(codeAddress));
|
||||
throw new OutOfGasException();
|
||||
gasLogger.info(ex.getMessage());
|
||||
|
||||
throw ex;
|
||||
}
|
||||
|
||||
BigInteger endowment = msg.getEndowment().value();
|
||||
|
@ -545,11 +546,12 @@ public class Program {
|
|||
}
|
||||
|
||||
public void spendGas(long gasValue, String cause) {
|
||||
gasLogger.info("[{}] Spent for cause: [{}], gas: [{}]", invokeHash, cause, gasValue);
|
||||
//gasLogger.info("[{}] Spent for cause: [{}], gas: [{}]", invokeHash, cause, gasValue);
|
||||
|
||||
long afterSpend = invokeData.getGas().longValue() - gasValue - result.getGasUsed();
|
||||
if (afterSpend < 0)
|
||||
throw new OutOfGasException();
|
||||
if (afterSpend < 0) {
|
||||
throw Program.Exception.notEnoughSpendingGas(cause, gasValue, this);
|
||||
}
|
||||
result.spendGas(gasValue);
|
||||
}
|
||||
|
||||
|
@ -558,7 +560,7 @@ public class Program {
|
|||
}
|
||||
|
||||
public void refundGas(long gasValue, String cause) {
|
||||
gasLogger.info("[{}] Refund for cause: [{}], gas: [{}]", invokeHash, cause, gasValue);
|
||||
//gasLogger.info("[{}] Refund for cause: [{}], gas: [{}]", invokeHash, cause, gasValue);
|
||||
result.refundGas(gasValue);
|
||||
}
|
||||
|
||||
|
@ -700,7 +702,7 @@ public class Program {
|
|||
secondLine.append(ByteUtil.oneByteToHexString(value)).append(" ");
|
||||
|
||||
if ((i + 1) % 8 == 0) {
|
||||
String tmp = String.format("%4s", Integer.toString(i - 7, 16)).replace(" ", "0");
|
||||
String tmp = format("%4s", Integer.toString(i - 7, 16)).replace(" ", "0");
|
||||
memoryData.append("").append(tmp).append(" ");
|
||||
memoryData.append(firstLine).append(" ");
|
||||
memoryData.append(secondLine);
|
||||
|
@ -744,7 +746,7 @@ public class Program {
|
|||
oneLine.append(ByteUtil.oneByteToHexString(value)).append(" ");
|
||||
|
||||
if ((i + 1) % 16 == 0) {
|
||||
String tmp = String.format("[%4s]-[%4s]", Integer.toString(i - 15, 16),
|
||||
String tmp = format("[%4s]-[%4s]", Integer.toString(i - 15, 16),
|
||||
Integer.toString(i, 16)).replace(" ", "0");
|
||||
memoryData.append("").append(tmp).append(" ");
|
||||
memoryData.append(oneLine);
|
||||
|
@ -773,11 +775,11 @@ public class Program {
|
|||
logger.trace(" -- STACK -- {}", stackData);
|
||||
logger.trace(" -- MEMORY -- {}", memoryData);
|
||||
logger.trace(" -- STORAGE -- {}\n", storageData);
|
||||
logger.trace("\n Spent Gas: [{}]/[{}]\n Left Gas: [{}]\n",
|
||||
/*logger.trace("\n Spent Gas: [{}]/[{}]\n Left Gas: [{}]\n",
|
||||
result.getGasUsed(),
|
||||
invokeData.getGas().longValue(),
|
||||
getGas().longValue());
|
||||
|
||||
*/
|
||||
StringBuilder globalOutput = new StringBuilder("\n");
|
||||
if (stackData.length() > 0) stackData.append("\n");
|
||||
|
||||
|
@ -826,7 +828,7 @@ public class Program {
|
|||
|
||||
public void saveProgramTraceToFile(String fileName) {
|
||||
|
||||
if (!CONFIG.vmTrace() || isEmpty(CONFIG.vmTraceDir())) return;
|
||||
if (!CONFIG.vmTrace() || hasLength(CONFIG.vmTraceDir())) return;
|
||||
|
||||
String dir = CONFIG.databaseDir() + "/" + CONFIG.vmTraceDir() + "/";
|
||||
|
||||
|
@ -840,7 +842,7 @@ public class Program {
|
|||
|
||||
fw = new FileWriter(dumpFile.getAbsoluteFile());
|
||||
bw = new BufferedWriter(fw);
|
||||
bw.write(programTrace.asJsonString());
|
||||
bw.write(programTrace.asJsonString(true));
|
||||
} catch (IOException e) {
|
||||
logger.error(e.getMessage(), e);
|
||||
} finally {
|
||||
|
@ -876,12 +878,13 @@ public class Program {
|
|||
if (code == null || code.length == 0)
|
||||
return result;
|
||||
|
||||
OpCode op = OpCode.code(code[index]);
|
||||
final byte opCode = code[index];
|
||||
OpCode op = OpCode.code(opCode);
|
||||
if (op == null) {
|
||||
throw Program.Exception.invalidOpCode(opCode);
|
||||
}
|
||||
|
||||
final byte[] continuedCode;
|
||||
|
||||
if (op == null) throw new IllegalOperationException("Invalid operation: " +
|
||||
Hex.toHexString(code, index, 1));
|
||||
|
||||
switch(op) {
|
||||
case PUSH1: case PUSH2: case PUSH3: case PUSH4: case PUSH5: case PUSH6: case PUSH7: case PUSH8:
|
||||
case PUSH9: case PUSH10: case PUSH11: case PUSH12: case PUSH13: case PUSH14: case PUSH15: case PUSH16:
|
||||
|
@ -909,7 +912,9 @@ public class Program {
|
|||
}
|
||||
|
||||
public void validateJumpDest(int nextPC) {
|
||||
if (!jumpdest.contains(nextPC)) throw new BadJumpDestinationException();
|
||||
if (!jumpdest.contains(nextPC)) {
|
||||
throw Program.Exception.badJumpDestination(nextPC);
|
||||
}
|
||||
}
|
||||
|
||||
public void callToPrecompiledAddress(MessageCall msg, PrecompiledContract contract) {
|
||||
|
@ -951,27 +956,68 @@ public class Program {
|
|||
}
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public class OutOfGasException extends RuntimeException {
|
||||
public static class OutOfGasException extends RuntimeException {
|
||||
|
||||
public OutOfGasException(String message, Object... args) {
|
||||
super(format(message, args));
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public static class IllegalOperationException extends RuntimeException {
|
||||
public IllegalOperationException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public IllegalOperationException() {
|
||||
public IllegalOperationException(String message, Object... args) {
|
||||
super(format(message, args));
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public class BadJumpDestinationException extends RuntimeException {
|
||||
public static class BadJumpDestinationException extends RuntimeException {
|
||||
|
||||
public BadJumpDestinationException(String message, Object... args) {
|
||||
super(format(message, args));
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public class StackTooSmallException extends RuntimeException {
|
||||
public StackTooSmallException(String message) {
|
||||
super(message);
|
||||
public static class StackTooSmallException extends RuntimeException {
|
||||
|
||||
public StackTooSmallException(String message, Object... args) {
|
||||
super(format(message, args));
|
||||
}
|
||||
}
|
||||
|
||||
public static class Exception {
|
||||
|
||||
public static OutOfGasException notEnoughOpGas(OpCode op, long opGas, long programGas) {
|
||||
return new OutOfGasException("Not enough gas for '%s' operation executing: opGas[%d], programGas[%d];", op, opGas, programGas);
|
||||
}
|
||||
public static OutOfGasException notEnoughOpGas(OpCode op, DataWord opGas, DataWord programGas) {
|
||||
return notEnoughOpGas(op, opGas.longValue(), programGas.longValue());
|
||||
}
|
||||
public static OutOfGasException notEnoughOpGas(OpCode op, BigInteger opGas, BigInteger programGas) {
|
||||
return notEnoughOpGas(op, opGas.longValue(), programGas.longValue());
|
||||
}
|
||||
|
||||
public static OutOfGasException notEnoughSpendingGas(String cause, long gasValue, Program program) {
|
||||
return new OutOfGasException("Not enough gas for '%s' cause spending: invokeGas[%d], gas[%d], usedGas[%d];",
|
||||
cause, program.invokeData.getGas().longValue(), gasValue, program.result.getGasUsed());
|
||||
}
|
||||
|
||||
public static OutOfGasException gasOverflow(BigInteger actualGas, BigInteger gasLimit) {
|
||||
return new OutOfGasException("Gas value overflow: actualGas[%d], gasLimit[%d];", actualGas.longValue(), gasLimit.longValue());
|
||||
}
|
||||
|
||||
public static IllegalOperationException invalidOpCode(byte... opCode) {
|
||||
return new IllegalOperationException("Invalid operation code: opCode[%s];", Hex.toHexString(opCode, 0, 1));
|
||||
}
|
||||
|
||||
public static BadJumpDestinationException badJumpDestination(int pc) {
|
||||
return new BadJumpDestinationException("Operation with pc isn't 'JUMPDEST': PC[%d];", pc);
|
||||
}
|
||||
|
||||
public static StackTooSmallException tooSmallStack(int expectedSize, int actualSize) {
|
||||
return new StackTooSmallException("Expected stack size %d but actual %d;", expectedSize, actualSize);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@ import org.slf4j.LoggerFactory;
|
|||
import org.spongycastle.util.encoders.Hex;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
//import org.springframework.stereotype.Component;
|
||||
|
||||
import java.math.BigInteger;
|
||||
|
||||
|
@ -21,7 +21,7 @@ import java.math.BigInteger;
|
|||
* @author Roman Mandeleil
|
||||
* @since 08.06.2014
|
||||
*/
|
||||
@Component("ProgramInvokeFactory")
|
||||
//@Component("ProgramInvokeFactory")
|
||||
public class ProgramInvokeFactoryImpl implements ProgramInvokeFactory {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger("VM");
|
||||
|
@ -84,7 +84,7 @@ public class ProgramInvokeFactoryImpl implements ProgramInvokeFactory {
|
|||
|
||||
/*** GASLIMIT op ***/
|
||||
long gaslimit = block.getGasLimit();
|
||||
|
||||
/*
|
||||
if (logger.isInfoEnabled()) {
|
||||
logger.info("Top level call: \n" +
|
||||
"address={}\n" +
|
||||
|
@ -117,7 +117,7 @@ public class ProgramInvokeFactoryImpl implements ProgramInvokeFactory {
|
|||
Hex.toHexString(difficulty),
|
||||
gaslimit);
|
||||
}
|
||||
|
||||
*/
|
||||
return new ProgramInvokeImpl(address, origin, caller, balance, gasPrice, gas, callValue, data,
|
||||
lastHash, coinbase, timestamp, number, difficulty, gaslimit,
|
||||
repository, blockStore);
|
||||
|
@ -148,7 +148,7 @@ public class ProgramInvokeFactoryImpl implements ProgramInvokeFactory {
|
|||
DataWord number = program.getNumber();
|
||||
DataWord difficulty = program.getDifficulty();
|
||||
DataWord gasLimit = program.getGaslimit();
|
||||
|
||||
/*
|
||||
if (logger.isInfoEnabled()) {
|
||||
logger.info("Internal call: \n" +
|
||||
"address={}\n" +
|
||||
|
@ -180,7 +180,7 @@ public class ProgramInvokeFactoryImpl implements ProgramInvokeFactory {
|
|||
Hex.toHexString(difficulty.getNoLeadZeroesData()),
|
||||
gasLimit.longValue());
|
||||
}
|
||||
|
||||
*/
|
||||
return new ProgramInvokeImpl(address, origin, caller, balance, gasPrice, gas, callValue,
|
||||
data, lastHash, coinbase, timestamp, number, difficulty, gasLimit,
|
||||
repository, program.invokeData.getCallDeep() + 1, blockStore, byTestingSuite);
|
||||
|
|
|
@ -4,16 +4,12 @@ import org.ethereum.crypto.HashUtil;
|
|||
import org.ethereum.db.ContractDetails;
|
||||
import org.ethereum.util.ByteUtil;
|
||||
import org.ethereum.vm.MessageCall.MsgType;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import org.spongycastle.util.encoders.Hex;
|
||||
|
||||
import java.math.BigInteger;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
@ -79,8 +75,9 @@ public class VM {
|
|||
|
||||
try {
|
||||
OpCode op = OpCode.code(program.getCurrentOp());
|
||||
if (op == null)
|
||||
throw new Program.IllegalOperationException();
|
||||
if (op == null) {
|
||||
throw Program.Exception.invalidOpCode(program.getCurrentOp());
|
||||
}
|
||||
|
||||
program.setLastOp(op.val());
|
||||
program.stackRequire(op.require());
|
||||
|
@ -161,7 +158,7 @@ public class VM {
|
|||
gasCost = GasCost.CALL;
|
||||
DataWord callGasWord = stack.get(stack.size() - 1);
|
||||
if (callGasWord.compareTo(program.getGas()) == 1) {
|
||||
throw program.new OutOfGasException();
|
||||
throw Program.Exception.notEnoughOpGas(op, callGasWord, program.getGas());
|
||||
}
|
||||
callGas = callGasWord.longValue();
|
||||
BigInteger in = memNeeded(stack.get(stack.size() - 4), stack.get(stack.size() - 5)); // in offset+size
|
||||
|
@ -184,7 +181,7 @@ public class VM {
|
|||
BigInteger dataSize = stack.get(stack.size() - 2).value();
|
||||
BigInteger dataCost = dataSize.multiply(BigInteger.valueOf(GasCost.LOG_DATA_GAS));
|
||||
if (program.getGas().value().compareTo(dataCost) < 0) {
|
||||
throw program.new OutOfGasException();
|
||||
throw Program.Exception.notEnoughOpGas(op, dataCost, program.getGas().value());
|
||||
}
|
||||
|
||||
gasCost = GasCost.LOG_GAS +
|
||||
|
@ -203,8 +200,9 @@ public class VM {
|
|||
program.spendGas(gasCost, op.name());
|
||||
|
||||
// Avoid overflows
|
||||
if (newMemSize.compareTo(MAX_GAS) == 1)
|
||||
throw program.new OutOfGasException();
|
||||
if (newMemSize.compareTo(MAX_GAS) == 1) {
|
||||
throw Program.Exception.gasOverflow(newMemSize, MAX_GAS);
|
||||
}
|
||||
|
||||
// memory gas calc
|
||||
long memoryUsage = (newMemSize.longValue() + 31) / 32 * 32;
|
||||
|
@ -1008,13 +1006,13 @@ public class VM {
|
|||
DataWord value = program.stackPop();
|
||||
DataWord inOffset = program.stackPop();
|
||||
DataWord inSize = program.stackPop();
|
||||
|
||||
/*
|
||||
if (logger.isInfoEnabled())
|
||||
logger.info(logString, program.getPC(),
|
||||
String.format("%-12s", op.name()),
|
||||
program.getGas().value(),
|
||||
program.invokeData.getCallDeep(), hint);
|
||||
|
||||
*/
|
||||
program.createContract(value, inOffset, inSize);
|
||||
|
||||
program.step();
|
||||
|
@ -1031,7 +1029,7 @@ public class VM {
|
|||
|
||||
DataWord outDataOffs = program.stackPop();
|
||||
DataWord outDataSize = program.stackPop();
|
||||
|
||||
/*
|
||||
if (logger.isInfoEnabled()) {
|
||||
hint = "addr: " + Hex.toHexString(codeAddress.getLast20Bytes())
|
||||
+ " gas: " + gas.shortHex()
|
||||
|
@ -1042,7 +1040,7 @@ public class VM {
|
|||
program.getGas().value(),
|
||||
program.invokeData.getCallDeep(), hint);
|
||||
}
|
||||
|
||||
*/
|
||||
program.memoryExpand(outDataOffs, outDataSize);
|
||||
|
||||
MessageCall msg = new MessageCall(
|
||||
|
@ -1092,13 +1090,13 @@ public class VM {
|
|||
}
|
||||
|
||||
program.setPreviouslyExecutedOp(op.val());
|
||||
|
||||
/*
|
||||
if (logger.isInfoEnabled() && !op.equals(CALL)
|
||||
&& !op.equals(CREATE))
|
||||
logger.info(logString, stepBefore, String.format("%-12s",
|
||||
op.name()), program.getGas().longValue(),
|
||||
program.invokeData.getCallDeep(), hint);
|
||||
|
||||
*/
|
||||
vmCounter++;
|
||||
} catch (RuntimeException e) {
|
||||
logger.warn("VM halted: [{}]", e.toString());
|
||||
|
@ -1183,7 +1181,7 @@ public class VM {
|
|||
String opString = Hex.toHexString(new byte[]{op.val()});
|
||||
String gasString = Hex.toHexString(program.getGas().getNoLeadZeroesData());
|
||||
|
||||
dumpLogger.trace("{} {} {} {}", addressString, pcString, opString, gasString);
|
||||
//dumpLogger.trace("{} {} {} {}", addressString, pcString, opString, gasString);
|
||||
} else if (CONFIG.dumpStyle().equals("pretty")) {
|
||||
dumpLogger.trace(" STACK");
|
||||
for (DataWord item : program.getStack()) {
|
||||
|
@ -1209,9 +1207,9 @@ public class VM {
|
|||
int level = program.invokeData.getCallDeep();
|
||||
String contract = Hex.toHexString(program.getOwnerAddress().getLast20Bytes());
|
||||
String internalSteps = String.format("%4s", Integer.toHexString(program.getPC())).replace(' ', '0').toUpperCase();
|
||||
dumpLogger.trace("{} | {} | #{} | {} : {} | {} | -{} | {}x32",
|
||||
level, contract, vmCounter, internalSteps, op,
|
||||
gasBefore, gasCost, memWords);
|
||||
//dumpLogger.trace("{} | {} | #{} | {} : {} | {} | -{} | {}x32",
|
||||
// level, contract, vmCounter, internalSteps, op,
|
||||
// gasBefore, gasCost, memWords);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,8 +19,8 @@ public class ProgramTrace {
|
|||
@JsonIgnore
|
||||
private byte[] txHash;
|
||||
private List<Op> ops = new ArrayList<>();
|
||||
private String result;
|
||||
private String error;
|
||||
private String result = "";
|
||||
private String error = "";
|
||||
|
||||
public void setTxHash(byte[] txHash) {
|
||||
this.txHash = txHash;
|
||||
|
@ -31,7 +31,7 @@ public class ProgramTrace {
|
|||
}
|
||||
|
||||
public void setError(Exception error) {
|
||||
this.error = (error == null) ? "" : format("%s: %s", error.getClass(), error.getMessage());
|
||||
this.error = (error == null) ? "" : format("%s: %s", error.getClass().getSimpleName(), error.getMessage());
|
||||
}
|
||||
|
||||
public void addOp(Op op) {
|
||||
|
@ -46,7 +46,11 @@ public class ProgramTrace {
|
|||
this.ops.addAll(programTrace.ops);
|
||||
}
|
||||
|
||||
public String asJsonString(boolean needPrettify) {
|
||||
return serializeFieldsOnly(this, needPrettify);
|
||||
}
|
||||
|
||||
public String asJsonString() {
|
||||
return serializeFieldsOnly(this, true);
|
||||
return asJsonString(false);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package org.ethereum.wallet;
|
||||
|
||||
import javax.xml.bind.DatatypeConverter;
|
||||
//import javax.xml.bind.DatatypeConverter;
|
||||
|
||||
public class EtherSaleWallet {
|
||||
|
||||
|
@ -14,7 +14,7 @@ public class EtherSaleWallet {
|
|||
}
|
||||
|
||||
public byte[] getEncseedBytes() {
|
||||
return DatatypeConverter.parseHexBinary(encseed);
|
||||
return hexStringToByteArray(encseed);
|
||||
}
|
||||
|
||||
public void setEncseed(String encseed) {
|
||||
|
@ -26,7 +26,7 @@ public class EtherSaleWallet {
|
|||
}
|
||||
|
||||
public byte[] getEthaddrBytes() {
|
||||
return DatatypeConverter.parseHexBinary(ethaddr);
|
||||
return hexStringToByteArray(ethaddr);
|
||||
}
|
||||
|
||||
public void setEthaddr(String ethaddr) {
|
||||
|
@ -58,4 +58,14 @@ public class EtherSaleWallet {
|
|||
", btcaddr='" + btcaddr + '\'' +
|
||||
'}';
|
||||
}
|
||||
|
||||
public static byte[] hexStringToByteArray(String s) {
|
||||
int len = s.length();
|
||||
byte[] data = new byte[len / 2];
|
||||
for (int i = 0; i < len; i += 2) {
|
||||
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
|
||||
+ Character.digit(s.charAt(i+1), 16));
|
||||
}
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
<resources>
|
||||
<string name="app_name">ethereum-core</string>
|
||||
</resources>
|
|
@ -0,0 +1,134 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:context="http://www.springframework.org/schema/context"
|
||||
xmlns:p="http://www.springframework.org/schema/p"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xmlns:util="http://www.springframework.org/schema/util"
|
||||
xsi:schemaLocation="
|
||||
http://www.springframework.org/schema/beans
|
||||
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
|
||||
http://www.springframework.org/schema/util
|
||||
http://www.springframework.org/schema/util/spring-util.xsd
|
||||
http://www.springframework.org/schema/aop
|
||||
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
|
||||
http://www.springframework.org/schema/context
|
||||
http://www.springframework.org/schema/context/spring-context-3.1.xsd">
|
||||
|
||||
|
||||
<context:annotation-config />
|
||||
|
||||
<bean id="adminInfo" class="org.ethereum.manager.AdminInfo" init-method="init">
|
||||
</bean>
|
||||
|
||||
<bean id="detailsDS" class="org.ethereum.datasource.LevelDbDataSource">
|
||||
<property name="context" ref="androidContext" />
|
||||
</bean>
|
||||
|
||||
<bean id="stateDS" class="org.ethereum.datasource.LevelDbDataSource">
|
||||
<property name="context" ref="androidContext" />
|
||||
</bean>
|
||||
|
||||
<bean id="repository" class="org.ethereum.db.RepositoryImpl">
|
||||
<constructor-arg>
|
||||
<ref bean="detailsDS" />
|
||||
</constructor-arg>
|
||||
<constructor-arg>
|
||||
<ref bean="stateDS" />
|
||||
</constructor-arg>
|
||||
</bean>
|
||||
|
||||
<bean id="wallet" class="org.ethereum.core.Wallet" depends-on="worldManager">
|
||||
</bean>
|
||||
|
||||
<bean id="PeerClient" class="org.ethereum.net.client.PeerClient" scope="prototype">
|
||||
</bean>
|
||||
|
||||
<bean id="peerDiscovery" class="org.ethereum.net.peerdiscovery.PeerDiscovery">
|
||||
</bean>
|
||||
|
||||
<bean id="channelManager" class="org.ethereum.net.server.ChannelManager" init-method="init">
|
||||
</bean>
|
||||
|
||||
<bean id="cliInterface" class="org.ethereum.cli.CLIInterface">
|
||||
</bean>
|
||||
|
||||
<bean id="account" class="org.ethereum.core.Account" scope="prototype">
|
||||
</bean>
|
||||
|
||||
<bean id="blockchain" class="org.ethereum.core.BlockchainImpl">
|
||||
<constructor-arg>
|
||||
<set value-type="org.ethereum.core.Transaction">
|
||||
</set>
|
||||
</constructor-arg>
|
||||
</bean>
|
||||
|
||||
<bean id="redisConnectionImpl" class="org.ethereum.datasource.redis.RedisConnectionImpl" init-method="tryConnect" destroy-method="destroy">
|
||||
</bean>
|
||||
|
||||
<bean id="worldManager" class="org.ethereum.manager.WorldManager" init-method="init" destroy-method="close">
|
||||
</bean>
|
||||
|
||||
<bean id="ethereumImpl" class="org.ethereum.facade.EthereumImpl" init-method="init">
|
||||
</bean>
|
||||
|
||||
<bean id="blockQueue" class="org.ethereum.net.BlockQueue">
|
||||
</bean>
|
||||
|
||||
<bean id="messageQueue" class="org.ethereum.net.MessageQueue" scope="prototype">
|
||||
</bean>
|
||||
|
||||
<bean id="ethHandler" class="org.ethereum.net.eth.EthHandler" scope="prototype">
|
||||
</bean>
|
||||
|
||||
<bean id="p2pHandler" class="org.ethereum.net.p2p.P2pHandler" scope="prototype">
|
||||
</bean>
|
||||
|
||||
<bean id="discoveryChannel" class="org.ethereum.net.peerdiscovery.DiscoveryChannel" scope="prototype">
|
||||
</bean>
|
||||
|
||||
<bean id="workerThread" class="org.ethereum.net.peerdiscovery.WorkerThread" scope="prototype">
|
||||
</bean>
|
||||
|
||||
<bean id="channel" class="org.ethereum.net.server.Channel" scope="prototype">
|
||||
</bean>
|
||||
|
||||
<bean id="ethereumChannelInitializer" class="org.ethereum.net.server.EthereumChannelInitializer">
|
||||
</bean>
|
||||
|
||||
<bean id="peerServer" class="org.ethereum.net.server.PeerServer">
|
||||
</bean>
|
||||
|
||||
<bean id="shhHandler" class="org.ethereum.net.shh.ShhHandler" scope="prototype">
|
||||
</bean>
|
||||
|
||||
<bean id="messageDecoder" class="org.ethereum.net.wire.MessageDecoder" scope="prototype">
|
||||
</bean>
|
||||
|
||||
<bean id="messageEncoder" class="org.ethereum.net.wire.MessageEncoder" scope="prototype">
|
||||
</bean>
|
||||
|
||||
<bean id="programInvokeFactory" class="org.ethereum.vm.ProgramInvokeFactoryImpl">
|
||||
</bean>
|
||||
|
||||
<bean id="listener" class="org.ethereum.listener.CompositeEthereumListener">
|
||||
</bean>
|
||||
|
||||
|
||||
|
||||
<bean id="blockStore" class="org.ethereum.db.InMemoryBlockStore">
|
||||
</bean>
|
||||
|
||||
<bean id="dataSource" class="org.robospring.ormlite.ios.IosJdbcSqliteDatabaseType">
|
||||
<!--
|
||||
<property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
|
||||
<property name="url" value="jdbc:hsqldb:file:./${database.dir}/blockchain/blockchain.db;create=${database.reset};hsqldb.default_table_type=cached"/>
|
||||
<property name="username" value="sa"/>
|
||||
-->
|
||||
</bean>
|
||||
|
||||
|
||||
|
||||
<!-- define your beans here, use 'androidContext' to get a reference to your app's application context -->
|
||||
|
||||
</beans>
|
|
@ -1 +1 @@
|
|||
include ':app', ':ethereum-core'
|
||||
include ':app', ':ethereumj-core'
|
||||
|
|
Loading…
Reference in New Issue