A. 使用Web3J与第三方合约交互——批量转账
之前使用NodeJs与智能合约交互,都是访问的自己部署的合约。最近要对线上第三方合约进行转账操作,人数比较多,一笔笔操作起来手指都点断了还容易出错。既然代币Token都遵守ERC20协议,肯定有统一的Transfer(转账)方法供客户端调用,那么编写程序实现自动转账应该可以实现,去查了相关资料发现web3j是不错的选择。
轻量级客户端与以太坊交互的Java库。
既然是调用第三方合约那么肯定需要知道合约地址,合约地址定义了到哪里去访问合约;
ABI(Application Binary Interface): 应用程序二进制接口,定义了智能合约提供的方法功能
若是无法获取到ABI接口,也可以使用solc编译生产bin和abi文件。
(生产代理类时可以指定包路径和类名)
这样一来,便可以使用程序完成批量转账操作。
后来研究发现,使用NodeJs直接调用Web3也可以实现对应功能,不过还是对Java更熟悉一些,就采用了Java的方式。
B. 【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刷新一次。
正常情况下,几十秒内就可以获取到区块信息了。
区块确认数=当前区块高度-交易被打包时的区块高度。
C. ETH以太坊怎样进行一键发币
以太坊一键发币,具体的技术内容不太了解,但是这样的操作安全吗?数字金融安全允许一键发币这种操作吗?
D. 以太币转帐速度
两小时至24小时以内。
可根据转账支付的矿工费,快的一分钟能到,慢的也能在几分钟到。一般来说转账BTC,ETH等其它代币到账的时间在两个小时以内,快的情况也大概需要30分钟,所以转账请把握好到账时间。
以太坊已经做到了每秒处理5次交易,如果它超过6,那么它也处于峰值容量。另一方面,Uber平均每秒钟有12次乘车,PayPal几百次,Visa数千次,大型股票交易所成千上万,而在物联网中,讨论的是每秒数十万。
E. 以太坊转账流程
发起:用户在本地的以太坊钱包软件中选择要发送的交易地址(From)、输入目标地址(To)、金额(Value)、是否部署或调用合(Data)、手续费单价(Gasprice)等,确认发送至以太坊节点节点和钱包可以是同一台
广播:节点收到(或自己发起)交易后,会对交易进行验证。验证:交易的签名、发起账号的余额是否能支付转账余额与手续费、Nonce是否为账号已发出的交易数。验证为合法后,将交易加入节点的交易池中交易池中存储着待打包的交
安装以太坊浏览器钱包插件,创建钱包,获取虚拟以太币,进行转账交易。 实验内容 学习 初识以太坊,发送交易 1.学习《初始以太坊,发送交易》,虚拟以太币交易。
F. 浠ュお鍧奅TH鎬庢牱鎵归噺杞璐︼紵
涓銆佷互澶鍧奅TH鎬庢牱鎵归噺杞璐︼紵
.com閽卞寘鏈夌洿鎺ユ壒閲忚浆璐﹀伐鍏凤紝鏂逛究鐨勫緢銆
浜屻佹瘮鐗规淳閽卞寘鎵归噺鍦板潃璧勪骇鎬庝箞鍚堝苟鍒颁竴璧
姣旂壒娲鹃挶鍖呮壒閲忓湴鍧璧勪骇鎬庝箞鍚堝苟鍒颁竴璧
1銆佺‘璁ゆ偍瑕佸彂閫佺殑甯佺嶏紝濂介渶瑕佹敹娆剧殑鍦板潃
?
2銆侀摼鎺 BITHD锛岀偣鍑昏浆璐︼紝杈撳叆鏀舵惧湴鍧锛屾牳瀵规敹娆惧湴鍧锛岃緭鍏ヨ佽浆璐︾殑閲戦
?
?
浠ヤ笂灏辨槸姣旂壒娲鹃挶鍖呬娇鐢ㄦ暀绋嬶細BITHD杞璐︽暀绋嬬殑璇︾粏鍐呭癸紝鏇村氬叧浜嶣ITHD杞璐︽暀绋嬬殑璧勬枡璇峰叧娉ㄨ剼鏈涔嬪跺叾瀹冪浉鍏虫枃绔狅紒
鏈绔欐彁閱掞細鎶曡祫鏈夐庨櫓锛屽叆甯傞』璋ㄦ厧锛屾湰鍐呭逛笉浣滀负鎶曡祫鐞嗚储寤鸿銆 Tag锛氭瘮鐗规淳 閽卞寘 BITHD
涓夈佷互澶鍧奅TH鎬庢牱鎵归噺杞璐?
bitpie 姣旂壒娲鹃挶鍖 浜叉祴鍙鐢ㄣ
G. 楸兼睜閲岀殑浠ュお鍧婃庝箞鏍蜂氦
楸兼睜閲岀殑浠ュお鍧婃庝箞浜ゆ槗
濡傛灉浣犲湪楸兼睜閲岀殑浠ュお鍧婇挶鍖呴噷鏈変竴瀹氱殑浠ュお甯侊紝浣犲彲浠ュ湪閽卞寘閲岃繘琛屼氦鏄撱
鍏蜂綋姝ラゅ備笅锛
1.鎵撳紑浠ュお鍧婇挶鍖咃紝杩涘叆鈥滀氦鏄撯濋〉闈銆
2.鐐瑰嚮鈥滃彂閫佲濇寜閽锛屽~鍐欎氦鏄撶殑鐩鏍囧湴鍧鍜岃浆璐﹂噾棰濈瓑淇℃伅銆
3.纭璁や氦鏄撲俊鎭鏃犺鍚庯紝鐐瑰嚮鈥滃彂閫佷氦鏄撯濇寜閽銆
4.绯荤粺浼氭彁绀轰綘杈撳叆閽卞寘瀵嗙爜杩涜岀‘璁わ紝杈撳叆瀵嗙爜鍚庣‘璁や氦鏄撱
5.浜ゆ槗鍙戦佹垚鍔熷悗锛屼綘鍙浠ュ湪鈥滀氦鏄撹板綍鈥濋〉闈㈡煡鐪嬩氦鏄撶殑鐘舵佸拰浜ゆ槗璇︽儏銆
闇瑕佹敞鎰忕殑鏄锛屽湪杩涜屼互澶鍧婁氦鏄撴椂锛岄渶瑕佹敮浠樹竴瀹氱殑鐕冩皵璐癸紙GasFee锛夛紝杩欐槸鐢ㄦ潵鏀浠樹氦鏄撴墜缁璐圭殑銆傜噧姘旇垂鐨勫ぇ灏忓彇鍐充簬浜ゆ槗鐨勫嶆潅绋嬪害鍜岀綉缁滄嫢鍫垫儏鍐电瓑鍥犵礌锛岀噧姘旇垂瓒婇珮锛屼氦鏄撶殑澶勭悊閫熷害瓒婂揩銆傚洜姝わ紝濡傛灉浣犲笇鏈涗氦鏄撹兘澶熷敖蹇寰楀埌澶勭悊锛屽彲浠ラ傚綋鎻愰珮鐕冩皵璐圭殑閲戦濄
H. USDT_ERC20和ERC20代币转账提币API接口的调用流程
USDT_ERC20和ERC20的代币都可以按照这个教程来只是代币名字不一样:
ERC20的USDT,就是以太坊的代币。转账手续费低,速度快。
1、ERC20地址收到USDT后(ztPay平台会根据应用配置里面的通知地址进行通知),USDT转账时需要扣ETH作为手续费。ERC20地址收到USDT后是没有ETH的。那么就需要充值ETH。
2、在ztPay平台创建一个ETH地址,往里面冲入一定数量ETH作为手续费资金池。 这个可以在线接口处创建地址 或者自己调用接口创建地址。
3、等这个地址有了ETH,就可以调用ETH的转账接口,往收到USDT_ERC20的地址里面充值0.0035ETH以上作为手续费 。
因为USDT_ERC20转账是扣的当前这个转出地址里面的eth作为手续费。
4、总结:USDT_ERC20这个当前地址里面有usdt,也要有 0.0035以上的eth手续费。那么才可以调用转账接口,开始转账。
USDT_ERC20转账流程:
第一步:首先通过获取地址余额接口(name=usdt_erc20),查询USDT余额包括ETH手续费余额。
第二步:检测ETH手续费是否大于0.0035ETH,大于则即可调用接口转出USDT ,转账完毕。ETH以太坊网络gas limit和gas price设置
第三步:ETH手续费不足则 调用之前准备的ETH手续费资金池地址,往这个地址里面转入至少0.0035的ETH。完毕。等下次执行转账时即可转账成功。
做一个定时任务最好5以上分钟执行一次可以通过以太坊浏览器来查询相关金额:https://eth.tokenview.com/cn/ 或者 https://etherscan.io/
接口参考资料: ztPay数字货币接口文档
I. 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