![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/837515c141cfe6ca50964db46a1f3378.gif)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ac5d7d3f82c0784f506213e520f17fd9.gif)
参考
以太坊钱包1-Android-创建钱包
以太坊钱包2-Android-转账(ETH)
以太坊钱包3-Android-代币转账(ERC20)
前提准备
在说ETH转账和查询余额之前需要准备环境:也就是普通app平时请求后台数据时分为开发、测试以及正式环境。以太坊同样的也有几个网络供我们开发测使用。后续会使用ropsten
作为测试网络
环境 | 连接地址 |
---|---|
主网 | https://mainnet.infura.io/ |
rinkeby测试网 | https://rinkeby.infura.io/ |
ropsten测试网 | https://ropsten.infura.io/ |
更多 | - |
在相应区块链浏览器上均可以查询到所有部署在此链上的智能合约以及用户的以太币。
选中ropsten
作为测试网络,首先需要获取在该网络上获取以太币。有多种获取方式。如下:
获取ropsten
上的以太币
这里采用的是方式2
-
安装Chrome浏览器或者火狐浏览器的METAMASK插件
-
通过metamask选择ropsten网络创建钱包
-
进入水龙头网站进行转账(一会就到账了)
地址:0xB4939cd825d4408656e64C987C8cf8354Cc2208d 私钥:f48028e1e37f507e59f0011ddd106b18747936b09e03ba565a085f17c672f671
上面的账号就是通过metamask生成的 里面有几个以太币,如果不方便可以直接使用上面的账号,通过钱包导入即可
查询余额、转账ETH以及后续的智能合约部署,调用均使用Web3j
ETH查询余额
//初始化web3j
Web3j web3j = Web3jFactory.build(new HttpService("https://ropsten.infura.io/"));
//获取余额 ETH支持小数点后18位,此处获取的balance要除以10^18
BigInteger balance = web3j.ethGetBalance(address, DefaultBlockParameterName.LATEST)
.send()//是同步获取
//.sendAsync()//异步获取
.getBalance();
通过直接调用web3j.ethGetBalance()
即可。第一个参数address:查询余额的地址,第二个填写的参数表示到最新的挖掘块,第二个参数其他值。这样就可以获取每个账户的以太币的余额,如果使用同步方式获取余额记得在其他线程调用。
ETH转账
- 简单使用
Transfer
转账
//初始化web3j
Web3j web3j = Web3jFactory.build(new HttpService("https://ropsten.infura.io/"));
//此处密码为输入的,walletFile为钱包里面中存储的WalletFile文件
Credentials credentials = Credentials.create(Wallet.decrypt(pwd, walletFile));
TransactionReceipt transactionReceipt = Transfer.sendFunds(
web3j, credentials, toAddr,
BigDecimal.valueOf(value), Convert.Unit.ETHER)
.send()
//toAddr 转入账户地址
//BigDecimal.valueOf(value) 转账的以太币数量value为1
//Convert.Unit.ETHER 以太币的单位 因为以太币支持小数点后面18位。
//所以当转账1个ETH时实际上转换为BigInteger为100 0000 0000 0000 0000。
//此处不懂先看后面,看完就能弄懂
- 自定义转账
//初始化web3j
Web3j web3j = Web3jFactory.build(new HttpService("https://ropsten.infura.io/"));
//此处密码为输入的,walletFile为钱包里面中存储的WalletFile文件
Credentials credentials = Credentials.create(Wallet.decrypt(pwd, walletFile));
//获取当前账户的下一个有效随机数 此处的address为当前钱包的地址
EthGetTransactionCount ethGetTransactionCount = web3j.ethGetTransactionCount(
address, DefaultBlockParameterName.LATEST).send();
BigInteger nonce = ethGetTransactionCount.getTransactionCount();
//创建交易 这里几个参数没写,统一在下面解释
RawTransaction rawTransaction = RawTransaction.createEtherTransaction(
nonce, <gas price>, <gas limit>, <toAddress>, <value>);
// 签名交易 并转换为16进制
byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
String hexValue = Numeric.toHexString(signedMessage);
//发送交易 发送完了或获取一个交易的hash值,这个值可以在区块链浏览器上查询当前交易的结果
EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).send();
创建交易需要用到一下几个参数
RawTransaction.createTransaction(nonce,gasPrice,gasLimit,to,value,data);
- nonce:当前账户下有效的随机数 用来唯一地标识交易。一个nonce只能使用一次,直到交易被挖掘完成
- gasPrice:挖矿中用到的gas对eth的价格。好比汽油价格。
- gasLimit:针对本次交易所使用的最大gas数量。好比汽车的油箱。比如一辆汽车加满油箱是40,每1L油的价格为7块,汽车每跑100km耗油10L,那么跑400km需要消耗40L油,换成钱是280块。也就是说花280块能跑400km,在400km内随便跑都没有关系。同理:进行这次交易,假设gasPrice = 0.01ETH,gasLimit = 10。也就是说我愿意替这次交易花费最大数为0.1ETH。如果这次交易所消耗的ETH大于0.1ETH,那么这次交易不会完成,且这0.1ETH会被消耗而不会退还。如果这次交易只需要用到0.05ETH那么还剩下0.05ETH会退还到账户上。还有一个概念:gasUsed 也就是一个词交易需要花费的gas数量。
- to:转入的地址
- value:转入的ETH数量,因为ETH支持小数点后面18位,假如需要转账1ETH,那么此处的值为100 0000 0000 0000 0000。
- data:进行合约调用的时使用,也可以添加备注。不过需要进行16进制转换(后续通过智能合约转让代币会描述)
参考
因为简单的描述无法让人快速的弄懂比较生疏的概念,所以这里找了几篇比较友好的文章