public Contract getPayloadContract() { if (payload != null) return payload.getContract(); return null; }
public Contract getPaymentContract() { if (payment != null) return payment.getContract(); return null; }
/** * Main .unicon read routine. Load any .unicon version and construct a linked Contract with counterparts (new and * revoking items if present) and corresponding {@link TransactionPack} instance to pack it to store or send to * approval. * <p> * The supported file variants are: * <p> * - v2 legacy unicon. Is loaded with packed counterparts if any. Only for compatibility, avoid using it. * <p> * - v3 compacted unicon. Is loaded without counterparts, should be added later if need with {@link * #addNewItems(Contract...)} and {@link #addRevokingItems(Contract...)}. This is a good way to keep the long * contract chain. * <p> * - packed {@link TransactionPack}. This is a preferred way to keep current contract state. * <p> * To pack and write corresponding .unicon file use {@link #getPackedTransaction()}. * * @param packedItem some packed from of the universa contract * @return unpacked {@link Contract} * @throws IOException if the packedItem is broken */ public static Contract fromPackedTransaction(@NonNull byte[] packedItem) throws IOException { TransactionPack tp = TransactionPack.unpack(packedItem); return tp.getContract(); }
@Override public Approvable getItem(HashId itemId, NodeInfo nodeInfo, Duration maxTimeout) throws InterruptedException { try { // URL url = new URL("http://localhost:8080/contracts/" + itemId.toBase64String()); URL url = new URL(nodeInfo.publicUrlString() + "/contracts/" + itemId.toBase64String()); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestProperty("User-Agent", "Universa JAVA API Client"); connection.setRequestProperty("Connection", "close"); connection.setRequestMethod("GET"); if (200 != connection.getResponseCode()) return null; byte[] data = Do.read(connection.getInputStream()); TransactionPack tp = TransactionPack.unpack(data, true); // tp.trace(); // Contract c = Contract.fromPackedTransaction(data); return tp.getContract(); } catch (Exception e) { report(getLabel(), "download failure. from: " + nodeInfo.getNumber() + " by: " + myInfo.getNumber() +" reason: " + e, DatagramAdapter.VerboseLevel.BASE); e.printStackTrace(); return null; } }
outputStream.write( payment.getContract().getId().getDigest().clone() ); outputStream.write( payload.getContract().getId().getDigest().clone() );
private static void checkFile(File f) { try { TransactionPack tp = TransactionPack.unpack(Do.read(f), true); if (tp.isReconstructed()) { report("file " + f + " is a single contract"); } else { report("file " + f + " is a transaction pack"); } System.out.println(); checkContract(tp.getContract()); } catch (Quantiser.QuantiserException e) { addError("QUANTIZER_COST_LIMIT", f.getPath(), e.toString()); } catch (IOException e) { addError("READ_ERROR", f.getPath(), e.toString()); } catch (Exception e) { addError("UNKNOWN_ERROR", f.getPath(), e.toString()); } }
public void checkSimplePack(TransactionPack tp) { assertEquals(3, tp.getSubItems().size()); assertEquals(c.getId(), tp.getContract().getId()); Set<HashId> rids = c.getRevokingItems().stream().map(x->x.getId()).collect(Collectors.toSet()); Set<HashId> nids = c.getNewItems().stream().map(x->x.getId()).collect(Collectors.toSet()); assertTrue(rids.contains(r0.getId())); assertTrue(nids.contains(n0.getId())); assertTrue(nids.contains(n1.getId())); }
@Override synchronized public Approvable getItem(HashId itemId, NodeInfo nodeInfo, Duration maxTimeout) throws InterruptedException { Node node = nodes.get(nodeInfo); Approvable item = node.getItem(itemId); if(item instanceof Contract) { TransactionPack tp_before = ((Contract) item).getTransactionPack(); byte[] data = tp_before.pack(); // here we "send" data and "got" it TransactionPack tp_after = null; try { tp_after = TransactionPack.unpack(data); Contract gotMainContract = tp_after.getContract(); return gotMainContract; } catch (IOException e) { e.printStackTrace(); } } return item; }
/** * Imitate of sending contract from one part of swappers to another. * * Method packs sending contracts with main swap contract (can be blank - doesn't matter) into TransactionPack. * Then restore from packed binary main swap contract, contracts sending with. * * @param mainContract * @return * @throws Exception */ public synchronized Contract imitateSendingTransactionToPartner(Contract mainContract) throws Exception { TransactionPack tp_before = mainContract.getTransactionPack(); byte[] data = tp_before.pack(); // here we "send" data and "got" it TransactionPack tp_after = TransactionPack.unpack(data); Contract gotMainContract = tp_after.getContract(); return gotMainContract; }
public void parcelAssertions(Parcel equal1, Parcel equal2 ) throws Exception { //few assertions assertEquals(equal1.getPayload().getContract().getId(), equal2.getPayload().getContract().getId()); assertEquals(equal1.getPayment().getContract().getId(), equal2.getPayment().getContract().getId()); assertEquals(equal1.getPayload().getContract().getState().getBranchId(), equal2.getPayload().getContract().getState().getBranchId()); assertEquals(equal1.getPayment().getContract().getState().getBranchId(), equal2.getPayment().getContract().getState().getBranchId()); assertEquals(equal1.getPayload().getContract().getState().getCreatedAt().getSecond(), equal2.getPayload().getContract().getState().getCreatedAt().getSecond()); assertEquals(equal1.getPayment().getContract().getState().getCreatedAt().getSecond(), equal2.getPayment().getContract().getState().getCreatedAt().getSecond()); assertEquals(equal1.getPayload().getContract().getExpiresAt().getDayOfYear(), equal2.getPayload().getContract().getExpiresAt().getDayOfYear()); assertEquals(equal1.getPayment().getContract().getExpiresAt().getDayOfYear(), equal2.getPayment().getContract().getExpiresAt().getDayOfYear()); assertEquals(equal1.getPayload().getSubItems().size(), equal2.getPayload().getSubItems().size()); assertEquals(equal1.getPayment().getSubItems(), equal2.getPayment().getSubItems()); }
checkSimplePack(tp1); Contract c1 = tp1.getContract();
@Test public void serializeDeserialize() throws Exception { //serialize Binder b1 = serialize(parcel); Binder b2 = serialize(parcelFromFile); //deserialize des_parcel = deserialize(b1); des_parcelFromFile = deserialize(b2); parcelAssertions(parcel, des_parcel); parcelAssertions(des_parcelFromFile, des_parcelFromFile); assertEquals(1, des_parcel.getPayload().getSubItems().size()); assertEquals(1, des_parcel.getPayload().getContract().getNew().size()); }
@Test public void packUnpack() throws Exception { //pack byte[] array = parcel.pack(); byte[] array1 = parcelFromFile.pack(); //unpack des_parcel = Parcel.unpack(array); des_parcelFromFile = Parcel.unpack(array1); parcelAssertions(parcel, des_parcel); parcelAssertions(parcelFromFile, des_parcelFromFile); assertEquals(1, des_parcel.getPayload().getSubItems().size()); assertEquals(1, des_parcel.getPayload().getContract().getNew().size()); } }
parcel.getPayment().getContract().check(); parcel.getPayment().getContract().traceErrors(); parcel.getPayload().getContract().check(); parcel.getPayload().getContract().traceErrors(); assertEquals(ItemState.APPROVED, node.waitItem(parcel.getPayment().getContract().getId(), 8000).state); assertEquals(ItemState.APPROVED, node.waitItem(parcel.getPayload().getContract().getId(), 8000).state);
@Test(timeout = 90000) public void transactionalValidUntil_good() throws Exception { Set<PrivateKey> stepaPrivateKeys = new HashSet<>(); Set<PublicKey> stepaPublicKeys = new HashSet<>(); stepaPrivateKeys.add(new PrivateKey(Do.read(ROOT_PATH + "keys/stepan_mamontov.private.unikey"))); for (PrivateKey pk : stepaPrivateKeys) { stepaPublicKeys.add(pk.getPublicKey()); } Contract stepaCoins = Contract.fromDslFile(ROOT_PATH + "stepaCoins.yml"); if (stepaCoins.getTransactional() == null) stepaCoins.createTransactionalSection(); stepaCoins.getTransactional().setValidUntil(ZonedDateTime.now().plusSeconds(Config.validUntilTailTime.getSeconds()*2).toEpochSecond()); stepaCoins.addSignerKey(stepaPrivateKeys.iterator().next()); stepaCoins.seal(); stepaCoins.check(); stepaCoins.traceErrors(); Parcel parcel = createParcelWithFreshU(stepaCoins, stepaPrivateKeys); assertTrue(parcel.getPayloadContract().isOk()); node.registerParcel(parcel); node.waitParcel(parcel.getId(), 8000); assertEquals(ItemState.APPROVED, node.waitItem(parcel.getPayment().getContract().getId(), 8000).state); assertEquals(ItemState.APPROVED, node.waitItem(parcel.getPayload().getContract().getId(), 8000).state); }
@Test(timeout = 90000) public void transactionalValidUntil_timeEnds() throws Exception { Set<PrivateKey> stepaPrivateKeys = new HashSet<>(); Set<PublicKey> stepaPublicKeys = new HashSet<>(); stepaPrivateKeys.add(new PrivateKey(Do.read(ROOT_PATH + "keys/stepan_mamontov.private.unikey"))); for (PrivateKey pk : stepaPrivateKeys) { stepaPublicKeys.add(pk.getPublicKey()); } Contract stepaCoins = Contract.fromDslFile(ROOT_PATH + "stepaCoins.yml"); if (stepaCoins.getTransactional() == null) stepaCoins.createTransactionalSection(); stepaCoins.getTransactional().setValidUntil(ZonedDateTime.now().plusSeconds(Config.validUntilTailTime.getSeconds()/2).toEpochSecond()); stepaCoins.addSignerKey(stepaPrivateKeys.iterator().next()); stepaCoins.seal(); stepaCoins.check(); stepaCoins.traceErrors(); Parcel parcel = createParcelWithFreshU(stepaCoins, stepaPrivateKeys); assertFalse(parcel.getPayloadContract().isOk()); node.registerParcel(parcel); node.waitParcel(parcel.getId(), 8000); assertEquals(ItemState.APPROVED, node.waitItem(parcel.getPayment().getContract().getId(), 8000).state); assertEquals(ItemState.DECLINED, node.waitItem(parcel.getPayload().getContract().getId(), 8000).state); }
@Test(timeout = 90000) public void transactionalValidUntil_timeIsOver() throws Exception { Set<PrivateKey> stepaPrivateKeys = new HashSet<>(); Set<PublicKey> stepaPublicKeys = new HashSet<>(); stepaPrivateKeys.add(new PrivateKey(Do.read(ROOT_PATH + "keys/stepan_mamontov.private.unikey"))); for (PrivateKey pk : stepaPrivateKeys) { stepaPublicKeys.add(pk.getPublicKey()); } Contract stepaCoins = Contract.fromDslFile(ROOT_PATH + "stepaCoins.yml"); if (stepaCoins.getTransactional() == null) stepaCoins.createTransactionalSection(); stepaCoins.getTransactional().setValidUntil(ZonedDateTime.now().plusMonths(-1).toEpochSecond()); stepaCoins.addSignerKey(stepaPrivateKeys.iterator().next()); stepaCoins.seal(); stepaCoins.check(); stepaCoins.traceErrors(); Parcel parcel = createParcelWithFreshU(stepaCoins, stepaPrivateKeys); assertFalse(parcel.getPayloadContract().isOk()); node.registerParcel(parcel); node.waitParcel(parcel.getId(), 8000); assertEquals(ItemState.APPROVED, node.waitItem(parcel.getPayment().getContract().getId(), 8000).state); assertEquals(ItemState.DECLINED, node.waitItem(parcel.getPayload().getContract().getId(), 8000).state); }
assertEquals(ItemState.DECLINED, node.waitItem(payingParcel.getPayload().getContract().getId(), 8000).state); assertEquals(ItemState.APPROVED, node.waitItem(payingParcel.getPayment().getContract().getId(), 8000).state); assertEquals(ItemState.UNDEFINED, node.waitItem(uns.getNew().get(0).getId(), 8000).state);
@Test(timeout = 90000) public void declineParcelWithBadPayload() throws Exception { Set<PrivateKey> stepaPrivateKeys = new HashSet<>(); Set<PublicKey> stepaPublicKeys = new HashSet<>(); stepaPrivateKeys.add(new PrivateKey(Do.read(ROOT_PATH + "keys/stepan_mamontov.private.unikey"))); for (PrivateKey pk : stepaPrivateKeys) { stepaPublicKeys.add(pk.getPublicKey()); } Contract stepaCoins = Contract.fromDslFile(ROOT_PATH + "stepaCoins.yml"); // stepaCoins.addSignerKey(stepaPrivateKeys.iterator().next()); stepaCoins.seal(); stepaCoins.check(); stepaCoins.traceErrors(); Parcel parcel = createParcelWithFreshU(stepaCoins, stepaPrivateKeys); assertTrue(parcel.getPaymentContract().isOk()); assertFalse(parcel.getPayloadContract().isOk()); node.registerParcel(parcel); // wait parcel node.waitParcel(parcel.getId(), 8000); // check payment and payload contracts assertEquals(ItemState.APPROVED, node.waitItem(parcel.getPayment().getContract().getId(), 8000).state); assertEquals(ItemState.DECLINED, node.waitItem(parcel.getPayload().getContract().getId(), 8000).state); }
assertEquals(ItemState.DECLINED, node.waitItem(parcel.getPayment().getContract().getId(), 8000).state); assertEquals(ItemState.UNDEFINED, node.waitItem(parcel.getPayload().getContract().getId(), 8000).state);