{"id":17613,"date":"2021-10-23T13:03:30","date_gmt":"2021-10-23T11:03:30","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=17613"},"modified":"2024-04-26T18:11:51","modified_gmt":"2024-04-26T16:11:51","slug":"eth-kontostand-via-web3j-und-infura-mit-java-in-5-schritten-abfragen","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=17613","title":{"rendered":"ETH-Kontostand via Web3j und Infura mit Java in 5 Schritten abfragen"},"content":{"rendered":"<p>Am 11. November letzten Jahres f\u00fcrte der Ausfall von <a href=\"https:\/\/www.infura.io\/\" rel=\"noopener\" target=\"_blank\">Infura<\/a> dazu, dass viele zentrale B\u00f6rsen die Abhebung von ETH und ERC20-Token gestoppt hatten. Zudem lie\u00dfen sich Metamask, Uniswap und auch andere Anwendungen auf Ethereum nicht mehr nutzen. Infura scheint ein beliebter Dienstleister f\u00fcr Ethereum Nodes zu sein, auf den sich nicht nur kleinere Unternehmen und Projekte verlassen, sondern auch milliardenschwere B\u00f6rsen wie <a href=\"https:\/\/www.binance.com\/en\" rel=\"noopener\" target=\"_blank\">Binance<\/a>.<\/p>\n<p>F\u00fcr dieses Projekt soll dennoch mal die Infura-API verwendet werden, um den Kontostand einer ETH-Adresse zu ermitteln. Mit dem <a href=\"https:\/\/github.com\/hyperledger\/web3j\" rel=\"noopener\" target=\"_blank\">web3j<\/a> Framework ist das auch in Java realisierbar. Hier der Architektur Aufbau:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/10\/Incurable-Java-web3j-scaled.jpg\" alt=\"\" width=\"2560\" height=\"1919\" class=\"aligncenter size-full wp-image-17614\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/10\/Incurable-Java-web3j-scaled.jpg 2560w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/10\/Incurable-Java-web3j-300x225.jpg 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/10\/Incurable-Java-web3j-1024x768.jpg 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/10\/Incurable-Java-web3j-768x576.jpg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/10\/Incurable-Java-web3j-1536x1151.jpg 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/10\/Incurable-Java-web3j-2048x1535.jpg 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/> <\/p>\n<p>Wir starten (wie immer) mit einem JUnit 5 Test: <!--more--><\/p>\n<p>Wir verwenden dazu meine &#8222;Buy my a coffee Ethereum (ETH)&#8220; Adresse <strong>0x829F9e57c29ab683E964c76160B7B0BaB2727dD2<\/strong> und meine ProjektID von Infura: <strong>eaa4f4c6b7ce453cba56b73b5d558bdc<\/strong> um schnelle Ergebnisse zu erhalten.<\/p>\n<pre class=\"lang:java decode:true \" >\r\n@Test\r\nvoid testenDesKontostandAufDemMainnet() throws Exception {\r\n\r\n\tString[] parmeter = { \"-n\", \"mainnet\", \"-p\", PROJEKT_ID, \"-a\", MAINNET_ADRESSE };\r\n\tKontostand.main(parmeter);\r\n}<\/pre>\n<p>Wir erwarten keine Fehler, nur eine Log-Ausgabe in der Form (im CSV Format: Ether, Kommentar, ETH-Adresse, Kommentar, Netz):<\/p>\n<pre class=\"lang:default decode:true \" >\r\n[INFO ] 2021-10-20 23:35:41,100 Kontostand.call() - 0.004517710000000000 Ether, auf Adresse, 0x829F9e57c29ab683E964c76160B7B0BaB2727dD2, im Netz, mainnet<\/pre>\n<p>Was m\u00fcssen wir tun?<br \/>\n<strong>1.<\/strong> die web3j Abh\u00e4ngigkeit in der pom.xml eintragen<\/p>\n<pre class=\"lang:xhtml decode:true \" >\r\n&lt;dependency&gt;\r\n\t&lt;groupId&gt;org.web3j&lt;\/groupId&gt;\r\n\t&lt;artifactId&gt;core&lt;\/artifactId&gt;\r\n\t&lt;version&gt;5.0.0&lt;\/version&gt;\r\n&lt;\/dependency&gt;<\/pre>\n<p><strong>2.<\/strong> die URL zusammenstellen aus dem Netzwerkname und Projekt ID.<\/p>\n<p>final String ethUrl = &#8222;https:\/\/&#8220; + netzwerkName + &#8222;.infura.io\/v3\/&#8220; + projektId;<\/p>\n<p><strong>3.<\/strong> eine web3j Instanz erstellen mit der erstellten ethUrl <\/p>\n<p>Web3j web3jClient = Web3j.build(new HttpService(ethUrl));<\/p>\n<p><strong>4.<\/strong> eine asyncrone Abfrage an Infura senden, mit Timeout von 10 Sekunden und der Adresse<\/p>\n<p>EthGetBalance kontoAntwort = web3jClient.ethGetBalance(ethAdresse, DefaultBlockParameterName.LATEST).sendAsync().get(10, TimeUnit.SECONDS);<\/p>\n<p><strong>5.<\/strong> das Ergebnis auswerten<\/p>\n<p>BigDecimal skalierterStand = new BigDecimal(kontoAntwort.getBalance()).divide(new BigDecimal(1000000000000000000L), 18, RoundingMode.HALF_UP);<\/p>\n<p>Das ist schon alles. Hier die ganze Klasse, mit Auswertung der Kommandozeilen Parameter mit Picoli:<\/p>\n<pre class=\"lang:java decode:true \" >package de.wenzlaff.twetherscan;\r\n\r\nimport java.math.BigDecimal;\r\nimport java.math.RoundingMode;\r\nimport java.util.concurrent.Callable;\r\nimport java.util.concurrent.TimeUnit;\r\n\r\nimport org.apache.logging.log4j.LogManager;\r\nimport org.apache.logging.log4j.Logger;\r\nimport org.web3j.protocol.Web3j;\r\nimport org.web3j.protocol.core.DefaultBlockParameterName;\r\nimport org.web3j.protocol.core.methods.response.EthGetBalance;\r\nimport org.web3j.protocol.http.HttpService;\r\n\r\nimport picocli.CommandLine;\r\nimport picocli.CommandLine.Command;\r\nimport picocli.CommandLine.Option;\r\n\r\n\/**\r\n * Abfragen eines Kontostands \u00fcber\r\n * \r\n * https:\/\/infura.io\/dashboard\/ethereum\/\r\n * \r\n * mit Web3J.\r\n * \r\n * https:\/\/etherscan.io\/address\/0x829f9e57c29ab683e964c76160b7b0bab2727dd2\r\n *\r\n * Parameter z,B.\r\n * \r\n * &lt;pre&gt;\r\n * \r\n \r\n\t-n mainnet -p eaa4f4c6b7ce453cba56b73b5d558bdc -a 0x829F9e57c29ab683E964c76160B7B0BaB2727dD2\t\t\r\n\t-n rinkeby -p eaa4f4c6b7ce453cba56b73b5d558bdc -a 0x6f55a676d5862623bd79446133043AEf905718B8\r\n * \r\n * &lt;\/pre&gt;\r\n * \r\n * @author Thomas Wenzlaff\r\n *\/\r\n@Command(name = \"Kontostand\", mixinStandardHelpOptions = true, version = \"Kontostand Version 1.0\", showDefaultValues = true, description = \"Kontostand abfragen\", exitCodeList = {\r\n\t\t\" 0:Successful program execution.\" }, footer = { \"@|fg(green) Thomas Wenzlaff|@\", \"@|fg(red),bold http:\/\/www.wenzlaff.info|@\" })\r\npublic class Kontostand implements Callable&lt;Integer&gt; {\r\n\r\n\tprivate static final Logger LOG = LogManager.getLogger(Kontostand.class);\r\n\r\n\t@Option(names = { \"-n\", \"--netzwerk\" }, required = true, description = \"der Netzwerkname (z.B. mainnet oder rinkeby)\", defaultValue = \"mainnet\")\r\n\tprivate static String netzwerkName;\r\n\r\n\t@Option(names = { \"-p\", \"--projektid\" }, required = true, description = \"die Projekt Id von Influra.io\")\r\n\tprivate static String projektId;\r\n\r\n\t@Option(names = { \"-a\", \"--adresse\" }, required = true, description = \"die Adresse die abgefragt wird\")\r\n\tprivate static String ethAdresse;\r\n\r\n\t@Option(names = { \"-c\", \"--client\" }, description = \"die Web3j Client Info wird ausgegeben\")\r\n\tprivate static boolean isClientVersion;\r\n\r\n\tpublic static void main(String[] args) throws Exception {\r\n\t\tnew CommandLine(new Kontostand()).execute(args);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic Integer call() throws Exception {\r\n\r\n\t\tfinal String ethUrl = \"https:\/\/\" + netzwerkName + \".infura.io\/v3\/\" + projektId;\r\n\r\n\t\tWeb3j web3jClient = getWeb3Client(ethUrl);\r\n\r\n\t\tif (isClientVersion) {\r\n\t\t\tVersion.getClientVersion(web3jClient);\r\n\t\t}\r\n\r\n\t\tEthGetBalance kontoAntwort = web3jClient.ethGetBalance(ethAdresse, DefaultBlockParameterName.LATEST).sendAsync().get(10, TimeUnit.SECONDS);\r\n\r\n\t\tBigDecimal skalierterStand = new BigDecimal(kontoAntwort.getBalance()).divide(new BigDecimal(1000000000000000000L), 18, RoundingMode.HALF_UP);\r\n\r\n\t\tLOG.info(skalierterStand + \" Ether, auf Adresse, \" + ethAdresse + \", im Netz, \" + netzwerkName);\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tpublic Web3j getWeb3Client(String ethUrl) {\r\n\t\treturn Web3j.build(new HttpService(ethUrl));\r\n\t}\r\n}<\/pre>\n<p>Das ganze Projekt gibt es auf <a href=\"https:\/\/gitlab.com\/IT-Berater\/twetherscan\" rel=\"noopener\" target=\"_blank\">GitLab<\/a>. Mal sehen ob sich der Kontostand auf <a href=\"https:\/\/etherscan.io\/address\/0x829f9e57c29ab683e964c76160b7b0bab2727dd2\" rel=\"noopener\" target=\"_blank\">0x829F9e57c29ab683E964c76160B7B0BaB2727dD2<\/a> ver\u00e4ndert. Freue mich \u00fcber jede Ver\u00e4nderung \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Am 11. November letzten Jahres f\u00fcrte der Ausfall von Infura dazu, dass viele zentrale B\u00f6rsen die Abhebung von ETH und ERC20-Token gestoppt hatten. Zudem lie\u00dfen sich Metamask, Uniswap und auch andere Anwendungen auf Ethereum nicht mehr nutzen. Infura scheint ein beliebter Dienstleister f\u00fcr Ethereum Nodes zu sein, auf den sich nicht nur kleinere Unternehmen und &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.wenzlaff.de\/?p=17613\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eETH-Kontostand via Web3j und Infura mit Java in 5 Schritten abfragen\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,1319],"tags":[2424,3496,4990,5053,5054,2178,5055,5048,5056],"class_list":["post-17613","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-blockchain","category-crypto","category-ethereum","category-java-programmierung","category-programmierung","category-sicherheit-2","tag-abfrage","tag-blockchain","tag-eth","tag-infura","tag-infura-io","tag-java","tag-picoli","tag-web3j","tag-web3j-client"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/17613","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=17613"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/17613\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=17613"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=17613"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=17613"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}