use of com.icodici.universa.contract.services.SlotContract in project universa by UniversaBlockchain.
the class SlotContractTest method serializeSmartContract.
@Test
public void serializeSmartContract() throws Exception {
final PrivateKey key = new PrivateKey(Do.read(rootPath + "_xer0yfe2nn1xthc.private.unikey"));
Contract simpleContract = new Contract(key);
simpleContract.seal();
Contract paymentDecreased = createSlotPayment();
Contract smartContract = new SlotContract(key);
assertTrue(smartContract instanceof SlotContract);
((SlotContract) smartContract).putTrackingContract(simpleContract);
((SlotContract) smartContract).setNodeInfoProvider(nodeInfoProvider);
smartContract.addNewItems(paymentDecreased);
smartContract.seal();
smartContract.check();
smartContract.traceErrors();
assertTrue(smartContract.isOk());
Binder b = BossBiMapper.serialize(smartContract);
Contract desContract = DefaultBiMapper.deserialize(b);
assertSameContracts(smartContract, desContract);
assertEquals(NSmartContract.SmartContractType.SLOT1.name(), desContract.getDefinition().getExtendedType());
assertEquals(NSmartContract.SmartContractType.SLOT1.name(), desContract.get("definition.extended_type"));
assertTrue(desContract instanceof SlotContract);
Multimap<String, Permission> permissions = desContract.getPermissions();
Collection<Permission> mdp = permissions.get("modify_data");
assertNotNull(mdp);
assertTrue(((ModifyDataPermission) mdp.iterator().next()).getFields().containsKey("action"));
assertEquals(simpleContract.getId(), ((SlotContract) desContract).getTrackingContract().getId());
assertEquals(simpleContract.getId(), TransactionPack.unpack(((SlotContract) desContract).getPackedTrackingContract()).getContract().getId());
Binder trackingHashesAsBase64 = desContract.getStateData().getBinder("tracking_contract");
for (String k : trackingHashesAsBase64.keySet()) {
byte[] packed = trackingHashesAsBase64.getBinary(k);
if (packed != null) {
Contract c = Contract.fromPackedTransaction(packed);
assertEquals(simpleContract.getId(), c.getId());
}
}
Contract copiedContract = smartContract.copy();
assertSameContracts(smartContract, copiedContract);
assertEquals(NSmartContract.SmartContractType.SLOT1.name(), copiedContract.getDefinition().getExtendedType());
assertEquals(NSmartContract.SmartContractType.SLOT1.name(), copiedContract.get("definition.extended_type"));
assertTrue(copiedContract instanceof SlotContract);
permissions = copiedContract.getPermissions();
mdp = permissions.get("modify_data");
assertNotNull(mdp);
assertTrue(((ModifyDataPermission) mdp.iterator().next()).getFields().containsKey("action"));
assertEquals(simpleContract.getId(), ((SlotContract) copiedContract).getTrackingContract().getId());
assertEquals(simpleContract.getId(), TransactionPack.unpack(((SlotContract) copiedContract).getPackedTrackingContract()).getContract().getId());
trackingHashesAsBase64 = copiedContract.getStateData().getBinder("tracking_contract");
for (String k : trackingHashesAsBase64.keySet()) {
byte[] packed = trackingHashesAsBase64.getBinary(k);
if (packed != null) {
Contract c = Contract.fromPackedTransaction(packed);
assertEquals(simpleContract.getId(), c.getId());
}
}
}
use of com.icodici.universa.contract.services.SlotContract in project universa by UniversaBlockchain.
the class SlotContractTest method keepRevisions.
@Test
public void keepRevisions() throws Exception {
final PrivateKey key = new PrivateKey(Do.read(rootPath + "_xer0yfe2nn1xthc.private.unikey"));
Contract simpleContract = new Contract(key);
simpleContract.seal();
Contract paymentDecreased = createSlotPayment();
Contract smartContract = new SlotContract(key);
assertTrue(smartContract instanceof SlotContract);
((SlotContract) smartContract).putTrackingContract(simpleContract);
((SlotContract) smartContract).setNodeInfoProvider(nodeInfoProvider);
((SlotContract) smartContract).setKeepRevisions(2);
smartContract.addNewItems(paymentDecreased);
smartContract.seal();
smartContract.check();
smartContract.traceErrors();
assertTrue(smartContract.isOk());
assertEquals(1, ((SlotContract) smartContract).getTrackingContracts().size());
assertEquals(simpleContract.getId(), ((SlotContract) smartContract).getTrackingContract().getId());
assertEquals(simpleContract.getId(), TransactionPack.unpack(((SlotContract) smartContract).getPackedTrackingContract()).getContract().getId());
Binder trackingHashesAsBase64 = smartContract.getStateData().getBinder("tracking_contract");
for (String k : trackingHashesAsBase64.keySet()) {
byte[] packed = trackingHashesAsBase64.getBinary(k);
if (packed != null) {
Contract c = Contract.fromPackedTransaction(packed);
assertEquals(simpleContract.getId(), c.getId());
}
}
Contract simpleContract2 = simpleContract.createRevision(key);
simpleContract2.seal();
((SlotContract) smartContract).putTrackingContract(simpleContract2);
smartContract.seal();
smartContract.check();
smartContract.traceErrors();
assertTrue(smartContract.isOk());
assertEquals(2, ((SlotContract) smartContract).getTrackingContracts().size());
assertEquals(simpleContract2.getId(), ((SlotContract) smartContract).getTrackingContract().getId());
assertEquals(simpleContract2.getId(), TransactionPack.unpack(((SlotContract) smartContract).getPackedTrackingContract()).getContract().getId());
trackingHashesAsBase64 = smartContract.getStateData().getBinder("tracking_contract");
for (String k : trackingHashesAsBase64.keySet()) {
byte[] packed = trackingHashesAsBase64.getBinary(k);
if (packed != null) {
Contract c = Contract.fromPackedTransaction(packed);
assertThat(c.getId(), Matchers.anyOf(equalTo(simpleContract.getId()), equalTo(simpleContract2.getId())));
}
}
Contract simpleContract3 = simpleContract2.createRevision(key);
simpleContract3.seal();
((SlotContract) smartContract).putTrackingContract(simpleContract3);
smartContract.seal();
smartContract.check();
smartContract.traceErrors();
assertTrue(smartContract.isOk());
assertEquals(2, ((SlotContract) smartContract).getTrackingContracts().size());
assertEquals(simpleContract3.getId(), ((SlotContract) smartContract).getTrackingContract().getId());
assertEquals(simpleContract3.getId(), TransactionPack.unpack(((SlotContract) smartContract).getPackedTrackingContract()).getContract().getId());
trackingHashesAsBase64 = smartContract.getStateData().getBinder("tracking_contract");
for (String k : trackingHashesAsBase64.keySet()) {
byte[] packed = trackingHashesAsBase64.getBinary(k);
if (packed != null) {
Contract c = Contract.fromPackedTransaction(packed);
assertThat(c.getId(), Matchers.anyOf(equalTo(simpleContract.getId()), equalTo(simpleContract2.getId()), equalTo(simpleContract3.getId())));
}
}
}
use of com.icodici.universa.contract.services.SlotContract in project universa by UniversaBlockchain.
the class ScriptEngineTest method latestHttpContractFromSlot1.
@Test
public void latestHttpContractFromSlot1() throws Exception {
System.out.println("============= start nodes...");
TestSpace testSpace = prepareTestSpace(TestKeys.privateKey(0));
testSpace.nodes.forEach(m -> m.config.setIsFreeRegistrationsAllowedFromYaml(true));
System.out.println("============= start nodes done\n\n\n");
Contract contractServer = new Contract(TestKeys.privateKey(0));
String js = "";
js += "var jsApiEvents = new Object();";
js += "jsApiEvents.httpHandler_getVersion = function(request, response){" + " response.setBodyAsJson({" + " version: 1" + " });" + "};";
contractServer.getState().setJS(js.getBytes(), "client script.js", new JSApiScriptParameters(), true);
RoleLink issuerLink = new RoleLink("issuer_link", "issuer");
contractServer.registerRole(issuerLink);
Permission perm = new ModifyDataPermission(issuerLink, Binder.of("fields", Binder.of("scripts", null)));
contractServer.addPermission(perm);
contractServer.seal();
contractServer = Contract.fromPackedTransaction(contractServer.getPackedTransaction());
ItemResult itemResult = testSpace.client.register(contractServer.getPackedTransaction(), 5000);
assertEquals(ItemState.APPROVED, itemResult.state);
// put contractServer rev1 into slot1
SlotContract slotContract = ContractsService.createSlotContract(new HashSet<>(Arrays.asList(TestKeys.privateKey(0))), new HashSet<>(Arrays.asList(TestKeys.publicKey(0))), nodeInfoProvider);
slotContract.setNodeInfoProvider(nodeInfoProvider);
slotContract.putTrackingContract(contractServer);
Contract stepaU = InnerContractsService.createFreshU(100000000, new HashSet<>(Arrays.asList(TestKeys.publicKey(0))));
itemResult = testSpace.client.register(stepaU.getPackedTransaction(), 5000);
System.out.println("stepaU : " + itemResult);
assertEquals(ItemState.APPROVED, itemResult.state);
Parcel parcel = ContractsService.createPayingParcel(slotContract.getTransactionPack(), stepaU, 1, 100, new HashSet<>(Arrays.asList(TestKeys.privateKey(0))), false);
testSpace.client.registerParcelWithState(parcel.pack(), 5000);
itemResult = testSpace.client.getState(slotContract.getId());
System.out.println("slot : " + itemResult);
assertEquals(ItemState.APPROVED, itemResult.state);
// start http server
JSApiHttpServerRoutes routes = new JSApiHttpServerRoutes();
routes.setPortToListen(8880);
routes.addNewRoute("/contract1/getVersion", "httpHandler_getVersion", contractServer, "client script.js", null, slotContract.getId());
JSApiHttpServer httpServer = new JSApiHttpServer(routes, new JSApiExecOptions(), hashId -> {
try {
return testSpace.client.getState(hashId).state == ItemState.APPROVED;
} catch (ClientError e) {
e.printStackTrace();
return false;
}
}, (slotId, originId) -> {
try {
Binder slotInfo = testSpace.client.querySlotInfo(slotId);
return testSpace.client.queryContract(slotId, originId, null);
} catch (ClientError e) {
e.printStackTrace();
return null;
}
});
// here can be any http client. JSApiHttpClient used just for easiness
JSApiScriptParameters scriptParameters = new JSApiScriptParameters();
scriptParameters.domainMasks.add("localhost:*");
JSApiHttpClient httpClient = new JSApiHttpClient(scriptParameters);
// http access to contractServer rev1
List httpRes = httpClient.sendGetRequest("http://localhost:8880/contract1/getVersion", JSApiHttpClient.RESPTYPE_JSON);
System.out.println("httpRes: " + httpRes);
assertEquals(1l, ((HashMap) httpRes.get(1)).get("version"));
// create and register contractServer rev2
Contract contractServer2 = contractServer.createRevision();
contractServer2.addSignerKey(TestKeys.privateKey(0));
String js2 = "";
js2 += "var jsApiEvents = new Object();";
js2 += "jsApiEvents.httpHandler_getVersion = function(request, response){" + " response.setBodyAsJson({" + " version: 2" + " });" + "};";
contractServer2.getState().setJS(js2.getBytes(), "client script.js", new JSApiScriptParameters(), true);
contractServer2.seal();
contractServer2 = Contract.fromPackedTransaction(contractServer2.getPackedTransaction());
ItemResult itemResult2 = testSpace.client.register(contractServer2.getPackedTransaction(), 5000);
assertEquals(ItemState.APPROVED, itemResult2.state);
assertEquals(ItemState.REVOKED, testSpace.client.getState(contractServer.getId()).state);
// force update server contracts from slot1
httpServer.checkAllContracts();
// http access to contractServer rev2
httpRes = httpClient.sendGetRequest("http://localhost:8880/contract1/getVersion", JSApiHttpClient.RESPTYPE_JSON);
System.out.println("httpRes: " + httpRes);
assertEquals(2l, ((HashMap) httpRes.get(1)).get("version"));
System.out.println("\n\n\n============= shutdown...");
testSpace.nodes.forEach(m -> m.shutdown());
httpServer.stop();
}
use of com.icodici.universa.contract.services.SlotContract in project universa by UniversaBlockchain.
the class ScriptEngineTest method initHttpRoutesFromSlot1.
@Test
public void initHttpRoutesFromSlot1() throws Exception {
System.out.println("============= start nodes...");
TestSpace testSpace = prepareTestSpace(TestKeys.privateKey(0));
testSpace.nodes.forEach(m -> m.config.setIsFreeRegistrationsAllowedFromYaml(true));
System.out.println("============= start nodes done\n\n\n");
Contract contractServer = new Contract(TestKeys.privateKey(0));
String js = "";
js += "var jsApiEvents = new Object();";
js += "jsApiEvents.httpHandler_getVersion = function(request, response){" + " response.setBodyAsJson({" + " version: 1" + " });" + "};";
contractServer.getState().setJS(js.getBytes(), "client script.js", new JSApiScriptParameters(), true);
RoleLink issuerLink = new RoleLink("issuer_link", "issuer");
contractServer.registerRole(issuerLink);
Permission perm = new ModifyDataPermission(issuerLink, Binder.of("fields", Binder.of("scripts", null)));
contractServer.addPermission(perm);
contractServer.seal();
contractServer = Contract.fromPackedTransaction(contractServer.getPackedTransaction());
ItemResult itemResult = testSpace.client.register(contractServer.getPackedTransaction(), 5000);
assertEquals(ItemState.APPROVED, itemResult.state);
// put contractServer rev1 into slot1
SlotContract slotContract = ContractsService.createSlotContract(new HashSet<>(Arrays.asList(TestKeys.privateKey(0))), new HashSet<>(Arrays.asList(TestKeys.publicKey(0))), nodeInfoProvider);
slotContract.setNodeInfoProvider(nodeInfoProvider);
slotContract.putTrackingContract(contractServer);
Contract stepaU = InnerContractsService.createFreshU(100000000, new HashSet<>(Arrays.asList(TestKeys.publicKey(0))));
itemResult = testSpace.client.register(stepaU.getPackedTransaction(), 5000);
System.out.println("stepaU : " + itemResult);
assertEquals(ItemState.APPROVED, itemResult.state);
Parcel parcel = ContractsService.createPayingParcel(slotContract.getTransactionPack(), stepaU, 1, 100, new HashSet<>(Arrays.asList(TestKeys.privateKey(0))), false);
testSpace.client.registerParcelWithState(parcel.pack(), 5000);
itemResult = testSpace.client.getState(slotContract.getId());
System.out.println("slot : " + itemResult);
assertEquals(ItemState.APPROVED, itemResult.state);
JSApiHttpServer.ISlot1Requestor slot1Requestor = (slotId, originId) -> {
try {
Binder slotInfo = testSpace.client.querySlotInfo(slotId);
return testSpace.client.queryContract(slotId, originId, null);
} catch (ClientError e) {
e.printStackTrace();
return null;
}
};
// start http server
String routesJsonString = "{\n" + " \"listenPort\": \"8880\",\n" + " \"routes\": [\n" + " {\"endpoint\": \"/contract1/getVersion\", \"handlerName\": \"httpHandler_getVersion\", \"scriptName\": \"client script.js\", \"slotId\":\"" + slotContract.getId().toBase64String() + "\", \"originId\":\"" + contractServer.getOrigin().toBase64String() + "\"}\n" + " ]\n" + "}\n";
String tmpdir = System.getProperty("java.io.tmpdir");
String strPathRoutes = tmpdir + "/" + "routes.json";
Files.deleteIfExists(Paths.get(strPathRoutes));
new File(strPathRoutes).createNewFile();
Files.write(Paths.get(strPathRoutes), routesJsonString.getBytes(), StandardOpenOption.CREATE, StandardOpenOption.WRITE);
JSApiHttpServerRoutes routes = new JSApiHttpServerRoutes(strPathRoutes, slot1Requestor);
JSApiHttpServer httpServer = new JSApiHttpServer(routes, new JSApiExecOptions(), hashId -> {
try {
return testSpace.client.getState(hashId).state == ItemState.APPROVED;
} catch (ClientError e) {
e.printStackTrace();
return false;
}
}, slot1Requestor);
// here can be any http client. JSApiHttpClient used just for easiness
JSApiScriptParameters scriptParameters = new JSApiScriptParameters();
scriptParameters.domainMasks.add("localhost:*");
JSApiHttpClient httpClient = new JSApiHttpClient(scriptParameters);
// http access to contractServer rev1
List httpRes = httpClient.sendGetRequest("http://localhost:8880/contract1/getVersion", JSApiHttpClient.RESPTYPE_JSON);
System.out.println("httpRes: " + httpRes);
assertEquals(1l, ((HashMap) httpRes.get(1)).get("version"));
// create and register contractServer rev2
Contract contractServer2 = contractServer.createRevision();
contractServer2.addSignerKey(TestKeys.privateKey(0));
String js2 = "";
js2 += "var jsApiEvents = new Object();";
js2 += "jsApiEvents.httpHandler_getVersion = function(request, response){" + " response.setBodyAsJson({" + " version: 2" + " });" + "};";
contractServer2.getState().setJS(js2.getBytes(), "client script.js", new JSApiScriptParameters(), true);
contractServer2.seal();
contractServer2 = Contract.fromPackedTransaction(contractServer2.getPackedTransaction());
ItemResult itemResult2 = testSpace.client.register(contractServer2.getPackedTransaction(), 5000);
assertEquals(ItemState.APPROVED, itemResult2.state);
assertEquals(ItemState.REVOKED, testSpace.client.getState(contractServer.getId()).state);
// force update server contracts from slot1
httpServer.checkAllContracts();
// http access to contractServer rev2
httpRes = httpClient.sendGetRequest("http://localhost:8880/contract1/getVersion", JSApiHttpClient.RESPTYPE_JSON);
System.out.println("httpRes: " + httpRes);
assertEquals(2l, ((HashMap) httpRes.get(1)).get("version"));
System.out.println("\n\n\n============= shutdown...");
testSpace.nodes.forEach(m -> m.shutdown());
httpServer.stop();
}
use of com.icodici.universa.contract.services.SlotContract in project universa by UniversaBlockchain.
the class Contract method fromSealedBinary.
public static Contract fromSealedBinary(byte[] sealedBinary, TransactionPack tp) throws IOException {
Binder data = Boss.unpack(sealedBinary);
if (!data.getStringOrThrow("type").equals("unicapsule"))
throw new UnicapsuleExpectedException("wrong object type, unicapsule required");
byte[] contractBytes = data.getBinaryOrThrow("data");
// This must be explained. By default, Boss.load will apply contract transformation in place
// as it is registered BiSerializable type, and we want to avoid it. Therefore, we decode boss
// data without BiSerializer and then do it by hand calling deserialize:
Binder payload = Boss.load(contractBytes, null);
// contract can be extended type - we need know about it before
String extendedType = payload.getBinder("contract").getBinder("definition").getString("extended_type", null);
NSmartContract.SmartContractType scType = null;
if (extendedType != null) {
try {
scType = NSmartContract.SmartContractType.valueOf(extendedType);
} catch (IllegalArgumentException e) {
}
}
Contract result;
// and if extended type of contract is allowed - create extended contrac, otherwise create simple contract
if (scType != null) {
switch(scType) {
case N_SMART_CONTRACT:
result = new NSmartContract(data, tp);
break;
case SLOT1:
result = new SlotContract(data, tp);
break;
case UNS1:
result = new UnsContract(data, tp);
break;
case UNS2:
result = new UnsContract(data, tp);
break;
case FOLLOWER1:
result = new FollowerContract(data, tp);
break;
default:
// unknwon extended type. create simple contract
// TODO: should we throw?
result = new Contract(data, tp);
}
} else {
result = new Contract(data, tp);
}
result.sealedBinary = sealedBinary;
return result;
}
Aggregations