主页 > 下载安卓版imtoken钱包 > 冷钱包 java eth
冷钱包 java eth
一、简介
上面我们讲了在测试环境下创建账号并使用
这样我们就可以创建自己的钱包地址,在测试环境中我们使用#faucet给自己充值测试币。
那么我们接下来的工作就是研究ETH的转账,我们将在下一篇文章中介绍如何使用ERC-20智能合约创建自己的Token并基于自己的合约进行转账。
2. ETH转账的实现
传输中存在一些气体问题。 我们都知道,所谓gas就是转账时需要花费的旷工费。 这里我们可以通过gasLimit和gasPrice进行调整。 当然,我们肯定希望gas小,但是如果gas一味的小,没人愿意帮我们打包拿到交易,导致交易最终无法完成,形成pending状态. 如果给更多的 gas,交易会更快完成,但我们会花更多的钱。
在前面实现的基础上,我们可以得到我们创建的钱包,以及钱包对应的文件和密码。
方法一
该方法需要使用自己的节点。 目前Infura节点无法进行当前操作,对应转账创建方式一。
毕竟infura不能帮我们存储钱包文件
//...
私有 BigInteger gNonce; //每个账户发起的交易都会自动生成一个交易标识号,是一个递增的编号
// ...省略部分代码
尝试 {
EthGetTransactionCount ethGetTransactionCount = admin.ethGetTransactionCount(来自, DefaultBlockParameterName.LATEST).sendAsync().get();
BigInteger nonce = ethGetTransactionCount.getTransactionCount();
PersonalUnlockAccount personalUnlockAccount = admin.personalUnlockAccount(from,password).send();
如果(personalUnlockAccount == null){
log.error("转账失败,账户地址错误,或账户密码错误");
返回 0;
}
如果(gNonce == null){
gNonce = 随机数;
}
如果(personalUnlockAccount.accountUnlocked())
{
BigInteger gasPrice = Contract.GAS_PRICE;
BigInteger gasLimit = Contract.GAS_LIMIT;
同步(WalletService.class){
交易 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();
如果(transactionResponse.hasError()){
字符串消息=交易响应。 得到错误()。 获取消息();
log.error("传输失败,错误信息{}", message);
}别的{
字符串哈希 = transactionResponse。 getTransactionHash();
log.info("转账成功,转账hash = {}", hash);
}
}
}
} catch (InterruptedException | ExecutionException | IOException e) {
log.error("转账失败,失败原因{}", e);
}
该方法需要先解锁账户,存在一定的安全问题。 如果你的节点允许访问全网,有人会动态扫描以太坊节点,尝试连接到这些节点,并通过该节点发起转账操作。
如果您在测试过程中发现您的币不慎被转入以下地址,则说明您的节点或操作存在上述问题。
林克比:
罗普斯滕:
科万:
主网:
所以这里需要注意不要对全网开放你的API端口。
请特别注意此处代码中的随机数。 我将在下面谈论它的其他功能。
其实还有其他类似上述转账方式的方法,大家可以自行研究。
方法二
此方法需要使用钱包文件来发起交易。
尝试 {
凭据凭据= WalletUtils.loadCredentials(密码,文件路径);
TransactionReceipt transferReceipt = Transfer.sendFunds(web3j, credentials, to,amount, Convert.Unit.WEI).send();
字符串哈希 = transferReceipt。 getTransactionHash();
log.info("转账成功,转账hash = {}", hash);
} 赶上(异常 e){
log.error("转账失败,失败原因{}", e);
}
这种方法相对安全。 这里需要注意的是ETH的最小单位——WEI。
1ETH = 1*10^18 wei;
三、相关问题
一、ETH交易模块特点
交易必须按顺序处理(随机数为1的交易必须在随机数为2的交易之前处理)
不要跳过(随机数为 4 的交易不能包含在块中,直到随机数为 1,2,3 的交易
通过这种方式,网络能够识别交易的重复并执行订单(这对智能合约至关重要)
这也是上面提到的nonce,
2. 如何查看我们的转账状态
我们可以通过转账后得到的TxHash进行查询。
3.如何取消Pending状态转移
上文提到,由于转账的gas设置比较小,可能会导致交易失败,一直停留在Pending状态。
然后我们可以通过nonce取消待处理的转账,
通过nonce机制我们可以知道,我们只需要创建一个新的transfer,这个nonce和Pending状态的订单的nonce一样,替换当前Pending状态就可以得到transfer。
那么实现的最佳操作就是发起订单给自己转账。 当然,我们需要合理设置gas。
参考以上两种方式进行转账。
4. 取消或取代转让
如上3所述,我们可以知道,一笔交易发出后,被覆盖、替换、取消等操作的概率很小。 但这并非不可能。 只要当前交易没有被挖出并进入区块,就可以进行相关操作。
具体操作方法还是和3类似,但是切记不要改变nonce。 (具体情况要和实际情况比较以太坊转账多久失败,毕竟这个操作的概率几乎为0)
4、转账状态查询代码的实现
我这里只能查看成功和失败的,有些转账可能找不到,但不能保证当前转账不存在以太坊转账多久失败,或者是pending。如果找到对应的方法请告知,谢谢
执行
尝试 {
EthGetTransactionReceipt transactionReceipt = web3j.ethGetTransactionReceipt(transactionHash).send();
TransactionReceipt transactionReceipt1 = transactionReceipt. 得到结果();
如果(transactionReceipt1 == null){
log.warn("转账Hash内容为空,Hash = 【{}】", transactionHash);
} 别的 {
如果 ("0x1".equals(transactionReceipt1.getStatus())){
log.info("转账成功!Hash = {}", transactionHash)
}
如果 ("0x0".equals(transactionReceipt1.getStatus())){
log.error("转账失败!Hash = {}", transactionHash)
}
}
} 赶上(IOException e){
e.printStackTrace();
}
五、参考文章
发送后检查或替换 TX:
取消以太坊上的未决交易:
Node auto send a lot of transaction after call eth.sendTransaction() in one time:[](Node auto send a lot of transaction after call eth.sendTransaction() in one time)
Web3j: