java玩转区块链-基础篇--账户
- java环境配置
- 基础概念
- 账户
- maven包引用
- 创建账户代码
- 代码解释
- (1)
- (2)
- (3)
- (4)
可以不让搞,但是不允许你不会
java环境配置
- jdk版本,jdk1.8+;
- IDE环境,ideas;
- 依赖包,web3;
- 区块链网路,开发网,Ganache;
基础概念
区块链网络: 提供区块链交易的网络,测试网和正式网由以太坊提供,开发网络可以本地安装,ganache,Hardhat是两个可以本地安装的区块链服务器,ganache是本教程使用的开发区块链服务器。
web3:与区块链进行交互的网络协议,web3目前有python,nodejs,java,typeScript等语言实现
账户:区块链上的一个token
钱包:管理用户拥有token的dapp
账户
区块链中所有的资源都是token,这些token就是我们所谓的账户。账户分为两类:
- 外部拥有的帐户,由私钥控制并且没有与之关联的代码
- 合约账户,由其合约代码控制并具有与其关联的代码
每个账户由 余额、nonce、storageRoot 和 codeHash 等信息组成的状态,并由一个 20 字节的地址标识。
ganache(不清楚ganache安装的请参考环境搭建)上查看账户信息方式如下。
图中(1)是账户的地址(token),(2)点击查看具体信息。
图中privateKey为私钥。
区块链上只有token信息没有归属人信息,区块链并不知道这个token是谁的资产,所以已经拥有了token资产的同学看紧自己的钱袋子,不能把privateKey泄漏给其他人。
maven包引用
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.web3j</groupId>
<artifactId>core</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.web3j/web3j-unit -->
<dependency>
<groupId>org.web3j</groupId>
<artifactId>web3j-unit</artifactId>
<version>4.8.1</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.web3j</groupId>
<artifactId>web3j-maven-plugin</artifactId>
<version>4.6.5</version>
<configuration>
<soliditySourceFiles/>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>central</id>
<name>central</name>
<url>https://maven.aliyun.com/repository/central</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>jcenter</id>
<name>jcenter</name>
<url>http://jcenter.bintray.com/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>maven-net-cn</id>
<name>Maven China Mirror</name>
<url>https://dl.bintray.com/ethereum/maven</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
创建账户代码
package com.eth.account;
import org.web3j.crypto.Credentials;
import org.web3j.crypto.WalletUtils;
import org.web3j.model.DocumentRegistry;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.http.HttpService;
import org.web3j.tx.gas.StaticGasProvider;
import java.io.File;
import java.math.BigInteger;
public class CreateAccount {
public static void main(String[] args) throws Exception {
String walletPassword = "mypassword"; //(1)
String walletDirectory = "/Users/beijixiongzzj/Documents"; //(2)
String filename = WalletUtils.generateNewWalletFile(walletPassword, new File(walletDirectory)); //(3)
System.out.println("生成密钥文件:" + walletDirectory + "/" + filename);
System.out.println("开始解析密钥->:");
Credentials credentials = WalletUtils.loadCredentials(walletPassword, walletDirectory + "/" + filename); //(4)
System.out.println("Account address: " + credentials.getAddress()); //(5)
System.out.println("Account private key: " + credentials.getEcKeyPair().getPrivateKey().toString(16)); //(6)
System.out.println("Account public key: " + credentials.getEcKeyPair().getPublicKey().toString(16)); //(7)
}
}
执行结果
生成密钥文件:/Users/beijixiongzzj/Documents/UTC–2021-10-01T12-33-54.33000000Z–a8a97958d136c1656b9dbd83f28c8238d97265ba.json
开始解析密钥->:
Account address: 0xa8a97958d136c1656b9dbd83f28c8238d97265ba
Account private key: ca448f923bd5886ce1213b5ba831580324b9b56422199aa3486db5f04f1f4627
Account public key: 29627a520b60b0c2c61f0896199bbbe711063c4027204325d14c5f48d8087fedbff3a6408a4f7aa154801fa13a85c1b726fdd5bf04100c7b765f861d106188ba
代码解释
以下为代码块中注释的代码行的解释
(1)
定义一个变量“walletPassword“,这个密码用户为生成的密钥文件进行加密
(2)
定义一个变量,代表的是“/Users/beijixiongzzj/Documents“这个目录,是生成加密文件存在的本地目录
(3)
WalletUtils.generateNewWalletFile该api用户生成一个密钥文件,返回的是生成的密钥文件的地址
(4)
加载密钥文件解析出公钥私钥