java玩转区块链-基础篇-账户

Posted 链霓裳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java玩转区块链-基础篇-账户相关的知识,希望对你有一定的参考价值。

可以不让搞,但是不允许你不会

java环境配置

  1. jdk版本,jdk1.8+;
  2. IDE环境,ideas;
  3. 依赖包,web3
  4. 区块链网路,开发网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)

加载密钥文件解析出公钥私钥

java玩转区块链-基础篇-环境搭建

java玩转区块链-基础篇-solidity语法-基础类型

以上是关于java玩转区块链-基础篇-账户的主要内容,如果未能解决你的问题,请参考以下文章

java玩转区块链-基础篇-solidity语法-基础类型

区块链DAPP 开发入门 代码实现 场景应用

区块链基础知识之账户密钥地址,基于椭圆曲线的数字账户

我的区块链理解

搭建区块链私链

谈谈我对区块链的理解(基础篇)