@Nullable public synchronized Transaction getRawTransaction(Sha256Hash hash) { lock.lock(); try { NxtTransaction tx = rawtransactions.get(hash); if (tx != null) { return tx.getRawTransaction(); } else { return null; } } finally { lock.unlock(); } }
public void signTransaction(NxtSendRequest request) { checkArgument(request.isCompleted(), "Send request is not completed"); checkArgument(request.tx != null, "No transaction found in send request"); Transaction tx = request.tx.getRawTransaction(); byte[] privateKey; if (rootKey.isEncrypted()) { checkArgument(request.aesKey != null, "Wallet is encrypted but no decryption key provided"); privateKey = rootKey.toDecrypted(request.aesKey).getPrivateKey(); } else { privateKey = rootKey.getPrivateKey(); } tx.sign(privateKey); Arrays.fill(privateKey, (byte) 0); // clear private key }
public boolean broadcastNxtTxSync(NxtTransaction tx) throws TransactionBroadcastException { if (isConnected()) { if (log.isInfoEnabled()) { log.info("Broadcasting tx {}", Utils.HEX.encode(tx.getRawTransaction().getBytes())); } boolean success = blockchainConnection.broadcastTxSync(tx); if (success) { onTransactionBroadcast(tx); } else { onTransactionBroadcastError(tx); } return success; } else { throw new TransactionBroadcastException("No connection available"); } }
@Override public boolean broadcastTxSync(final NxtTransaction tx) { RequestBody formBody = new FormEncodingBuilder().add("requestType","broadcastTransaction") .add("transactionBytes", Convert.toHexString(tx.getRawTransaction().getBytes())).build(); Request request = new Request.Builder().url(getBaseUrl()).post(formBody).build(); // FIXME this is not a sync call getHttpClient().newCall(request).enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { log.info("Failed to communicate with server: " + request.toString()); } @Override public void onResponse(Response response) throws IOException { try { if (!response.isSuccessful()) { log.info("Unable to fetch txs."); log.info("[Error code] = " + response.code()); } JSONObject reply = parseReply(response); log.info("Transaction broadcasted {0}", reply.toString()); } catch (IOException e) { log.info("IOException: " + e.getMessage()); } catch (JSONException e) { log.info("Could not parse JSON: " + e.getMessage()); } } }); return true; }
@Test public void testNxtTransaction() throws WalletAccount.WalletAccountException, NxtException.ValidationException { NxtAddress destination = (NxtAddress) otherAccount.getReceiveAddress(); Value amount = NXT.value("1"); NxtSendRequest req = nxtAccount.sendCoinsOffline(destination, amount); nxtAccount.completeAndSignTx(req); Transaction nxtTx = req.nxtTxBuilder.build(); // nxtTx.sign(nxtSecret); byte[] txBytes = req.nxtTxBuilder.build().getBytes(); req.tx = new NxtTransaction(NXT, req.nxtTxBuilder.build()); Transaction parsedTx = TransactionImpl.parseTransaction(txBytes); assertEquals(Attachment.ORDINARY_PAYMENT, parsedTx.getAttachment()); assertEquals(NxtFamily.DEFAULT_DEADLINE, parsedTx.getDeadline()); assertEquals((req.tx.getRawTransaction()).getTimestamp(), parsedTx.getTimestamp()); assertEquals(nxtAccountId, parsedTx.getSenderId()); assertArrayEquals(nxtPublicKey, parsedTx.getSenderPublicKey()); assertEquals(amount.value, parsedTx.getAmountNQT()); assertEquals(req.fee.value, parsedTx.getFeeNQT()); assertEquals(destination.getAccountId(), parsedTx.getRecipientId()); // System.out.println(Convert.toHexString(nxtTx.getBytes())); // TODO check signature }