1、解锁账户发起交易:使用中心化交易所时,用户需要解锁账户以发起交易。
2、钱包文件离线签名发起交易:在本地保存钱包文件时,用户可以使用密码方式离线签名来发起交易,适用于dapp。
本文主要介绍第二种方式,即钱包离线签名转账的方法。
交易流程: 1、通过私钥获取凭证Credentials; 2、创建交易RawTransaction; 3、使用Credentials对象对交易进行签名; 4、发起交易。
需要注意以下几点:
1、Credentials:可以通过获取私钥或使用密码钱包文件keystore来加载Credentials。
2、nonce:发起交易的账户下的交易笔数,nonce从0开始,每个账户处理完nonce为0的交易后,再处理nonce为1的交易,以此类推。可以使用eth_gettransactioncount获取nonce的值。
3、gasPrice和gasLimit:交易手续费由gasPrice和gasLimit决定,实际花费手续费为gasUsed * gasPrice。这两个值可以自定义,也可以使用系统参数获取当前值。
关于gas,可以参考以太坊GAS详解的文章。gasPrice和gasLimit会影响转账的速度,如果gas过低,矿工最后才会打包交易。通常在应用程序中会给定一个默认值,并允许用户自己选择手续费。
如果不需要自定义,可以通过获取最新一笔交易的gasPrice来获取gasLimit,一般转账设置为21000就足够。
Web3j还提供了一种简单的转账方式,无需管理nonce、设置gasPrice和gasLimit,会自动获取最新一笔交易的gasPrice,gasLimit为21000(一般转账使用)。
关于如何判断交易是否成功,我尝试了通过区块号、区块哈希和Receipt日志来判断,但只有BlockHash是可行的。在web3j中,根据blocknumber和transactionReceipt都会报空指针异常。
原因是,在发起一笔交易后,需要通过txHash查询相关信息。但一开始时,由于手续费问题或以太网络拥堵,交易可能还未被矿工打包进区块,因此无法查询到结果。通常需要几十秒甚至更长时间才能获取到结果。我的解决方案是轮询BlockHash,一开始的值为0x00000000000,直到打包成功后才会变为其他值。
我使用了rxjava的方式来轮询刷新,每5秒刷新一次。通常情况下,几十秒内就可以获取到区块信息。
区块确认数=当前区块高度-交易被打包时的区块高度。
用戶喜愛的交易所
已有账号登陆后会弹出下载