以太坊的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
  • 20040

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

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

以太坊的Java客户端使用

准备工作 已经安装好以太坊客户端或是以太坊集群 安装jdk8开发环境,web3j需要在java 8的环境才能运行 引入jar包 org.web3j core 2.2.1 连接以太坊客户端使...
  • jeffsmish
  • jeffsmish
  • 2017年06月01日 15:03
  • 2375

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

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

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

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

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

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

以太坊智能合约编程之菜鸟教程

手把手带你走上智能合约编程之路 译注:原文首发于ConsenSys开发者博客,原作者为Eva以及ConsenSys的开发团队。如果您想要获取更多及时信息,可以访问ConsenSys首页点击左下角New...
  • fidelhl
  • fidelhl
  • 2016年01月08日 11:55
  • 29705

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

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

区块链技术(一):Truffle开发入门

蓝莲花 2016-05-02 14:52 发布在 技术指南 0 658 文章摘要图: 以太坊是区块链开发领域最好的编程平台,而truffle是以太坊(Ethereum)最受欢迎的一个开发框架,这是...
  • fidelhl
  • fidelhl
  • 2016年05月03日 08:37
  • 12209

区块链编程一翻译篇<一>:web3j介绍

web3jweb3j是一个轻量级、反应式、类型安全的java和android的类库,用于连接以太坊网络的客户端。 开发者不用开发额外的整合代码,在以太坊区块链平台上工作。 Java and t...
  • jeffsmish
  • jeffsmish
  • 2017年05月28日 08:48
  • 3706
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:以太坊的Java客户端使用
举报原因:
原因补充:

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