Skip to content

Commit 46929e2

Browse files
committed
primenumber revamp working
1 parent 5230f7f commit 46929e2

File tree

21 files changed

+273
-165
lines changed

21 files changed

+273
-165
lines changed

Features/oracle-primenumber/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ This repo is split into three CorDapps:
1919
1. A [base CorDapp](./base/src/main/java/net/corda/examples/oracle/base/flow) which includes the state and contract definition, as well as some utility flows that need to be
2020
shared by both the Oracle service and the client
2121
2. A client CorDapp which [implements a flow](./client/src/main/java/net/corda/examples/oracle/client/flow/CreatePrime.java#L65-L107) to create numbers involving oracle-validated prime numbers
22-
3. A [service](./service/src/main/java/net/corda/examples/oracle/service/service/Oracle.java#L55-L63) which implements the primes oracle
22+
3. A [service](services/src/main/java/net/corda/examples/oracle/service/service/Oracle.java#L55-L63) which implements the primes oracle
2323

2424

2525
## Usage
@@ -47,5 +47,5 @@ Go to the [CRaSH](https://docs.corda.net/docs/corda-os/shell.html) shell for Par
4747

4848
We can then see the state wrapping the 5th prime (11) in our vault by running:
4949

50-
run vaultQuery contractStateType: net.corda.examples.oracle.base.contract.PrimeState
50+
run vaultQuery contractStateType: net.corda.examples.oracle.base.states.PrimeState
5151

Features/oracle-primenumber/build.gradle

Lines changed: 50 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,16 @@ buildscript {
44

55
ext {
66
corda_release_group = constants.getProperty("cordaReleaseGroup")
7+
corda_core_release_group = constants.getProperty("cordaCoreReleaseGroup")
78
corda_release_version = constants.getProperty("cordaVersion")
8-
corda_core_release_group = constants.getProperty("cordaCoreReleaseGroup")
99
corda_core_release_version = constants.getProperty("cordaCoreVersion")
1010
corda_gradle_plugins_version = constants.getProperty("gradlePluginsVersion")
11+
kotlin_version = constants.getProperty("kotlinVersion")
1112
junit_version = constants.getProperty("junitVersion")
1213
quasar_version = constants.getProperty("quasarVersion")
1314
log4j_version = constants.getProperty("log4jVersion")
1415
slf4j_version = constants.getProperty("slf4jVersion")
15-
corda_platform_version = constants.getProperty("platformVersion")
16+
corda_platform_version = constants.getProperty("platformVersion").toInteger()
1617
}
1718

1819
repositories {
@@ -33,82 +34,109 @@ allprojects {
3334
apply from: "${rootProject.projectDir}/repositories.gradle"
3435
apply plugin: 'java'
3536

36-
tasks.withType(JavaCompile) {
37-
options.compilerArgs << "-parameters" // Required for shell commands.
37+
repositories {
38+
mavenLocal()
39+
jcenter()
40+
mavenCentral()
41+
maven { url 'https://software.r3.com/artifactory/corda' }
42+
maven { url 'https://jitpack.io' }
3843
}
3944

45+
tasks.withType(JavaCompile) {
46+
options.compilerArgs << "-parameters" // Required by Corda's serialisation framework.
47+
}
4048

49+
jar {
50+
// This makes the JAR's SHA-256 hash repeatable.
51+
preserveFileTimestamps = false
52+
reproducibleFileOrder = true
53+
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
54+
}
4155
}
4256

4357
apply plugin: 'net.corda.plugins.quasar-utils'
4458
apply plugin: 'net.corda.plugins.cordapp'
4559
apply plugin: 'net.corda.plugins.cordformation'
4660

61+
sourceSets {
62+
main {
63+
resources {
64+
srcDir rootProject.file("config/dev")
65+
}
66+
}
67+
}
68+
4769
cordapp {
4870
targetPlatformVersion corda_platform_version.toInteger()
4971
minimumPlatformVersion corda_platform_version.toInteger()
5072
info {
51-
name "Oracle Example"
73+
name "Oracle Primenumber"
5274
vendor "Corda Open Source"
5375
}
5476
}
5577

5678
dependencies {
57-
testCompile "junit:junit:$junit_version"
58-
5979
// Corda dependencies.
80+
cordaRuntime "$corda_release_group:corda:$corda_release_version"
6081
cordaCompile "$corda_core_release_group:corda-core:$corda_core_release_version"
82+
cordaCompile "$corda_release_group:corda-node-api:$corda_release_version"
6183
cordaCompile "$corda_release_group:corda-jackson:$corda_release_version"
6284
cordaCompile "$corda_release_group:corda-rpc:$corda_release_version"
63-
cordaCompile "$corda_release_group:corda-node-api:$corda_release_version"
64-
cordaRuntime "$corda_release_group:corda:$corda_release_version"
6585

66-
testCompile "$corda_release_group:corda-node-driver:$corda_release_version"
86+
// CorDapp dependencies.
87+
cordapp project(":workflows")
88+
cordapp project(":contracts")
89+
6790
cordaRuntime "org.apache.logging.log4j:log4j-slf4j-impl:$log4j_version"
91+
cordaCompile "org.apache.logging.log4j:log4j-slf4j-impl:${log4j_version}"
92+
cordaCompile "org.apache.logging.log4j:log4j-web:${log4j_version}"
93+
cordaCompile "org.slf4j:jul-to-slf4j:$slf4j_version"
6894

69-
// CorDapp dependencies.
70-
cordapp project(":base")
71-
cordapp project(":client")
72-
cordapp project(":service")
95+
testCompile "junit:junit:$junit_version"
96+
testCompile "$corda_release_group:corda-node-driver:$corda_release_version"
7397
}
7498

7599
task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) {
100+
76101
nodeDefaults {
77102
projectCordapp {
78103
deploy = false
79104
}
80-
runSchemaMigration = true
105+
runSchemaMigration = true
81106
}
107+
82108
node {
83109
name "O=Notary,L=London,C=GB"
84-
notary = [validating : false]
110+
notary = [validating: false]
85111
p2pPort 10002
86112
rpcSettings {
87113
address("localhost:10003")
88114
adminAddress("localhost:10043")
89115
}
90116
cordapps = []
91117
}
118+
92119
node {
93120
name "O=PartyA,L=London,C=GB"
94121
p2pPort 10005
95122
rpcSettings {
96123
address("localhost:10006")
97124
adminAddress("localhost:10046")
98125
}
99-
cordapp project(':base')
100-
cordapp project(':client')
101-
rpcUsers = [[ user: "user1", "password": "test", "permissions": ["ALL"]]]
126+
cordapp project(":contracts")
127+
cordapp project(":workflows")
128+
rpcUsers = [[user: "user1", "password": "test", "permissions": ["ALL"]]]
102129
}
130+
103131
node {
104132
name "O=Oracle,L=New York,C=US"
105133
p2pPort 10008
106134
rpcSettings {
107135
address("localhost:10009")
108136
adminAddress("localhost:10049")
109137
}
110-
cordapp project(':base')
111-
cordapp project(':service')
112-
rpcUsers = [[ user: "user1", "password": "test", "permissions": ["ALL"]]]
138+
cordapp project(":contracts")
139+
cordapp project(":workflows")
140+
rpcUsers = [[user: "user1", "password": "test", "permissions": ["ALL"]]]
113141
}
114142
}

Features/oracle-primenumber/base/build.gradle renamed to Features/oracle-primenumber/contracts/build.gradle

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,32 @@ apply plugin: 'net.corda.plugins.quasar-utils'
44
cordapp {
55
targetPlatformVersion corda_platform_version.toInteger()
66
minimumPlatformVersion corda_platform_version.toInteger()
7+
78
contract {
8-
name "Oracle Example"
9+
name "Oracle Primenumber"
910
vendor "Corda Open Source"
1011
licence "Apache License, Version 2.0"
1112
versionId 1
1213
}
13-
workflow {
14-
name "Oracle Example"
15-
vendor "Corda Open Source"
16-
licence "Apache License, Version 2.0"
17-
versionId 1
14+
}
15+
16+
sourceSets {
17+
main {
18+
java {
19+
srcDir 'src/main/java'
20+
java.outputDir = file('bin/main')
21+
}
22+
}
23+
24+
test {
25+
java {
26+
srcDir 'src/test/java'
27+
java.outputDir = file('bin/test')
28+
}
1829
}
1930
}
2031

32+
2133
dependencies {
2234
testCompile "junit:junit:$junit_version"
2335

Features/oracle-primenumber/base/src/main/java/net/corda/examples/oracle/base/contract/PrimeContract.java renamed to Features/oracle-primenumber/contracts/src/main/java/net/corda/samples/oracle/contracts/PrimeContract.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,28 @@
1-
package net.corda.examples.oracle.base.contract;
1+
package net.corda.samples.oracle.contracts;
22

33
import net.corda.core.contracts.CommandData;
44
import net.corda.core.contracts.Contract;
55
import net.corda.core.transactions.LedgerTransaction;
6+
import net.corda.samples.oracle.states.PrimeState;
67
import org.jetbrains.annotations.NotNull;
78

89
import static net.corda.core.contracts.ContractsDSL.requireSingleCommand;
910
import static net.corda.core.contracts.ContractsDSL.requireThat;
1011

1112
public class PrimeContract implements Contract {
12-
public final static String PRIME_PROGRAM_ID = "net.corda.examples.oracle.base.contract.PrimeContract";
13+
public final static String PRIME_PROGRAM_ID = "net.corda.samples.oracle.contracts.PrimeContract";
1314

14-
// Our contract does not check that the Nth prime is correct. Instead, it checks that the
15+
// Our contracts does not check that the Nth prime is correct. Instead, it checks that the
1516
// information in the command and state match.
1617
@Override
1718
public void verify(@NotNull LedgerTransaction tx) throws IllegalArgumentException {
1819
Commands.Create command = requireSingleCommand(tx.getCommands(), Commands.Create.class).getValue();
1920
requireThat(req -> {
20-
req.using("There are must be no inputs", tx.getInputs().isEmpty());
21-
PrimeState output = tx.outputsOfType(PrimeState.class).get(0);
22-
req.using("The prime in the output does not match the prime in the command.",
23-
(command.getN().equals(output.getN()) && command.getNthPrime().equals(output.getNthPrime())));
24-
return null;
21+
req.using("There are must be no inputs", tx.getInputs().isEmpty());
22+
PrimeState output = tx.outputsOfType(PrimeState.class).get(0);
23+
req.using("The prime in the output does not match the prime in the command.",
24+
(command.getN().equals(output.getN()) && command.getNthPrime().equals(output.getNthPrime())));
25+
return null;
2526
});
2627
}
2728

Features/oracle-primenumber/base/src/main/java/net/corda/examples/oracle/base/contract/PrimeState.java renamed to Features/oracle-primenumber/contracts/src/main/java/net/corda/samples/oracle/states/PrimeState.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
package net.corda.examples.oracle.base.contract;
1+
package net.corda.samples.oracle.states;
22

33
import com.google.common.collect.ImmutableList;
44
import net.corda.core.contracts.BelongsToContract;
55
import net.corda.core.contracts.ContractState;
66
import net.corda.core.identity.AbstractParty;
7+
import net.corda.samples.oracle.contracts.PrimeContract;
78
import org.jetbrains.annotations.NotNull;
89

910
import java.util.List;
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package net.corda.samples.oracle.contracts;
2+
3+
import net.corda.core.contracts.CommandData;
4+
import net.corda.core.contracts.Contract;
5+
import net.corda.core.contracts.TypeOnlyCommandData;
6+
import net.corda.core.identity.CordaX500Name;
7+
import net.corda.samples.oracle.states.PrimeState;
8+
import net.corda.testing.core.DummyCommandData;
9+
import net.corda.testing.core.TestIdentity;
10+
import net.corda.testing.node.MockServices;
11+
import org.junit.Test;
12+
13+
import java.util.Arrays;
14+
15+
import static net.corda.testing.node.NodeTestUtils.transaction;
16+
import static org.jgroups.util.Util.assertEquals;
17+
18+
public class PrimeContractTests {
19+
20+
// A pre-defined dummy command.
21+
public interface Commands extends CommandData {
22+
class DummyCommand extends TypeOnlyCommandData implements Commands {
23+
}
24+
}
25+
26+
private MockServices ledgerServices = new MockServices(
27+
Arrays.asList("net.corda.samples.oracle.contracts")
28+
);
29+
30+
private TestIdentity a = new TestIdentity(new CordaX500Name("Alice", "", "GB"));
31+
private TestIdentity b = new TestIdentity(new CordaX500Name("Bob", "", "GB"));
32+
private PrimeState st = new PrimeState(1, 5, a.getParty());
33+
34+
@Test
35+
public void contractImplementsContract() {
36+
assert (new PrimeContract() instanceof Contract);
37+
}
38+
39+
@Test
40+
public void constructorTest() {
41+
42+
assertEquals(1, st.getN());
43+
assertEquals(5, st.getNthPrime());
44+
}
45+
46+
@Test
47+
public void contractRequiresOneCommandInTheTransaction() {
48+
transaction(ledgerServices, tx -> {
49+
tx.output(PrimeContract.PRIME_PROGRAM_ID, st);
50+
// Has two commands, will fail.
51+
tx.command(Arrays.asList(a.getPublicKey()), new PrimeContract.Commands.Create(1, 5));
52+
tx.command(Arrays.asList(a.getPublicKey()), new PrimeContract.Commands.Create(1, 5));
53+
tx.fails();
54+
return null;
55+
});
56+
57+
transaction(ledgerServices, tx -> {
58+
tx.output(PrimeContract.PRIME_PROGRAM_ID, st);
59+
// Has one command, will verify.
60+
tx.command(Arrays.asList(a.getPublicKey()), new PrimeContract.Commands.Create(1, 5));
61+
tx.verifies();
62+
return null;
63+
});
64+
}
65+
66+
@Test
67+
public void contractRequiresTheTransactionsCommandToBeAnIssueCommand() {
68+
transaction(ledgerServices, tx -> {
69+
// Has wrong command type, will fail.
70+
tx.output(PrimeContract.PRIME_PROGRAM_ID, st);
71+
tx.command(Arrays.asList(a.getPublicKey()), DummyCommandData.INSTANCE);
72+
tx.fails();
73+
return null;
74+
});
75+
76+
transaction(ledgerServices, tx -> {
77+
// Has correct command type, will verify.
78+
tx.output(PrimeContract.PRIME_PROGRAM_ID, st);
79+
tx.command(Arrays.asList(a.getPublicKey()), new PrimeContract.Commands.Create(1, 5));
80+
tx.verifies();
81+
return null;
82+
});
83+
}
84+
85+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package net.corda.samples.oracle.states;
2+
3+
import net.corda.core.identity.CordaX500Name;
4+
import net.corda.testing.core.TestIdentity;
5+
import org.junit.Test;
6+
7+
import static org.jgroups.util.Util.assertTrue;
8+
import static org.junit.Assert.assertEquals;
9+
10+
public class PrimeStateTests {
11+
12+
TestIdentity a = new TestIdentity(new CordaX500Name("Alice", "", "GB"));
13+
14+
@Test
15+
public void constructorTest() {
16+
PrimeState st = new PrimeState(1, 5, a.getParty());
17+
18+
assertEquals(a.getParty(), st.getRequester());
19+
assertTrue(st.getParticipants().contains(a.getParty()));
20+
}
21+
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
name=Test
2-
group=net.corda.examples.oracle
1+
name=Oracle Primenumber
2+
group=com.oracle
33
version=1.0

Features/oracle-primenumber/gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
33
zipStoreBase=GRADLE_USER_HOME
44
zipStorePath=wrapper/dists
5-
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
5+
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip

0 commit comments

Comments
 (0)