区块链研习社白话区块链区块链技术与金融

ETH转账的2种方式的对比

2018-11-06  本文已影响2人  唠嗑008

交易机制(Transaction mechanisms)

web3j支持使用以太坊钱包文件(推荐)和以太网客户端管理命令来发起一笔交易。当你创建了一个拥有以太币的账户后,你可以通过以下两种交易机制,和以太坊网络(私网/公网)交易:

这里主要讲一下线下签名交易(Offline transaction signing)。线下签名交易允许你使用web3j提供的钱包账户发起交易,你完全控制自己的私钥,交易发送到网络上的其它节点并广播。

交易签名步骤

线下签名交易使用 RawTransaction 对象来完成,一共有如下几步:

1、通过私钥或密码+钱包文件(keystore)来加载转账凭证Credentials
2、获取发起转账账户的nonce 值,也就是第几笔交易
3、创建 RawTransaction交易 对象
4、签名 RawTransaction 对象,也就是对交易做签名
5、发送交易( RawTransaction 对象)给节点处理。
6、获取交易哈希值TxHash

 public static void transfer() throws Exception {
        Web3j web3j = Web3jFactory.build(new HttpService("https://rinkeby.infura.io/v3/5d5eff28c13d486081a28feaf45a5275"));
        String from = "0x85a22B7ECC69C6E7E888BD9E9164bD3841e0E21d";
        String to = "0xc706ddcd78ccd994c604770787e71d231cc66fd2";
        String privateKey = "your privatekey";
        BigInteger value = Convert.toWei("0.01", Convert.Unit.ETHER).toBigInteger();
        //加载转账所需的凭证,用私钥
        Credentials credentials = Credentials.create(privateKey);
        //获取nonce,交易笔数
        EthGetTransactionCount transactionCount =  web3j.ethGetTransactionCount(from, DefaultBlockParameterName.LATEST).sendAsync().get();
        BigInteger nonce = transactionCount.getTransactionCount();
        Log.i(TAG, "transfer nonce : " + nonce);
        
        //创建RawTransaction交易对象
        RawTransaction rawTransaction = RawTransaction.createTransaction(nonce, Contract.GAS_PRICE, Contract.GAS_LIMIT, to, value, "abc");
        //签名Transaction,这里要对交易做签名
        byte[] signMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
        String hexValue = Numeric.toHexString(signMessage);
        
        //发送交易
        EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).sendAsync().get();
        String transactionHash = ethSendTransaction.getTransactionHash();
        Log.i(TAG, "transfer txhash : " + transactionHash);
    }

关于Nonce

以太坊实战-再谈nonce使用陷阱:https://blog.csdn.net/wo541075754/article/details/79054937

此外,还有一种简单的转账方式

 Web3j web3j = Web3jFactory.build(new HttpService("https://rinkeby.infura.io/v3/5d5eff28c13d486081a28feaf45a5275"));
        String from = "0x85a22B7ECC69C6E7E888BD9E9164bD3841e0E21d";
        String to = "0xc706ddcd78ccd994c604770787e71d231cc66fd2";
        String privateKey = "xxxx";
        BigDecimal value = BigDecimal.valueOf(0.01);
        //加载转账所需的凭证,用私钥
        Credentials credentials = Credentials.create(privateKey);
        TransactionReceipt transactionReceipt = Transfer.sendFunds(web3j, credentials, to, value, Convert.Unit.ETHER).sendAsync().get();
        String transactionHash = transactionReceipt.getTransactionHash();
        Log.i(TAG, "transfer transactionHash : " + transactionHash);

这种方式,不需要自己管理nonce。

这2种方式都是离线交易,先组装交易,然后发送到链上。

参考:
https://docs.web3j.io/getting_started.html#transactions
https://www.jianshu.com/p/6650d2a3aea9

上一篇下一篇

猜你喜欢

热点阅读