主页 > 下载安卓版imtoken钱包 > 冷钱包 java eth

冷钱包 java eth

下载安卓版imtoken钱包 2023-06-01 05:27:18

一、简介

上面我们讲了在测试环境下创建账号并使用

这样我们就可以创建自己的钱包地址,在测试环境中我们使用#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: