一、简介

上文中我们谈到了在测试环境中创建账户并使用

通过这样的方式 ,我们就可以创建自己的钱包地址,在测试环境中我们使用https://www.rinkeby.io/#faucet给自己充值测试币.

那么我们接下来的工作就是研究ETH的转账,并会在下一篇在讲述,如何使用基于ERC-20智能合约创建自己的Token和基于自己的合约的转账.

二、ETH转账的实现

转账这里存在一些gas的问题,所谓gas我们都知道是转账时需要花费的旷工费。这里我们可以通过gasLimit和gasPrice来调整,当然我们肯定希望gas小,但是gas一味的小,会导致没有人愿意帮我们打包我们得到交易,导致交易最终无法成交,形成一个pending的状态。如果gas给的多,那么交易成交速度会比较快,但是我们花费的钱就会变多。

在之前实现的基础上,我们可以拿到自己创建的钱包,和对应钱包的文件和密码。

方法1

这个方法需要使用自己的节点,目前Infura节点无法进行当前操作,对应的也是创建账户方法1的转账。

毕竟infura无法帮助我们存储钱包文件

// ...

private BigInteger gNonce; //每个账户发起的交易都会自动生成一个交易识别号,这个是一个递增的号码

// ...省略部分代码

try {

EthGetTransactionCount ethGetTransactionCount = admin.ethGetTransactionCount(from, DefaultBlockParameterName.LATEST).sendAsync().get();

BigInteger nonce = ethGetTransactionCount.getTransactionCount();

PersonalUnlockAccount personalUnlockAccount = admin.personalUnlockAccount(from,password).send();

if (personalUnlockAccount == null){

log.error("转账失败,账户地址错误,或者账户密码错误");

return 0;

}

if (gNonce == null){

gNonce = nonce;

}

if (personalUnlockAccount.accountUnlocked())

{

BigInteger gasPrice = Contract.GAS_PRICE;

BigInteger gasLimit = Contract.GAS_LIMIT;

synchronized(WalletService.class) {

Transaction transaction = Transaction.createEtherTransaction(from,nonce,gasPrice,gasLimit,to,amount);

log.info("转账序号:【{}】",gNonce);

gNonce = gNonce.add(new BigInteger("1"));

EthSendTransaction transactionResponse = admin.ethSendTransaction(transaction).sendAsync().get();

if(transactionResponse.hasError()){

String message=transactionResponse.getError().getMessage();

log.error("转账失败,错误信息{}",message);

}else{

String hash=transactionResponse.getTransactionHash();

log.info("转账成功,转账hash = {}",hash);

}

}

}

} catch (InterruptedException | ExecutionException | IOException e) {

log.error("转账失败,失败原因{}",e);

}

这种种方式需要先解锁账户,有一定的安全问题,如果你的节点允许全网访问,会有一些人通过动态扫描以太坊节点,尝试连接这些节点,并通过节点发起资金转账的操作。

如果你在测试中又发现自己的币无意间被转到一下地址,说明你的节点或者操作存在以上问题。

Rinkeby: https://rinkeby.etherscan.io/address/0x7097f41f1c1847d52407c629d0e0ae0fdd24fd58

Ropsten: https://ropsten.etherscan.io/address/0x7097f41F1C1847D52407C629d0E0ae0fDD24fd58

Kovan: https://kovan.etherscan.io/address/0x7097f41F1C1847D52407C629d0E0ae0fDD24fd58

Mainnet: https://etherscan.io/address/0x7097f41F1C1847D52407C629d0E0ae0fDD24fd58

所以这里需要注意不要让你的API端口向全网开放。

这里特别注意一下代码中的 nonce.下边会讲一下它的其他作用。

其实还有还有其他一些类似上面转账的方法,可以自己去研究下。

方法2

这种方式需要使用钱包文件来发起交易。

try {

Credentials credentials = WalletUtils.loadCredentials(password,filePath);

TransactionReceipt transferReceipt = Transfer.sendFunds(web3j, credentials, to,amount, Convert.Unit.WEI).send();

String hash = transferReceipt.getTransactionHash();

log.info("转账成功,转账hash = {}",hash);

} catch (Exception e) {

log.error("转账失败,失败原因{}",e);

}

