❶ 06-web3j的ABI
ABI是一种数据编码方案用于处理Ethereum智能合约。ABI中定义的类型和solidity是一样的。比如uint8…,uint256,int8,…,int256,bool,string,等等。
web3j的ABI模块提供了所有ABI规范支持,包括:
web3j提供的本地java类型与ABI转换如下:
请参阅各种编码/解码的 ABI单元测试 的例子。
一个完整的ABI规范在 Solidity documentation 。
这是一个非常轻量级的模块,只依赖于 Bouncy Castle 第三方库用来加密hash( Spongy Castle 在Android上)。其他希望与Ethereum ABI交互(JVM或Android)的项目会选择使用这个模块而不是编写自己的实现。
❷ 【ETH钱包开发03】web3j转账ETH
在之前的文章中,讲解了创建、导出、导入钱包。
【ETH钱包开发01】创建、导出钱包
【ETH钱包开发02】导入钱包
本文主要讲解以太坊转账相关的一些知识。交易分为ETH转账和ERC-20 Token转账,本篇先讲一下ETH转账。
1、解锁账户发起交易。钱包keyStore文件保存在geth节点上,用户发起交易需要解锁账户,适用于中心化的交易所。
2、钱包文件离线签名发起交易。钱包keyStore文件保存在本地,用户使用密码+keystore的方式做离线交易签名来发起交易,适用于dapp,比如钱包。
本文主要讲一下第二种方式,也就是钱包离线签名转账的方式。
交易流程
1、通过keystore加载转账所需的凭证Credentials
2、创建一笔交易RawTransaction
3、使用Credentials对象对交易签名
4、发起交易
注意以下几点:
1、Credentials
这里,我是通过获取私钥的方式来加载 Credentials
还有另外一种方式,通过密码+钱包文件keystore方式来加载 Credentials
2、nonce
nonce是指发起交易的账户下的交易笔数,每一个账户nonce都是从0开始,当nonce为0的交易处理完之后,才会处理nonce为1的交易,并依次加1的交易才会被处理。
可以通过 eth_gettransactioncount 获取nonce
3、gasPrice和gasLimit
交易手续费由gasPrice 和gasLimit来决定,实际花费的交易手续费是 gasUsed * gasPrice 。所有这两个值你可以自定义,也可以使用系统参数获取当前两个值
关于 gas ,你可以参考我之前的一篇文章。
以太坊(ETH)GAS详解
gasPrice和gasLimit影响的是转账的速度,如果gas过低,矿工会最后才打包你的交易。在app中,通常给定一个默认值,并且允许用户自己选择手续费。
如果不需要自定义的话,还有一种方式来获取。获取以太坊网络最新一笔交易的 gasPrice ,转账的话, gasLimit 一般设置为21000就可以了。
Web3j还提供另外一种简单的方式来转账以太币,这种方式的好处是不需要管理nonce,不需要设置gasPrice和gasLimit,会自动获取最新一笔交易的gasPrice,gasLimit 为21000(转账一般设置成这个值就够用了)。
这个问题,我想是很多朋友所关心的吧。但是到目前为止,我还没有看到有讲解这方面的博客。
之前问过一些朋友,他们说可以通过区块号、区块哈希来判断,也可以通过Receipt日志来判断。但是经过我的一番尝试,只有 BlockHash 是可行的,在web3j中根据 blocknumber 和 transactionReceipt 都会报空指针异常。
原因大致是这样的:在发起一笔交易之后,会返回 txHash ,然后我们可以根据这个 txHash 去查询这笔交易相关的信息。但是刚发起交易的时候,由于手续费问题或者以太网络拥堵问题,会导致你的这笔交易还没有被矿工打包进区块,因此一开始是查不到的,通常需要几十秒甚至更长的时间才能获取到结果。我目前的解决方案是轮询的去刷 BlockHash ,一开始的时候 BlockHash 的值为0x00000000000,等到打包成功的时候就不再是0了。
这里我使用的是rxjava的方式去轮询刷的,5s刷新一次。
正常情况下,几十秒内就可以获取到区块信息了。
区块确认数=当前区块高度-交易被打包时的区块高度。
❸ 以太坊如何使用web3.js或者rpc接口获取交易数据交易时间与确认数
如果要查询主网上的交易记录,可以使用etherscan。但是,如果是你自己搭建的私链,应该如何查询交易记录呢?
答案是你需要自己监听链上的日志,存到数据库里,然后在这个数据库中查询。例如:
varaddr=""
varfilter=web3.eth.filter({fromBlock:0,toBlock:'latest',address:addr});
filter.get(function(err,transactions){
transactions.forEach(function(tx){
vartxInfo=web3.eth.getTransaction(tx.transactionHash);
//这时可以将交易信息txInfo存入数据库
});
});
web3.eth.filter()用来监听链上的日志,web3.eth.getTransaction()用来提取指定交易的信息,一旦获得交易信息,就可以存入数据库供查询用了。
推荐一个实战入门,你可以看看:以太坊教程
❹ ETH转账的2种方式的对比
web3j支持使用以太坊钱包文件(推荐)和以太网客户端管理命令来发起一笔交易。当你创建了一个拥有以太币的账户后,你可以通过以下两种交易机制,和以太坊网络(私网/公网)交易:
这里主要讲一下 线下签名交易(Offline transaction signing) 。线下签名交易允许你使用web3j提供的钱包账户发起交易,你完全控制自己的私钥,交易发送到网络上的其它节点并广播。
线下签名交易使用 RawTransaction 对象来完成,一共有如下几步:
1、通过私钥或密码+钱包文件(keystore)来加载转账凭证Credentials
2、获取发起转账账户的nonce 值,也就是第几笔交易
3、创建 RawTransaction交易 对象
4、签名 RawTransaction 对象,也就是对交易做签名
5、发送交易( RawTransaction 对象)给节点处理。
6、获取交易哈希值TxHash
以太坊实战-再谈nonce使用陷阱: https://blog.csdn.net/wo541075754/article/details/79054937
此外,还有一种简单的转账方式
这种方式,不需要自己管理nonce。
这2种方式都是离线交易,先组装交易,然后发送到链上。
参考:
https://docs.web3j.io/getting_started.html#transactions
https://www.jianshu.com/p/6650d2a3aea9
❺ 【ETH钱包开发04】web3j转账ERC-20 Token
在上一篇文章中讲解了ETH转账,这一篇讲一下ERC-20 Token转账。
【ETH钱包开发03】web3j转账ETH
1、直接用web3j的API
2、java/Android调用合约的 transfer 方法
不管用哪种方式来转账,你都需要先写一个solidity智能合约文件来创建ERC-20 Token,然后部署合约,最后才是通过客户端来调用。
注意:erc-20 token转账和eth转账的区别如下:
1、erc-20 token创建交易对象用的是这个方法 createTransaction
2、erc-20 token需要构建 Function ,它其实对应的就是erc-20 token合约中的那些方法。它的第一个参数就是ERC20中那几个方法的名称,第二个参数的话就是对应合约方法中的参数,第三个参数是和第二个参数对应的,按照我那样就行了。转账的话就是 transfer ,我们从合约的 transfer 可以看到第一个参数是收款地址,第二个参数是金额,所以 Function 这里对应起来就好。
这种方法不需要使用web3j封装的方法,而是直接调用solidity合约的方法。
步骤
1、web3j加载一个已经部署的合约
2、验证合约是否加载成功 isValid
3、如何加载合约成功,则调用合约的 transfer 方法
注意:
1、这里的 TokenERC20 是根据solidity智能合约生成的对应的Java类,用于java/Android和智能合约交互的,如果你对这里不太清楚,不妨看看我之前的一篇文章。
以太坊Web3j命令行生成Java版本的智能合约
2、如果加载合约失败,可能的一个原因是合约对应的Java类中的 BINARY 的值不对,这个值是你部署合约成功之后的bytecode,你最好检查对比一下。
我发送一笔交易,可以通过这个地址查询
https://rinkeby.etherscan.io/tx/
❻ 使用Web3J与第三方合约交互——批量转账
之前使用NodeJs与智能合约交互,都是访问的自己部署的合约。最近要对线上第三方合约进行转账操作,人数比较多,一笔笔操作起来手指都点断了还容易出错。既然代币Token都遵守ERC20协议,肯定有统一的Transfer(转账)方法供客户端调用,那么编写程序实现自动转账应该可以实现,去查了相关资料发现web3j是不错的选择。
轻量级客户端与以太坊交互的Java库。
既然是调用第三方合约那么肯定需要知道合约地址,合约地址定义了到哪里去访问合约;
ABI(Application Binary Interface): 应用程序二进制接口,定义了智能合约提供的方法功能
若是无法获取到ABI接口,也可以使用solc编译生产bin和abi文件。
(生产代理类时可以指定包路径和类名)
这样一来,便可以使用程序完成批量转账操作。
后来研究发现,使用NodeJs直接调用Web3也可以实现对应功能,不过还是对Java更熟悉一些,就采用了Java的方式。
❼ 以太坊入门(三)用web3j进行以太转账及代币转账
上章讲到账户的查询,本章讲述账户转账。
代币转账和以太转账的区别在于,to地址是合约地址,而input是有三部分数据构成:transfer方法的哈希+收款人的地址+转账金额。此处比较难理解的正是Function部分,设置好参数以后,调用rawTransaction就可以了。