Ich stelle Euch hier eine einfache Lösung zur Erzeugung eines Timestamps vor, welche mit intelliJ IDEA erstellt worden ist (benötigt Ihr dann auch zum Nachbau, sonst bekommt Ihr die Oberfläche nicht bearbeitet).
Das Programm arbeitet mit dem BitcoinJ WalletAppKit, welches uns viel Programmierarbeit abnimmt. Standardmäßig läuft das Programm im Bitcoin-Testnetz und zur Nutzung benötigt Ihr ein paar (Test-) Bitcoins von einem Faucet (siehe Bitcoin Linksammlung). Das Programm ist auch dafür vorbereitet, mit einem lokalen Bitcoin Regressionsnetzwerk Daten auszutauschen (siehe eigene Artikelreihe, die bereits in Vorbereitung ist). Bitte benutzt als Basis die BitcoinJ-Bibliothek mit der Versionsnummer 0.15.6 -damit klappt das Programm auf jeden Fall (Links zu allen Bibliotheken siehe unten).
Nach der Online-Aktualisierung werden die Daten in zwei Fenster und parallel in zwei Textdateien geschrieben und diese Dateinamen vergeben: BitcoinJCreateTimestamp_Output_xxx.txt und BitcoinJCreateTimestamp_Logfile_xxx.txt, wobei „xxx“ für das aktuelle Datum und die Uhrzeit steht; so könnt Ihr die Ausgaben später ganz in Ruhe studieren. Die hierfür notwendige Klasse RedirectedFrame.java findet Ihr in meinem GitHub-Archiv.
Die Benutzung ist sehr einfach gehalten – nach dem Programmstart geht das Programm nicht sofort online, sondern wartet auf Euren Button-Klick bei „starte das Wallet“:
Bis das Wallet aktualisiert ist (kann schon einmal 1 bis 3 Minuten dauern) läuft eine JProgressBar durch das Bild:
Sobald das Wallet auf dem aktuellen Stand ist wählt Ihr über den Button „waehlen Sie eine Datei für den Zeitstempel“ die Datei aus, für die Ihr einen Zeitstempel benötigt. Wenn alles klappt, hat das Programm in das Verzeichnis der Originaldatei eine zusätzliche Textdatei geschrieben (Dateiname ist der Originaldateiname + „.timestamp.txt“):
Die Timestamp-Datei enthält als wichtigste Angabe die Transaktions-Id, in der der Hashwert der Originaldatei gespeichert ist (zu finden in der ersten Zeile und Zeile 18). Alle anderen Angaben dienen mehr der besseren Zuordnung des Timestamps zu einer speziellen Datei:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
406952a7ec2da89814ab1b635b6bad3e5fc46affdfd7c4deaa301973e7939aa0 3e383e47ec7a5434c918eceef3c1443931d5ed85061629378d3299710e649941 C:\Users\admi\Documents\java-crypto_bplaced_net.pdf 61455 21.03.2020 12:52:33 ********************************************************************************** ******* do not edit above lines | bitte die oberen Zeilen nicht veraendern ******* ********************************************************************************** This Timestamp was created with / Dieser Zeitstempel wurde generiert mit http://java-crypto.bplaced.net/bitcoinj-erzeuge-einen-timestamp/ Sourcecode : https://github.com/java-crypto/BitcoinJTimestamp Dateiname : C:\Users\xxx\Documents\java-crypto_bplaced_net.pdf Dateigroesse : 61455 (Bytes) Dateidatum/Zeit : 21.03.2020 12:07:09.981 (zuletzt modifiziert) Timestamp-Datei : C:\Users\xxx\Documents\java-crypto_bplaced_net.pdf.timestamp.txt Hashwert SHA256 : 3e383e47ec7a5434c918eceef3c1443931d5ed85061629378d3299710e649941 Datum Timestamp : 21.03.2020 12:52:33 TransaktionsId : 406952a7ec2da89814ab1b635b6bad3e5fc46affdfd7c4deaa301973e7939aa0 Network-ID : org.bitcoin.test ********************************************************************************** |
Diesen Timestamp könnt Ihr entweder manuell überprüfen oder Ihr nutzt das folgende Programm zur Erweiterung des Timestamps (BitcoinJ Erweitere einen Timestamp).
Hier ist die Suche der Transaktion in einem Bitcoin Testnetz-Explorer (Direktlink: https://tbtc.bitaps.com/406952a7ec2da89814ab1b635b6bad3e5fc46affdfd7c4deaa301973e7939aa0). Das Ergebnis stimmt uns positiv – der Hashwert unserer Originaldatei („3e383e47ec7a5434c918eceef3c1443931d5ed85061629378d3299710e649941“) ist nun in der Blockchain verewigt:
Bitte beachtet noch den folgenden Hinweis: wenn ich von „ewiglicher“ Speicherung des Timestamps in der Blockchain spreche meine ich das Main-Netzwerk und nicht das hier hauptsächlich genutzte Testnetz. Das Testnetz kann jederzeit zurückgesetzt werden und alle bis dahin gespeicherten Daten können verschwinden – speichert bitte keine wichtigen Timestamps alleine im Bitcoin Testnetzwerk!
Alle Quellcodes zu BitcoinJ Timestamps & OP_RETURN findet Ihr zum Download in meinem GitHub-Repository BitcoinJTimestamp, welches Ihr über diesen Link erreicht: https://github.com/java-crypto/BitcoinJTimestamp. Alle Programme sind unter Java 11 lauffähig (vermutlich auch unter Java 8) und wurden mit intelliJ IDEA entwickelt, welches für dieses Programm aber nicht notwendig ist.
Zur Nutzung der Programme benötigt Ihr diverse Bibliotheken – ladet Euch diese aus dem separaten GitHub-Archiv (https://github.com/java-crypto/BitcoinJ_Libraries) herunter und bindet Sie über Eure Entwicklungsumgebung ein.
Noch ein Wort zum Thema „Lizenz“: Das Programm steht unter unterschiedlichen Lizenzen, die Ihr bitte beachten solltet. Die von mir erstellten Beispiele selber stehen unter der „Unlicense“-Lizenz, allerdings werden zur Laufzeit diverse Bibliotheken eingebunden, welche zum Teil ganz eigene Lizenzen mitbringen. Darauf kann ich in meinen Lizenzhinweisen nicht hinweisen.
Letzte Bearbeitung: 22.03.2020
Hier der Sourcecode des Programms und der Form; den Quellcode der Klasse RedirectedFrame.java findet Ihr in meinem GitHub-Repository:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 |
/* * Herkunft/Origin: http://javacrypto.bplaced.net/ * Programmierer/Programmer: Michael Fehr * Copyright/Copyright: Michael Fehr * Lizenttext/Licence: verschiedene Lizenzen / several licenses * getestet mit/tested with: Java Runtime Environment 11.0.5 x64 * verwendete IDE/used IDE: intelliJ IDEA 2019.3.1 * Datum/Date (dd.mm.jjjj): 21.03.2020 * Funktion: Erzeugt den SHA256-Hashwert einer Datei und speichert ihn als Timestamp in der Bitcoin Blockchain * Function: create the SHA256-hash of a file a save it as timestamp in the Bitcoin blockchain * * Sicherheitshinweis/Security notice * Die Programmroutinen dienen nur der Darstellung und haben keinen Anspruch auf eine korrekte Funktion, * insbesondere mit Blick auf die Sicherheit ! * Prüfen Sie die Sicherheit bevor das Programm in der echten Welt eingesetzt wird. * The program routines just show the function but please be aware of the security part - * check yourself before using in the real world ! * * Sie benötigen diverse Bibliotheken (alle im Github-Archiv im Unterordner "libs") * You need a lot of libraries (see my Github-repository in subfolder "libs") * verwendete BitcoinJ-Bibliothek / used BitcoinJ Library: bitcoinj-core-0.15.6.jar * my Github-Repository: https://github.com/java-crypto/BitcoinJ * libs in my Github-Repo: https://github.com/java-crypto/BitcoinJ_Libraries * */ import org.bitcoinj.core.*; import org.bitcoinj.kits.WalletAppKit; import org.bitcoinj.params.MainNetParams; import org.bitcoinj.params.RegTestParams; import org.bitcoinj.params.TestNet3Params; import org.bitcoinj.script.ScriptBuilder; import org.bitcoinj.wallet.SendRequest; import org.bitcoinj.wallet.Wallet; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.nio.file.Files; import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.attribute.FileTime; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.concurrent.TimeUnit; public class BitcoinJCreateATimestamp { private WalletAppKit kit; boolean kitIsRunning = false; private NetworkParameters netParams; private LocalDateTime localDateTimeStart; private LocalDateTime localDateTimeEnd; private String filenameWallet = "TimestampOwn"; private String filenameTimestampAppend = ".timestamp.txt"; private String filenameTimestamp; private Coin balance; private Sha256Hash sha256Hash; private Color colorStatus; public BitcoinJCreateATimestamp() throws IOException, InterruptedException { // choose network type (MAIN, TEST or REG) //String networkType = "MAIN"; String networkType = "TEST"; //String networkType = "REG"; switch (networkType) { case "MAIN": { netParams = MainNetParams.get(); filenameWallet = filenameWallet + "_Mainnet"; break; } case "TEST": { netParams = TestNet3Params.get(); filenameWallet = filenameWallet + "_Testnet"; break; } case "REG": { netParams = RegTestParams.get(); filenameWallet = filenameWallet + "_Regtest"; break; } default: { System.out.println("Es ist kein networkType angegeben, das Programm wird in 10 Sekunden beendet"); tfStatus.setText("Kein networkType angegeben, Programm endet in 10 Sekunden"); tfStatus.setBackground(Color.RED); TimeUnit.SECONDS.sleep(10); System.exit(0); } } System.out.println("Das Programm arbeitet im Netzwerk: " + netParams.getId()); System.out.println("Guten Tag, zum Start bitte den Button 'starte das wallet' druecken"); localDateTimeStart = LocalDateTime.now(); kitIsRunning = false; colorStatus = tfStatus.getBackground(); btnFileChooser.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { tfFile.setText(""); tfStatus.setText(""); tfHash.setText(""); tfFileLength.setText(""); tfProofFile.setText(""); tfFileDate.setText(""); tfStatus.setBackground(colorStatus); filenameTimestamp = ""; sha256Hash = null; File file = chooseFile(); try { tfFile.setText(file.toString()); } catch (NullPointerException e) { } if (tfFile.getText() != "") { filenameTimestamp = tfFile.getText(); System.out.println("Datei die mit einem Timestamp versehen werden soll: " + filenameTimestamp); try { sha256Hash = Sha256Hash.of(file); } catch (IOException e) { e.printStackTrace(); } tfHash.setText(String.valueOf(sha256Hash)); tfFileLength.setText(Long.toString(file.length()) + " (Bytes)"); // perform the next steps System.out.println("\nInformationen im OP_RETURN-Bereich der Transaktion: "); byte[] txOpReturnByte = sha256Hash.getBytes(); System.out.println("txOPReturnByte: " + bytesToHex(txOpReturnByte) + " Laenge: " + txOpReturnByte.length); System.out.println("\nDie Transaktion und der SendRequest werden erstellt"); // construct an OP_RETURN transaction Transaction transaction = new Transaction(netParams); transaction.addOutput( Coin.ZERO, ScriptBuilder.createOpReturnScript(txOpReturnByte) ); // transaction is used to create a sendrequest SendRequest sendRequest = SendRequest.forTx(transaction); System.out.println("Ausgabe der Transaktion : " + transaction); Coin coinsFee = Coin.valueOf(1000); sendRequest.feePerKb = coinsFee; // minimum fee System.out.println("Ausgabe des SendRequests: " + sendRequest); System.out.println("\nSenden des SendRequests an das Wallet und das SendResult erhalten"); Wallet.SendResult sendResult = null; try { sendResult = kit.wallet().sendCoins(sendRequest); } catch (InsufficientMoneyException e) { System.out.println("Fehler: ungenuegendes Guthaben - laden Sie Bitcons in das Wallet"); tfStatus.setText("Fehler: ungenuegendes Guthaben - laden Sie Bitcons in das Wallet"); System.out.println("Aktuelle Empfangsadresse: " + kit.wallet().currentReceiveAddress()); tfStatus.setBackground(Color.RED); btnFileChooser.setEnabled(false); e.printStackTrace(); } System.out.println("Ausgabe des SendResults : " + sendResult.tx); System.out.println("Transaktions Id : " + sendResult.tx.getTxId().toString()); tfTxId.setText(sendResult.tx.getTxId().toString()); System.out.println("SHA256-Hashwert der Datei: " + tfHash.getText()); try { tfFileDate.setText(fileLastModified(file) + " (zuletzt modifiziert)"); System.out.println("Dateidatum : " + fileLastModified(file) + " (zuletzt modifiziert)"); } catch (IOException e) { e.printStackTrace(); } // save to timestamp-datei tfProofFile.setText(filenameTimestamp + filenameTimestampAppend); boolean filenameTimestampSaved = saveTimestamp(tfTxId.getText(), tfHash.getText(), new File(tfFile.getText()), getActualDate(), netParams.getId()); if (filenameTimestampSaved == true) { System.out.println("Timestamp Datei erstellt: " + tfProofFile.getText()); tfStatus.setText("Timestamp erstellt, Datei " + tfProofFile.getText()); tfStatus.setBackground(Color.GREEN); } else { System.out.println("Timestamp Datei konnte nicht erstellt werden: " + tfProofFile.getText()); tfStatus.setText("Timestamp nicht erstellt, Datei " + tfProofFile.getText()); tfStatus.setBackground(Color.RED); } } System.out.println("Das aktuelle Guthaben ist: " + kit.wallet().getBalance()); System.out.println("Aktuelle Empfangsadresse : " + kit.wallet().currentReceiveAddress()); tfBalance.setText(kit.wallet().getBalance().toFriendlyString() + (" = ") + kit.wallet().getBalance() + " Satoshi"); balance = kit.wallet().getBalance(); } // do nothing }); btnClose.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { btnFileChooser.setEnabled(false); btnClose.setEnabled(false); btnStartKit.setEnabled(false); progressBarWait.setString("Das Programm wird beendet, bitte warten ..."); tfStatus.setText("Das Programm wird beendet, bitte warten ..."); progressBarWait.setStringPainted(true); progressBarWait.setVisible(true); progressBarWait.setIndeterminate(true); Thread thread = new Thread() { public void run() { System.out.println("btnClose laeuft im separaten Thread"); // stop kit try { Thread.sleep(1000); // 5 seconds to end } catch (InterruptedException e) { } if (kitIsRunning) { kit.stopAsync(); kit.awaitTerminated(); } localDateTimeEnd = LocalDateTime.now(); System.out.println("Das Programm endet jetzt"); System.out.println("Datum & Zeit am Start: " + localDateTimeStart.toString()); System.out.println("Datum & Zeit am Ende : " + localDateTimeEnd.toString()); System.exit(0); } }; thread.start(); } }); btnStartKit.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { // disable start button to prevent a second start btnStartKit.setEnabled(false); progressBarWait.setString("Das Wallet wird aktualisiert, bitte warten ..."); progressBarWait.setStringPainted(true); progressBarWait.setVisible(true); progressBarWait.setIndeterminate(true); if (kitIsRunning) { System.out.println("Das Wallet ist bereits gestartet"); return; } // actual date and time localDateTimeStart = LocalDateTime.now(); System.out.println("Lade ein HD-Wallet mit BitcoinJ im Bitcoin Testnet und erzeuge eine OP_RETURN Transaktion mit reduzierten Kosten\n"); System.out.println("Das Programm benutzt das BitcoinJ WalletAppKit\n"); System.out.println("Bitte benutzen Sie Java 11 und bitcoinj-core-0.15.6.jar fuer dieses Programm\n"); Thread thread = new Thread() { public void run() { System.out.println("btnStartKit laeuft im separaten Thread"); kit = new WalletAppKit(netParams, new File("."), filenameWallet); kit.setAutoSave(true); if (netParams == RegTestParams.get()) { kit.connectToLocalHost(); // für regtest notwendig } System.out.println("Das Wallet wurde geladen: " + filenameWallet); System.out.println("\nDas Wallet aktualisiert die Blockchain in der Datei " + filenameWallet + ".spvchain"); System.out.println("Bitte haben Sie eine bis drei Minuten Geduld"); kit.startAsync(); kit.awaitRunning(); while (!kit.isRunning()) { try { wait(1000); } catch (InterruptedException e) { e.printStackTrace(); } } // kit is running progressBarWait.setVisible(false); progressBarWait.setIndeterminate(false); kit.wallet().allowSpendingUnconfirmedTransactions(); // nur eigene gelder, daher erlaube ich das mal System.out.println("Das aktuell verfuegbare Guthaben ist: " + kit.wallet().getBalance().toFriendlyString() + (" = ") + kit.wallet().getBalance() + " Satoshi"); tfBalance.setText(kit.wallet().getBalance().toFriendlyString() + (" = ") + kit.wallet().getBalance() + " Satoshi"); balance = kit.wallet().getBalance(); System.out.println("Aktuelle Empfangsadresse : " + kit.wallet().currentReceiveAddress()); System.out.println("Das Programm ist betriebsbereit und wartet auf den Einsatz"); kitIsRunning = true; tfStatus.setText("Das WalletAppKit laeuft"); btnFileChooser.setEnabled(true); } }; thread.start(); } }); } private File chooseFile() { JFileChooser chooser = new JFileChooser(); if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { return chooser.getSelectedFile(); } else { return null; } } private String bytesToHex(byte[] bytes) { StringBuffer result = new StringBuffer(); for (byte b : bytes) result.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1)); return result.toString(); } /* timestamp file format filenameTimestamp = filenameDoc + filenameTimestampAppend e.g. ".timestamp.txt" line 01: TxId line 02: Hash of filenameDoc line 03: filenameDoc line 04: length of filenameDoc line 05: date and time of timestamp (sendrequest) * method returns true if writing is successfull */ private boolean saveTimestamp(String txId, String hashFilenameDoc, File fileDoc, String dateTimeTimestamp, String networkId) { boolean result = false; BufferedWriter writerSend = null; String filenameDoc = fileDoc.toString(); try { writerSend = new BufferedWriter(new FileWriter(filenameDoc + filenameTimestampAppend)); //writerSend.write("Informationen zum Timestamp in der Blockchain\n"); writerSend.write(txId + "\n"); writerSend.write(hashFilenameDoc + "\n"); writerSend.write(filenameDoc + "\n"); writerSend.write(Long.toString(fileDoc.length()) + "\n"); writerSend.write(dateTimeTimestamp + "\n"); writerSend.write("**********************************************************************************" + "\n"); writerSend.write("******* do not edit above lines | bitte die oberen Zeilen nicht veraendern *******" + "\n"); writerSend.write("**********************************************************************************" + "\n"); writerSend.write("This Timestamp was created with / Dieser Zeitstempel wurde generiert mit" + "\n"); writerSend.write("http://java-crypto.bplaced.net/bitcoinj-erzeuge-einen-timestamp/" + "\n"); writerSend.write("Sourcecode : " + "https://github.com/java-crypto/BitcoinJTimestamp" + "\n"); writerSend.write("Dateiname : " + filenameDoc + "\n"); writerSend.write("Dateigroesse : " + fileDoc.length() + " (Bytes)\n"); writerSend.write("Dateidatum/Zeit : " + fileLastModified(fileDoc) + " (zuletzt modifiziert)" + "\n"); writerSend.write("Timestamp-Datei : " + filenameDoc + filenameTimestampAppend + "\n"); writerSend.write("Hashwert SHA256 : " + hashFilenameDoc + "\n"); writerSend.write("Datum Timestamp : " + dateTimeTimestamp + "\n"); writerSend.write("TransaktionsId : " + txId + "\n"); writerSend.write("Network-ID : " + networkId + "\n"); writerSend.write("**********************************************************************************" + "\n"); writerSend.close(); result = true; } catch (IOException e) { e.printStackTrace(); } return result; } private String getActualDate() { // provides the actual date and time in this format dd-MM-yyyy_HH-mm-ss e.g. 16-03-2020_10-27-15 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"); LocalDateTime today = LocalDateTime.now(); return formatter.format(today); } public String fileLastModified(File file) throws IOException { String fileLastModifiedDate = ""; BasicFileAttributes bfa = Files.readAttributes(file.toPath(), BasicFileAttributes.class); FileTime fileTime = bfa.lastModifiedTime(); DateTimeFormatter DATE_FORMATTER_WITH_TIME = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss.SSS"); fileLastModifiedDate = fileTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().format(DATE_FORMATTER_WITH_TIME); return fileLastModifiedDate; } private static String getActualDateReverse() { // provides the actual date and time in this format yyyy-MM-dd_HH-mm-ss e.g. 2020-03-16_10-27-15 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm-ss"); LocalDateTime today = LocalDateTime.now(); return formatter.format(today); } public static void main(String[] args) throws IOException, InterruptedException { JFrame frame = new JFrame("Erzeuge einen Zeitstempel in der Bitcoin Blockchain"); RedirectedFrame outputFrameErrors = new RedirectedFrame("Log Frame", true, false, true, "BitcoinJ_CreateTimestamp_Logfile_" + getActualDateReverse() + ".txt", 750, 650, JFrame.DO_NOTHING_ON_CLOSE); RedirectedFrame outputFrameOutput = new RedirectedFrame("Output Frame", false, true, true, "BitcoinJ_CreateTimestamp_Output_" + getActualDateReverse() + ".txt", 700, 600, JFrame.DO_NOTHING_ON_CLOSE); frame.setContentPane(new BitcoinJCreateATimestamp().mainPanel); frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); frame.pack(); frame.setSize(800, 500); frame.setVisible(true); } private JPanel mainPanel; private JButton btnFileChooser; private JTextField tfFile; private JTextField tfHash; private JTextField tfBalance; private JTextField tfFileLength; private JTextField tfProofFile; private JTextField tfTxId; private JTextField tfStatus; private JButton btnClose; private JButton btnStartKit; private JProgressBar progressBarWait; private JTextField tfFileDate; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 |
<?xml version="1.0" encoding="UTF-8"?> <form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="BitcoinJCreateATimestamp"> <grid id="27dc6" binding="mainPanel" layout-manager="GridLayoutManager" row-count="22" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1"> <margin top="10" left="10" bottom="10" right="10"/> <constraints> <xy x="20" y="20" width="376" height="613"/> </constraints> <properties/> <border type="none"/> <children> <component id="6a45a" class="javax.swing.JButton" binding="btnFileChooser"> <constraints> <grid row="3" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/> </constraints> <properties> <enabled value="false"/> <text value="waehlen Sie die Datei fuer den Zeitstempel"/> </properties> </component> <component id="e0fd9" class="javax.swing.JSeparator"> <constraints> <grid row="4" column="1" row-span="1" col-span="1" vsize-policy="6" hsize-policy="6" anchor="0" fill="3" indent="0" use-parent-layout="false"/> </constraints> <properties/> </component> <component id="f1a03" class="javax.swing.JTextField" binding="tfFile"> <constraints> <grid row="7" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false"> <preferred-size width="150" height="-1"/> </grid> </constraints> <properties> <editable value="false"/> </properties> </component> <component id="4d2b1" class="javax.swing.JLabel"> <constraints> <grid row="7" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/> </constraints> <properties> <text value="Datei:"/> </properties> </component> <component id="93929" class="javax.swing.JSeparator"> <constraints> <grid row="8" column="1" row-span="1" col-span="1" vsize-policy="6" hsize-policy="6" anchor="0" fill="3" indent="0" use-parent-layout="false"/> </constraints> <properties/> </component> <component id="6fa8" class="javax.swing.JTextField" binding="tfHash"> <constraints> <grid row="9" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false"> <preferred-size width="150" height="-1"/> </grid> </constraints> <properties> <editable value="false"/> </properties> </component> <component id="14985" class="javax.swing.JLabel"> <constraints> <grid row="9" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/> </constraints> <properties> <text value="SHA256-Hash:"/> </properties> </component> <component id="287a2" class="javax.swing.JSeparator"> <constraints> <grid row="10" column="1" row-span="1" col-span="1" vsize-policy="6" hsize-policy="6" anchor="0" fill="3" indent="0" use-parent-layout="false"/> </constraints> <properties/> </component> <component id="3e91c" class="javax.swing.JTextField" binding="tfFileLength"> <constraints> <grid row="11" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false"> <preferred-size width="150" height="-1"/> </grid> </constraints> <properties> <editable value="false"/> </properties> </component> <component id="95cad" class="javax.swing.JLabel"> <constraints> <grid row="11" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/> </constraints> <properties> <text value="Dateigroesse:"/> </properties> </component> <component id="75695" class="javax.swing.JSeparator"> <constraints> <grid row="12" column="1" row-span="1" col-span="1" vsize-policy="6" hsize-policy="6" anchor="0" fill="3" indent="0" use-parent-layout="false"/> </constraints> <properties/> </component> <component id="2fb3a" class="javax.swing.JTextField" binding="tfProofFile"> <constraints> <grid row="15" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false"> <preferred-size width="150" height="-1"/> </grid> </constraints> <properties> <editable value="false"/> </properties> </component> <component id="6b8af" class="javax.swing.JLabel"> <constraints> <grid row="15" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/> </constraints> <properties> <text value="Timestampdatei:"/> </properties> </component> <component id="c2ef" class="javax.swing.JSeparator"> <constraints> <grid row="16" column="1" row-span="1" col-span="1" vsize-policy="6" hsize-policy="6" anchor="0" fill="3" indent="0" use-parent-layout="false"/> </constraints> <properties/> </component> <component id="f9349" class="javax.swing.JTextField" binding="tfTxId"> <constraints> <grid row="17" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false"> <preferred-size width="150" height="-1"/> </grid> </constraints> <properties> <editable value="false"/> <enabled value="true"/> </properties> </component> <component id="d1077" class="javax.swing.JLabel"> <constraints> <grid row="17" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/> </constraints> <properties> <text value="TxId:"/> </properties> </component> <component id="49fa" class="javax.swing.JSeparator"> <constraints> <grid row="18" column="1" row-span="1" col-span="1" vsize-policy="6" hsize-policy="6" anchor="0" fill="3" indent="0" use-parent-layout="false"/> </constraints> <properties/> </component> <component id="999d5" class="javax.swing.JLabel"> <constraints> <grid row="19" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/> </constraints> <properties> <text value="Status:"/> </properties> </component> <component id="82258" class="javax.swing.JButton" binding="btnClose"> <constraints> <grid row="21" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/> </constraints> <properties> <text value="Ende des Programms"/> </properties> </component> <component id="6159d" class="javax.swing.JSeparator"> <constraints> <grid row="2" column="1" row-span="1" col-span="1" vsize-policy="6" hsize-policy="6" anchor="0" fill="3" indent="0" use-parent-layout="false"/> </constraints> <properties/> </component> <component id="7b715" class="javax.swing.JButton" binding="btnStartKit"> <constraints> <grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/> </constraints> <properties> <text value="starte das Wallet"/> </properties> </component> <component id="f1b5f" class="javax.swing.JTextField" binding="tfBalance"> <constraints> <grid row="5" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false"> <preferred-size width="150" height="-1"/> </grid> </constraints> <properties> <editable value="false"/> </properties> </component> <component id="9855f" class="javax.swing.JLabel"> <constraints> <grid row="5" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/> </constraints> <properties> <text value="Guthaben:"/> </properties> </component> <component id="6516f" class="javax.swing.JSeparator"> <constraints> <grid row="6" column="1" row-span="1" col-span="1" vsize-policy="6" hsize-policy="6" anchor="0" fill="3" indent="0" use-parent-layout="false"/> </constraints> <properties/> </component> <component id="18a4f" class="javax.swing.JSeparator"> <constraints> <grid row="20" column="1" row-span="1" col-span="1" vsize-policy="6" hsize-policy="6" anchor="0" fill="3" indent="0" use-parent-layout="false"/> </constraints> <properties/> </component> <component id="e8ac2" class="javax.swing.JTextField" binding="tfStatus"> <constraints> <grid row="19" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false"> <preferred-size width="150" height="-1"/> </grid> </constraints> <properties> <editable value="false"/> </properties> </component> <component id="e9f88" class="javax.swing.JProgressBar" binding="progressBarWait"> <constraints> <grid row="1" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"> <minimum-size width="-1" height="20"/> </grid> </constraints> <properties/> </component> <component id="8bb9f" class="javax.swing.JTextField" binding="tfFileDate"> <constraints> <grid row="13" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false"> <preferred-size width="150" height="-1"/> </grid> </constraints> <properties> <editable value="false"/> </properties> </component> <component id="58e4e" class="javax.swing.JSeparator"> <constraints> <grid row="14" column="1" row-span="1" col-span="1" vsize-policy="6" hsize-policy="6" anchor="0" fill="3" indent="0" use-parent-layout="false"/> </constraints> <properties/> </component> <component id="da67" class="javax.swing.JLabel"> <constraints> <grid row="13" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/> </constraints> <properties> <text value="Dateidatum:"/> </properties> </component> </children> </grid> </form> |