这种方式相对安全一些,这里需要注意的是一些ETH的最小单位——WEI.

1ETH = 1*10^18 wei;

三、相关问题

1.ETH交易模块的特点

必须按顺序处理事务(具有1的nonce为1的事务必须在具有2的nonce的事务之前处理)

不跳过(具有4的nonce的事务不能包含在块中,直到具有1,2,3的nonce的事务

通过这种方式,网络能够识别交易的重复并强制执行订单(这对于智能合约至关重要)

这也就上文中说过的nonce,

2.如何查看我们转账的状态

我们可以通过转账后拿到的TxHash去https://etherscan.io/查询。

3.如何取消Pending状态转账

上文说到了转账因为gas设置的比较小,可能造成无法成交,一直处于Pending状态。

然后我们可以通过nonce去取消Pending的转账,

我们通过nonce的机制可以得知,我们只要新创建一笔转账,其中nonce和Pending状态的订单的nonce一样就可以替换当前Pending状态得到转账。

那么最好的操作来实现就是发起一笔向自己转账的订单,当然gas我们需要设置得到合理。

转账参考以上两种方法。

4.取消或者取代转账

通过之前3中所提到了,我们可以知道,其实一个交易发出后,被覆盖,代替,取消等操作的几率很小。但是也不是不可能。只要当前交易不被挖矿和包含在区块中,是可以做相关关操作的。

具体操作方法还是和3相似,但是切记不可更改nonce.(具体情况还要和实际相比较,毕竟这种操作实现的概率几乎为0)

四、转账状态查询代码实现

我这里只能查洵成功的和失败的,但是有些转账会查不到,但是不能保证当前转账不存在,或者是pending状态。如果您发现了对应的方法请告知我,谢谢

具体实现

try {

EthGetTransactionReceipt transactionReceipt = web3j.ethGetTransactionReceipt(transactionHash).send();

TransactionReceipt transactionReceipt1 = transactionReceipt.getResult();

if (transactionReceipt1 == null) {

log.warn("转账Hash内容为空,Hash = 【{}】",transactionHash);

}else {

if ("0x1".equals(transactionReceipt1.getStatus())){

log.info("转账成功! Hash = {}",transactionHash)

}

if ("0x0".equals(transactionReceipt1.getStatus())){

log.error("转账失败! Hash = {}",transactionHash)

}

}

} catch (IOException e) {

e.printStackTrace();

}

五、参考文章

Checking or Replacing a TX After it’s Been Sent:https://kb.myetherwallet.com/transactions/check-status-of-ethereum-transaction.html

Cancel pending transactions on Ethereum:https://jakubstefanski.com/post/2017/10/ethereum-cancel-pending-transaction/

Node auto send a lot of transaction after call eth.sendTransaction() in one time:[https://github.com/ethereum/go-ethereum/issues/16691](Node auto send a lot of transaction after call eth.sendTransaction() in one time)

Web3j:https://web3j.readthedocs.io/en/latest/

coldwallet java eth,使用Web3j(JAVA)开发ETH钱包-2相关推荐

  1. 基于Java的Android区块链钱包开发(ETH篇)

    基于Java的Android区块链钱包开发-ETH篇 引言 使用的库 具体代码如下 生成公私钥.地址 查余额.签名转账 引言 首先要生成12个助记词,区块链开发之生成12个助记词 使用的库 imple ...

  2. java培训分享:java软件开发可以用哪些软件?

    从事java相关工作的小伙伴应该都有一个习惯,那就是运用软件的方便来达到高效率工作,本期小编为大家介绍的java培训教程就是关于"java软件开发可以用哪些软件?"的内容,来看看下 ...

  3. php 开发 比 java 快_PHP 比 Java 的开发效率高在哪?

    做了几年PHP,最近在转Java,已经用Java做了半个互联网项目的人强答一下. 个人认为,PHP开发效率高主要是因为弱类型特性和自带强力函数库的原因. Java有太多的条条框框,对于我这种刚学的人来 ...

  4. JAVA编程TXT文件_java开发之读写txt文件操作的实现

    项目结构: 运行效果: ======================================================== 下面是代码部分: ====================== ...

  5. Java新手看招 常用开发工具介绍

    Java新手看招 常用开发工具介绍 Java的应用越来越广泛,学习Java的人也越来越多.学过程序设计的人知道,使用Basic进行程序设计,可以使用QBasic.Visual Basic等开发工具:使 ...

  6. Ubuntu开发Java教程_Ubuntu下Java环境的搭建基础教程

    安装 打开终端:输入命令: sudo apt-get install sun-java6-jdk 提示:安装过程中需要你回答是否同意使用协议(终端中红蓝色的提示界面),此时按tab键至OK,再按回车即 ...

  7. java ug二次开发_使用Java进行UG二次开发:简单的例子(上) | 学步园

    最近因为要进行TeamCenter二次开发(胖客户端定制),所有要开始研究Java了.因此突发奇想为什么不能使用Java进行二次开发呢?现在对UG进行的开发以C/C++应用为主.大多数使用的是原来的U ...

  8. 【Java Web后台实验与开发】ServletHTTPRequest笔记

    文章目录 Servlet: HTTP: Request: 案例:用户登录 Servlet: 1. 概念 2. 步骤 3. 执行原理 4. 生命周期 5. Servlet3.0 注解配置 6. Serv ...

  9. 写给java初学者,从零开始学习java开发的完整学习路线

    要问编程王者是谁?自然是非java莫属!发展了20多年,学习java的人络绎不绝.不管是有计算机基础还是没有基础,都想学习这门前途无量的技术.这时候有人担心了,零基础该怎么学java呢?会不会困难重重 ...

  10. web开发的java语言步骤_java web开发入门一(servlet和jsp)基于eclispe

    servlet 用java语言开发动态资源网站的技术,在doGet方法中拼接显示html,在doPost方法中提交数据.类似于.net的ashx技术. servlet生成的class文件存放在tomc ...

最新文章

  1. 22种代码坏味道及重构手段
  2. java中的Native方法
  3. go语言基础到提高(3)-变量
  4. Numpy数组的保存与读取方法
  5. Android 通讯录学习笔记之——目标:调用系统通讯录的编辑功能
  6. 天津理工计算机通信工程学院,2018年天津理工大学计算机与通信工程学院811信号与系统考研仿真模拟五套题...
  7. ZABBIX 3.2.7 (源码包)安装部署
  8. 《基于MFC的OpenGL编程》Part 3 Drawing Simple 2D Shapes
  9. 参考文献空格怎么空_参考文献中的标点符号后要不要加空格
  10. 考研--线性代数辅导讲义(第一章行列式 第二章矩阵)
  11. 【Web渗透测试】—Web漏洞
  12. 51单片机之DS18B20
  13. matlab神经网络原理应用实例pdf,MATLAB神经网络原理与实例精解
  14. c语言作业朱鸣华,C语言程序设计习题解析与上机指导 第3版
  15. 计算机用户密码最长使用期限,电脑Win10系统强制用户定期更新密码的方法
  16. 路由器配置 IP 地址
  17. MySQL --- 函数大全3
  18. 中国石油大学《微观经济学》第一次在线作业
  19. Swift 3.0中GCD的常用方法
  20. django2.0 快速实现注册

热门文章

  1. 微位科技李子阳:哈耶克—未来的价值单位
  2. 计算机上分辨率怎么设置在哪里设置方法,windows7如何设置分辨率_windows7设置分辨率的方法...
  3. 信创办公--基于WPS的Word最佳实践系列(页眉页脚的设置)
  4. Pdfarranger:开源的 PDF 分割和合并工具
  5. Qt 确认对话框(确定/取消)
  6. Hadoop的容错性
  7. lr常见问题汇总(持续更新版)
  8. python 操作微信小程序数据库 实现批量修改
  9. php 中文字,完善解决截取中文汉字不乱码-PHP字符串函数(支持utf8、GBK、GB2312)
  10. VASP笔记之:计算德拜温度,杨氏模量,弹性矩阵