{"id":17539,"date":"2021-10-01T09:55:42","date_gmt":"2021-10-01T07:55:42","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=17539"},"modified":"2021-10-01T10:49:54","modified_gmt":"2021-10-01T08:49:54","slug":"java-ethereum-wallet-mit-web3j-erstellen","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=17539","title":{"rendered":"Java Ethereum Wallet mit Web3j erstellen"},"content":{"rendered":"<p><a href=\"https:\/\/docs.web3j.io\/4.8.7\/\" rel=\"noopener\" target=\"_blank\">Web3j<\/a> ist ein sehr modularer und typsichere Library f\u00fcr Java und Android. Viele Module und Funktionen f\u00fcr das einfache arbeiten mit Smart-Contracts und Wallets auf der Ethereum-Blockchain (ETH), stehen bereit. <\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/10\/wenzlaff.de-2021-10-01-um-09.39.43.png\" alt=\"\" width=\"1460\" height=\"690\" class=\"aligncenter size-full wp-image-17545\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/10\/wenzlaff.de-2021-10-01-um-09.39.43.png 1460w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/10\/wenzlaff.de-2021-10-01-um-09.39.43-300x142.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/10\/wenzlaff.de-2021-10-01-um-09.39.43-1024x484.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/10\/wenzlaff.de-2021-10-01-um-09.39.43-768x363.png 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/p>\n<p>Hier nun ein kleines Beispiel, wie mit nur einer Java-Klasse und ein paar Zeilen Code ein eigenes File-Wallet im Json-Format erstellt werden kann. In einem weiteren Beitrag zeige ich dann, wie dieses File-Wallet in MetaMask importiert werden kann.<\/p>\n<p>Folgende Abh\u00e4ngigkeiten sind in der pom.xml einzutragen, <a href=\"http:\/\/blog.wenzlaff.de\/?p=17501\" rel=\"noopener\" target=\"_blank\">Web3j<\/a> und die &#8222;alte&#8220; (alt aber Apache) Json-Lib von Google, obwohl Web3j auch die Jackson Json Lib als transitive Abh\u00e4ngigkeit mitbringt. Es muss ja nicht immer Jackson sein \ud83d\ude09 <!--more--><\/p>\n<pre class=\"lang:xhtml decode:true \" >\r\n                &lt;!-- Zum bearbeiten von Json --&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;com.googlecode.json-simple&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;json-simple&lt;\/artifactId&gt;\r\n\t\t\t&lt;version&gt;1.1.1&lt;\/version&gt;\r\n\t\t&lt;\/dependency&gt;\r\n\t\t&lt;!-- ETH Blockchain WEB3j --&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;org.web3j&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;core&lt;\/artifactId&gt;\r\n\t\t\t&lt;version&gt;4.8.7&lt;\/version&gt;\r\n\t\t&lt;\/dependency&gt;\r\n<\/pre>\n<p>Die LocalWallet Klasse, braucht f\u00fcr den Aufruf nur ein Passwort.<\/p>\n<pre class=\"lang:java decode:true \" >package de.wenzlaff.blockchain;\r\n\r\nimport java.io.File;\r\nimport java.io.FileReader;\r\n\r\nimport org.apache.logging.log4j.LogManager;\r\nimport org.apache.logging.log4j.Logger;\r\nimport org.json.simple.JSONObject;\r\nimport org.json.simple.parser.JSONParser;\r\nimport org.web3j.crypto.WalletUtils;\r\n\r\n\/**\r\n * Erzeugt ein Wallet in einem Json File.\r\n * \r\n * Aufruf: LocalWallet [Passwort]\r\n * \r\n * z.B.\r\n * \r\n * LocalWallet geheim\r\n * \r\n * Erzeugt z.B. solch ein Json File:\r\n * \r\n * &lt;pre&gt;\r\n {\r\n\t\"address\": \"1486df323a85999fb6a540492dc8725c8ecdfb9b\",\r\n\t\"id\": \"12a615ec-1926-4a0c-b6c9-355d525c3fd1\",\r\n\t\"version\": 3,\r\n\t\"crypto\": {\r\n\t\t\"cipher\": \"aes-128-ctr\",\r\n\t\t\"ciphertext\": \"a367817d4cb23e822d4f46ec726dd7717f20f3e19a1b651382bc7b156a2bf306\",\r\n\t\t\"cipherparams\": {\r\n\t\t\t\"iv\": \"f60a43fa2d8a0fc988e430f4f63d70e8\"\r\n\t\t},\r\n\t\t\"kdf\": \"scrypt\",\r\n\t\t\"kdfparams\": {\r\n\t\t\t\"dklen\": 32,\r\n\t\t\t\"n\": 262144,\r\n\t\t\t\"p\": 1,\r\n\t\t\t\"r\": 8,\r\n\t\t\t\"salt\": \"4c9e3b621a9df62fb5e1aaa9323ca6c508908976af0adb4f5680685c13d1bde9\"\r\n\t\t},\r\n\t\t\"mac\": \"248f3ccfcca62b810ef63daef1bec2633c96c657712f75f056e0c9c9e379083a\"\r\n\t}\r\n}\r\n * &lt;\/pre&gt;\r\n * \r\n * Auf die Adresse des erzeugten Wallets aus dem File z.B. \"address\":\r\n * \"8e031f1c47537910fe104936dcd0f77f8a97c6f1\", per MetaMask Guthaben \u00fcberweisen\r\n * \r\n * @author Thomas Wenzlaff\r\n *\/\r\npublic class LocalWallet {\r\n\r\n\tprivate static final Logger LOG = LogManager.getLogger(LocalWallet.class);\r\n\r\n\t\/**\r\n\t * Startet das generieren eines File Wallets\r\n\t * \r\n\t * @param args Passwort\r\n\t * @throws Exception bei Fehlern\r\n\t *\/\r\n\tpublic static void main(String[] args) throws Exception {\r\n\r\n\t\tif (args.length == 0 || args[0].isEmpty()) {\r\n\t\t\tLOG.error(\"Passwort nicht als Programmparameter gesetzt!\");\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tString password = args[0];\r\n\r\n\t\tLocalWallet localWallet = new LocalWallet();\r\n\t\tString jsonWalletFileName = localWallet.createWallet(password);\r\n\t\tLOG.info(\"Erzeugte Wallet Adresse: \" + localWallet.readJsonWallet(jsonWalletFileName).get(\"address\"));\r\n\t}\r\n\r\n\t\/**\r\n\t * Erzeugt das Json Wallet.\r\n\t * \r\n\t * @param password das Passwort\r\n\t * @throws Exception bei Fehlern\r\n\t *\/\r\n\tprivate String createWallet(String password) throws Exception {\r\n\r\n\t\tString generateWalletFileName = WalletUtils.generateNewWalletFile(password, new File(\".\"));\r\n\t\tSystem.out.println(\"Wallet mit Passwort: \" + password + \" in Json Datei: \" + generateWalletFileName + \" erzeugt.\");\r\n\t\treturn generateWalletFileName;\r\n\t}\r\n\r\n\t\/**\r\n\t * Liest eine Json Wallet Datei und gib sie als Json Objekt zur\u00fcck.\r\n\t * \r\n\t * @param walletDateiName der Dateiname\r\n\t * @return das File Wallet als Json\r\n\t *\/\r\n\tprivate JSONObject readJsonWallet(String walletDateiName) {\r\n\r\n\t\tJSONObject wallet = null;\r\n\r\n\t\ttry (FileReader reader = new FileReader(walletDateiName)) {\r\n\t\t\tObject obj = new JSONParser().parse(reader);\r\n\t\t\twallet = (JSONObject) obj;\r\n\t\t} catch (Exception e) {\r\n\t\t\tLOG.error(\"Fehler beim einlesen des Wallets\", e);\r\n\t\t}\r\n\t\treturn wallet;\r\n\t}\r\n}<\/pre>\n<p>Die Musik spielt eigentlich nur in der Zeile 71, wo mit <a href=\"https:\/\/docs.web3j.io\/4.8.7\/transactions\/wallet_files\/\" rel=\"noopener\" target=\"_blank\">createWallet<\/a> und einem Passwort die Json-Wallet angelegt wird. Hier eine Json Beispiel Wallet, nach dieser <a href=\"https:\/\/github.com\/ethereum\/wiki\/wiki\/Web3-Secret-Storage-Definition\" rel=\"noopener\" target=\"_blank\">Spec. mit Testvektoren<\/a>.:<\/p>\n<pre class=\"minimize:true lang:xhtml decode:true \" >{\r\n\t\"address\": \"1486df323a85999fb6a540492dc8725c8ecdfb9b\",\r\n\t\"id\": \"12a615ec-1926-4a0c-b6c9-355d525c3fd1\",\r\n\t\"version\": 3,\r\n\t\"crypto\": {\r\n\t\t\"cipher\": \"aes-128-ctr\",\r\n\t\t\"ciphertext\": \"a367817d4cb23e822d4f46ec726dd7717f20f3e19a1b651382bc7b156a2bf306\",\r\n\t\t\"cipherparams\": {\r\n\t\t\t\"iv\": \"f60a43fa2d8a0fc988e430f4f63d70e8\"\r\n\t\t},\r\n\t\t\"kdf\": \"scrypt\",\r\n\t\t\"kdfparams\": {\r\n\t\t\t\"dklen\": 32,\r\n\t\t\t\"n\": 262144,\r\n\t\t\t\"p\": 1,\r\n\t\t\t\"r\": 8,\r\n\t\t\t\"salt\": \"4c9e3b621a9df62fb5e1aaa9323ca6c508908976af0adb4f5680685c13d1bde9\"\r\n\t\t},\r\n\t\t\"mac\": \"248f3ccfcca62b810ef63daef1bec2633c96c657712f75f056e0c9c9e379083a\"\r\n\t}\r\n}<\/pre>\n<p>Man kann aber auch, mit der eigenen Web3j-Util Funktion leicht, ohne Json die Adresse ermitteln. Dazu kann man den <strong>Credentials<\/strong> Wrapper verwenden, der auch noch einige andere Funktionen mitbringt (get ECKeyPair, Elliptic Curve SECP-256k1 generated key pair.) um z.B. den privaten oder public Key zu ermitteln.<\/p>\n<pre class=\"lang:java decode:true \" >\r\nCredentials credentials = WalletUtils.loadCredentials(password, jsonWalletFileName);\r\nLOG.info(\"Credential: \" + credentials.getAddress());\r\nLOG.info(\"Private Key: \" + credentials.getEcKeyPair().getPrivateKey());\r\nLOG.info(\"Public Key : \" + credentials.getEcKeyPair().getPublicKey());\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Web3j ist ein sehr modularer und typsichere Library f\u00fcr Java und Android. Viele Module und Funktionen f\u00fcr das einfache arbeiten mit Smart-Contracts und Wallets auf der Ethereum-Blockchain (ETH), stehen bereit. Hier nun ein kleines Beispiel, wie mit nur einer Java-Klasse und ein paar Zeilen Code ein eigenes File-Wallet im Json-Format erstellt werden kann. In einem &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.wenzlaff.de\/?p=17539\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eJava Ethereum Wallet mit Web3j erstellen\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[220,5027,4606,5037,3897,79],"tags":[3496,5039,5040,4990,5038,1257,4924,4632,741,4720],"class_list":["post-17539","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-blockchain","category-crypto","category-ethereum","category-java-programmierung","category-programmierung","tag-blockchain","tag-btc-blocknummer-703003","tag-elliptic-curve","tag-eth","tag-file-wallet","tag-json","tag-private","tag-private-key","tag-public-key","tag-wallet"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/17539","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=17539"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/17539\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=17539"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=17539"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=17539"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}