/** * Method creates smart contract from dsl file where contract is described. * @param fileName is path to dsl file with yaml structure of data for contract. */ public static NSmartContract fromDslFile(String fileName) throws IOException { Yaml yaml = new Yaml(); try (FileReader r = new FileReader(fileName)) { Binder binder = Binder.from(DefaultBiMapper.deserialize((Map) yaml.load(r))); return new NSmartContract().initializeWithDsl(binder); } }
@Override public NImmutableEnvironment getEnvironment(NSmartContract smartContract) { NImmutableEnvironment nim = getEnvironment(smartContract.getId()); if(nim == null && smartContract.getParent() != null) nim = getEnvironment(smartContract.getParent()); if (nim == null) { long envId = saveEnvironmentToStorage(smartContract.getExtendedType(), smartContract.getId(), Boss.pack(new Binder()), smartContract.getPackedTransaction()); nim = getEnvironment(envId); } else { nim.setContract(smartContract); } return nim; }
@Override /** * We override seal method to recalculate holding at the state.data values */ public byte[] seal() { saveTrackingOriginsToState(); calculatePrepaidOriginDays(true); return super.seal(); }
private NImmutableEnvironment getEnvironment(NSmartContract item) { NImmutableEnvironment result = envCache.get(item.getId()); if(result == null && item.getParent() != null) { result = envCache.get(item.getParent()); } if(result == null) { result = ledger.getEnvironment(item); envCache.put(result); } return result; }
NSmartContract rev1 = new NSmartContract(TestKeys.privateKey(0)); rev1.getStateData().set("field1", 33); Permission permission = new ChangeNumberPermission(rev1.getOwner(), Binder.of("field_name", "field1")); rev1.addPermission(permission); rev1.seal(); ItemResult ir1 = testSpace.client.register(rev1.getPackedTransaction(), 5000); assertEquals(ItemState.APPROVED, ir1.state); Contract rev2 = rev1.createRevision(); rev2.getStateData().set("field1", 34); rev2.addSignerKey(TestKeys.privateKey(0)); ItemResult ir2 = testSpace.client.register(rev2.getPackedTransaction(), 5000); assertEquals(ItemState.APPROVED, ir2.state); ir1 = testSpace.client.register(rev1.getPackedTransaction(), 5000); assertEquals(ItemState.REVOKED, ir1.state); assertNull(ledger.getEnvironment(rev1.getId())); NImmutableEnvironment environment = new NImmutableEnvironment(rev1,new Binder(),Do.listOf(),Do.listOf(),Do.listOf(),null,null); ledger.saveEnvironment(environment); assertNotNull(ledger.getEnvironment(rev1.getId())); testSpace.clients.get(testSpace.clients.size()-1).resyncItem(rev1.getId()); long millisToWait = 60000; long waitPeriod = 2000; Thread.sleep(waitPeriod); millisToWait -= waitPeriod; ir = testSpace.clients.get(testSpace.clients.size()-1).getState(rev1.getId());
public void save() { ledger.updateEnvironment(getId(),contract.getExtendedType(),contract.getId(), Boss.pack(kvStore),contract.getPackedTransaction());
switch(scType) { case N_SMART_CONTRACT: contract = new NSmartContract(bb, this); break;
((NSmartContract) item).setNodeInfoProvider(nodeInfoProvider); ime.setNameCache(nameCache); if (((NSmartContract) item).getRevision() == 1) { if (!((NSmartContract) item).beforeCreate(ime)) item.addError(Errors.FAILED_CHECK, item.getId().toString(), "beforeCreate fails"); } else { if (!((NSmartContract) item).beforeUpdate(ime)) item.addError(Errors.FAILED_CHECK, item.getId().toString(), "beforeUpdate fails");
contract.seal(); NSmartContract smartContract = new NSmartContract(privateKey); smartContract.seal();
ime.setNameCache(nameCache); NSmartContract contract = ime.getContract(); contract.setNodeInfoProvider(nodeInfoProvider); NMutableEnvironment me = ime.getMutable(); contract.onContractSubscriptionEvent(new ContractSubscription.ApprovedEvent() { @Override public Contract getNewRevision() { contract.onContractSubscriptionEvent(new ContractSubscription.RevokedEvent() { @Override public MutableEnvironment getEnvironment() { if (contract.canFollowContract((Contract) updatingItem)) { if (updatingState == ItemState.APPROVED) { contract.onContractSubscriptionEvent(new ContractSubscription.ApprovedWithCallbackEvent() { @Override public Contract getNewRevision() { contract.onContractSubscriptionEvent(new ContractSubscription.RevokedWithCallbackEvent() { @Override public Contract getRevokingItem() {
((NSmartContract) newItem).setNodeInfoProvider(nodeInfoProvider); if (!((NSmartContract) newItem).beforeCreate(ime)) newItem.addError(Errors.BAD_NEW_ITEM, item.getId().toString(), "newItem.beforeCreate fails"); } else { if (!((NSmartContract) newItem).beforeUpdate(ime)) newItem.addError(Errors.BAD_NEW_ITEM, item.getId().toString(), "newItem.beforeUpdate fails");
@Override public boolean check() throws Quantiser.QuantiserException { boolean checkResult = false; // check that type of smart contract is set and exist String extendedTypeString = getExtendedType(); if(extendedTypeString != null) { SmartContractType scType = null; try { scType = SmartContractType.valueOf(extendedTypeString); if(scType != null) { checkResult = true; } } catch (IllegalArgumentException e) { addError(BAD_VALUE, "definition.extended_type", "illegal value, should be string from SmartContractType enum"); checkResult = false; } } else { addError(BAD_VALUE, "definition.extended_type", "value not defined, should be string from SmartContractType enum"); checkResult = false; } if(!checkResult) return checkResult; checkResult = super.check(); if(!checkResult) { return checkResult; } return checkResult; }
((NSmartContract) revokingItem).setNodeInfoProvider(nodeInfoProvider); ime.setNameCache(nameCache); ((NSmartContract) revokingItem).beforeRevoke(ime); } else { revokingItem.addError(Errors.FAILED_CHECK, revokingItem.getId().toString(), "can't load environment to revoke");
@Override public Binder serialize(BiSerializer serializer) { Binder data = new Binder(); data.set("contract", contract.getPackedTransaction()); data.set("createdAt", serializer.serialize(createdAt)); data.set("subscriptions", serializer.serialize(Do.list(subscriptionsSet))); data.set("storages", serializer.serialize(Do.list(storagesSet))); data.set("nameRecords", serializer.serialize(Do.list(nameRecordsSet))); data.set("kvStore", serializer.serialize(kvStore)); return data; }
@Override public Set<HashId> saveEnvironment(NImmutableEnvironment environment) { Set<HashId> conflicts = saveEnvironment_getConflicts(environment); if (conflicts.size() == 0) { NSmartContract nsc = environment.getContract(); removeEnvironment(nsc.getId()); long envId = saveEnvironmentToStorage(nsc.getExtendedType(), nsc.getId(), Boss.pack(environment.getMutable().getKVStore()), nsc.getPackedTransaction()); for (NameRecord nr : environment.nameRecords()) { NNameRecord nnr = (NNameRecord)nr; nnr.setEnvironmentId(envId); addNameRecord(nnr); } for (ContractSubscription css : environment.subscriptions()) saveSubscriptionInStorage(css.getHashId(), css.isChainSubscription(), css.expiresAt(), envId); for (ContractStorage cst : environment.storages()) saveContractInStorage(cst.getContract().getId(), cst.getPackedContract(), cst.expiresAt(), cst.getContract().getOrigin(), envId); FollowerService fs = environment.getFollowerService(); if (fs != null) saveFollowerEnvironment(envId, fs.expiresAt(), fs.mutedAt(), fs.getCallbacksSpent(), fs.getStartedCallbacks()); } return conflicts; }
switch (scType) { case N_SMART_CONTRACT: c = new NSmartContract(b.toArray(), this); break;
@Test public void goodSmartContractWithSending() throws Exception { final PrivateKey key = new PrivateKey(Do.read(ROOT_PATH + "_xer0yfe2nn1xthc.private.unikey")); Contract smartContract = new NSmartContract(key); smartContract.seal(); smartContract.check(); smartContract.traceErrors(); assertTrue(smartContract.isOk()); Contract gotContract = imitateSendingTransactionToPartner(smartContract); assertTrue(gotContract instanceof NSmartContract); assertTrue(gotContract instanceof NContract); registerAndCheckApproved(gotContract); ItemResult itemResult = node.waitItem(gotContract.getId(), 8000); // assertEquals("ok", itemResult.extraDataBinder.getBinder("onCreatedResult").getString("status", null)); // assertEquals("ok", itemResult.extraDataBinder.getBinder("onUpdateResult").getString("status", null)); }
@Override /** * We override seal method to recalculate holding at the state.data values */ public byte[] seal() { saveTrackingContractsToState(); calculatePrepaidKilobytesForDays(true); return super.seal(); }
@Test public void goodNSmartContractWithSending() throws Exception { final PrivateKey key = new PrivateKey(Do.read(ROOT_PATH + "_xer0yfe2nn1xthc.private.unikey")); Contract smartContract = new NSmartContract(key); smartContract.seal(); smartContract.check(); smartContract.traceErrors(); assertTrue(smartContract.isOk()); Contract gotContract = imitateSendingTransactionToPartner(smartContract); assertTrue(gotContract instanceof NSmartContract); assertTrue(gotContract instanceof NContract); registerAndCheckApproved(gotContract); ItemResult itemResult = node.waitItem(gotContract.getId(), 8000); // assertEquals("ok", itemResult.extraDataBinder.getBinder("onCreatedResult").getString("status", null)); // assertEquals("ok", itemResult.extraDataBinder.getBinder("onUpdateResult").getString("status", null)); }
@Override public byte[] seal() { saveNamesToState(); saveOriginReferencesToState(); calculatePrepaidNamesForDays(true); return super.seal(); }