以太坊钱包3-Android-代币转账(ERC20)

文章目录

    • 参考
    • 简单概念
    • 前提准备
    • 转账Token(ERC20)
    • Demo 参考代码

参考

以太坊钱包1-Android-创建钱包
以太坊钱包2-Android-转账(ETH)
以太坊钱包3-Android-代币转账(ERC20)

简单概念

以太坊:区块链的底层系统,就像Android、IOS等系统
智能合约:在以太坊虚拟机上运行的应用程序,就像Android系统上运行的App。使用solidity语言所写.
更多概念:搓我
在以太坊上部署智能合约来发行代币需要遵循一定的规则,其中有ERC20,ERC721等.市面上大部分发布的代币都是基于ERC20的代币。(ERC20中文)

前提准备

因为进行代币转账首先需要有一种代币,这就涉及到部署合约,合约可以部署到自己搭建的私链上,也可以部署到已知的几个测试链上
。通过Web3j这个库也能直接部署

  • 选择部署合约的测试链
    • 自己搭建私链
    • 使用已知的几个测试链>>如何部署
  • 编写合约
    • 自己使用solidity编写合约
    • 在主网上查找别人的合约代码

如果是新手或者仅仅只是想知道代币转账功能的就不要花太多时间在这上面,下面提供一个在rinkeby测试网络上的智能合约和有代币的账号。

    rinkeby连接地址:https://rinkeby.infura.io/
    智能合约地址:0x8cc96dfe394def64659e47df7e048c5ee285bd57
    代币小数点位数:18位
    钱包地址:0x224EcB4F5CEae82B963d09229dC39dBBcba3749C
    助记词:inquiry lonely seminar boost sentence lounge volcano together ecology mammal awake clarify

转账Token(ERC20)

ERC20标准总共就几个方法,这里我们用到的其中有两个。

    balanceOf:查询代币余额
    transfer:交易转账
  1. 通过加载合约进行转账

这里所用的YourSmartContract是将用solidity编写好的智能合约通过Web3j生成的。具体详情查看

//初始化web3j
Web3j web3j = Web3jFactory.build(new HttpService("https://rinkeby.infura.io/"));
//此处密码为输入的,walletFile为钱包里面中存储的WalletFile文件
Credentials credentials = Credentials.create(Wallet.decrypt(pwd, walletFile));
//加载智能合约
YourSmartContract contract = YourSmartContract.load(
        "0x
", , , GAS_PRICE, GAS_LIMIT); //转账 value为转账金额 注意这里记得需要进行单位换算,比如需要转账1个代币, //而这个代币的小数位数是18位,那么transfer()第二个参数就是100 0000 0000 0000 0000。 //具体参考前面一节eth转账说明。 contract.transfer(toAddr,BigDecimal.valueOf(value).toBigInteger()
  1. 不依赖加载合约转账
//初始化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();
//创建调用合约的方法 
Function function = new Function<>(
             "functionName",  // 合约的名字,比如balanceOf 或者transfer
             Arrays.asList(new Type(value), ...),  // 方法的参数,如果获取余额则写上查询的钱包地址,如果是transfer 则填写转入地址以及转入金额,金额注意单位转换
             Arrays.asList(new TypeReference() {}, ...));//返回参数的类型
String encodedFunction = FunctionEncoder.encode(function)
创建交易
RawTransaction rawTransaction = RawTransaction.createTransaction(
                        nonce,gasPrice,gasLimit,to,ethValue,encodedFunction)
// 签名交易 并转换为16进制
byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
String hexValue = Numeric.toHexString(signedMessage);
//发送交易 发送完了或获取一个交易的hash值,
EthSendTransaction transactionResponse =
             web3j.ethSendTransaction(transaction).sendAsync().get();
//交易hash值 这个值可以在区块链浏览器上查询当前交易的结果
String transactionHash = transactionResponse.getTransactionHash();

转账完成不会马上就会到账(挖矿需要时间),稍等一会通过balanceOf方式查询余额。以上转账均需要消耗以太币,跟以太币转账一样。不同的是代币是通过调用合约方法进行转账,以太币可以直接调用以太坊提供的api。

Demo 参考代码

DemoApk下载地址
github代码地址

你可能感兴趣的:(区块链)