以太坊的Java客户端使用

转载 2017年06月06日 17:33:57

准备工作

  1. 已经安装好以太坊客户端或是以太坊集群
  2. 安装jdk8开发环境,web3j需要在java 8的环境才能运行

引入jar包

<dependency>
  <groupId>org.web3j</groupId>
  <artifactId>core</artifactId>
  <version>2.2.1</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

连接以太坊客户端

使用web3j的api连接

public class Web3JClient {

    private static String ip = "http://ip地址:8545/";

    private Web3JClient(){}

    private volatile static Web3j web3j;

    public static Web3j getClient(){
        if(web3j==null){
            synchronized (Web3JClient.class){
                if(web3j==null){
                    web3j = Web3j.build(new HttpService(ip));
                }
            }
        }
        return web3j;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

使用Parity的api连接

public class ParityClient {

    private static String ip = "http://ip地址:8545/";

    private ParityClient(){}

    private static class ClientHolder{
        private static final Parity parity = Parity.build(new HttpService(ip));
    }

    public static final  Parity getParity(){
        return ClientHolder.parity;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

账户操作

1.创建账户POJO

public class AccountInfo {

    private String userName;

    private String phone;

    private String address;

    private String school;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getSchool() {
        return school;
    }

    public void setSchool(String school) {
        this.school = school;
    }
}
  • 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
  • 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

2.账户相关操作

public class Account {

    private static  Parity parity = ParityClient.getParity();

    private static Web3j web3j = Web3JClient.getClient();

    /**
     * Life
     * Like this
     * Like that
     * Also
     * It's not the same with you think
     * @Author lzh
     *
     */
    public List<String> getAccountlist(){

        try{
            return  parity.personalListAccounts().send().getAccountIds();
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    public String createAccount(String accountName,String password,AccountInfo accountInfo){
        try {
            NewAccountIdentifier newAccountIdentifier = parity.personalNewAccount(password).send();
            if(newAccountIdentifier!=null){
                String accountId = newAccountIdentifier.getAccountId();
                parity.personalSetAccountName(accountId,accountName);

                Map<String,Object> account = new HashMap<String,Object>();
                account.put(accountId,accountInfo);
                parity.personalSetAccountMeta(accountId,account);

                return  accountId;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public PersonalAccountsInfo.AccountsInfo getAccountInfo(String accountId){

        try{
            PersonalAccountsInfo personalAccountsInfo = parity.personalAccountsInfo().send();

            return  personalAccountsInfo.getAccountsInfo().get(accountId);
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    public BigInteger getBalance(String accountId){
        try {
            DefaultBlockParameter defaultBlockParameter = new DefaultBlockParameterNumber(58);
            EthGetBalance ethGetBalance =  parity.ethGetBalance(accountId,defaultBlockParameter).send();
            if(ethGetBalance!=null){
                return ethGetBalance.getBalance();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
}
  • 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
  • 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

账户测试

public class AccountTest {

    public static void main(String args[]) {
        getBalance();
    }

    public static void getBalance(){
        Account account = new Account();
        BigInteger ba = account.getBalance("0xcee1086eabd4cac10f6658eeffcdc66ad7565450");
        System.out.print(ba);
    }

    public static  void queryAccount(){
        Account account = new Account();
        List<String> accounts = account.getAccountlist();
        for(String accountId:accounts){
            System.out.println(accountId);
        }

    }

    public void createAccount(){
            Account account = new Account();
            AccountInfo accountInfo = new AccountInfo();
            accountInfo.setPhone("229787499");
            accountInfo.setAddress("世宁大厦");
            accountInfo.setSchool("buaa");
            accountInfo.setUserName("lzh");
            String accountId = account.createAccount("lzh","123456",accountInfo);
            System.out.println("注册账户成功:"+accountId);
//        PersonalAccountsInfo.AccountsInfo accountsInfo = account.getAccountInfo("0xad7bbca86e02e503076b06931e05938e51e49fb9");
//        System.out.println(accountsInfo.toString());
    }
}
  • 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
  • 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

交易操作

public class Trade {

    private static final Logger logger = LoggerFactory.getLogger(Trade.class);

    private static BigInteger nonce = new BigInteger("0");

    private static BigInteger gasPrice = new BigInteger("1");

    private static BigInteger gasLimit = new BigInteger("50");

    private Parity parity = ParityClient.getParity();

    public boolean trasfer(String accountId,String passsword,String toAccountId, BigDecimal amount)  {

        Transaction transaction = Transaction.createEtherTransaction(accountId,null,null,null,toAccountId,amount.toBigInteger());
        try{
            EthSendTransaction ethSendTransaction =parity.personalSignAndSendTransaction(transaction,passsword).send();
            if(ethSendTransaction!=null){
                String tradeHash = ethSendTransaction.getTransactionHash();
                logger.info("账户:[{}]转账到账户:[{}],交易hash:[{}]",accountId,toAccountId,tradeHash);
            }
        }catch (Exception e){
            logger.error("账户:[{}]交易失败!",accountId,e);
        }
        return false;
    }

}
  • 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
  • 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

交易测试

public class TradeTest {

    public static void main(String args[]){
        Trade trade = new Trade();
        trade.trasfer("账户a的hash码","abc123","账户b的hash码",new BigDecimal(100));
    }
}

轻量级的以太坊开发库for java发布了 web3j lightweight Ethereum library for Java applications v1.0 release

轻量级的以太坊开发库for java发布了 web3j lightweight Ethereum library for Java applications v1.0 release,java应用就可...
  • fidelhl
  • fidelhl
  • 2016-11-10 09:41:48
  • 24204

【区块链】以太坊 web3j for java 使用 - 部署和调用合约 <3>

web3j 部署合约环境:mac os & android studio官网:here以太坊 web3j for java 配置和使用: here以太坊 web3j for java 使用 - 为用户...
  • loy_184548
  • loy_184548
  • 2017-11-29 17:53:30
  • 5295

以太坊学习之Java开发框架web3j的使用---部署合约

智能合约名以 HelloContract 为例 1,编译合约源码 命令:solc HelloContract.sol –bin –abi –optimize -o outputPath...
  • chenyingjie_Android
  • chenyingjie_Android
  • 2017-10-18 16:01:04
  • 3699

以太坊智能合约投票示例Java模拟实现

使用java语言模拟实现以太坊智能合约执行过程 package contract; import java.util.ArrayList; import java.util.Arrays; imp...
  • HaibLee
  • HaibLee
  • 2018-01-05 20:01:34
  • 852

以太坊连载(十):以太坊GO、JAVA、PYTHON、RUBY、JS客户端介绍

go-ethereum go-ethereum客户端通常被称为geth,它是个命令行界面,执行在Go上实现的完整以太坊节点。通过安装和运行geth,可以参与到以太坊前台实时网络并进行以下操作: ...
  • waysoflife
  • waysoflife
  • 2017-06-20 09:08:02
  • 2869

以太坊开发--geth的使用入门

geth的全称是Go-ethereum,是一个以太坊客户端,用go语言编写,应该是目前最常用的客户端。当然以太坊客户端还有用C++,Ruby,Python,Java等其他多种语言编写的,不同类型的客户...
  • m0_37327416
  • m0_37327416
  • 2017-06-06 17:32:50
  • 6537

以太坊连载(六):以太坊客户端的选择与安装

选择客户端 为什么有多个以太坊客户端? 以太坊客户端与Java虚拟机和.NET运行环境类似,能够让你在电脑上运行“以太坊程序”。以太坊客户端按照书面说明(黄皮书)执行,特意设计为可以彼此协...
  • waysoflife
  • waysoflife
  • 2017-06-20 08:45:32
  • 1886

java开源区块链Blockchain相关项目介绍

对于比特币、莱特币、以太币等加密数字货币大家应该不陌生了,最近一年ico在国内也是备受关注和争议。抛开这些单纯从技术角度看基于java的开源blockchain相关的项目的实现。我们知道比特币很多是用...
  • mpegfour
  • mpegfour
  • 2017-12-07 17:18:02
  • 5884

区块链开发(二)部署和运行第一个以太坊智能合约

区块链开发(二)部署并运行第一个以太坊智能合约 李赫2016年8月10日         网络上不少部署智能合约的文章,但是都有一个共同的特点,就是采用命令行的方式来部署,先是建立SOLC的编译环境,...
  • sportshark
  • sportshark
  • 2016-08-22 08:50:26
  • 22963

ETH 基础篇 JAVA Web3j 智能合约

架构springboot   这里使用web3j当前eth官方推荐的集成jdk来做说明!当然你也可以使用它最底层的rpc方案来编写(官网也有说明)! 这里做个总结 第一步:先引入jdk [mav...
  • xf191
  • xf191
  • 2018-01-30 14:30:40
  • 1785
收藏助手
不良信息举报
您举报文章:以太坊的Java客户端使用
举报原因:
原因补充:

(最多只允许输入30个字)