美文网首页Eth35班--007不写就出局
使用Web3J与第三方合约交互——批量转账

使用Web3J与第三方合约交互——批量转账

作者: 程序员大叔日记 | 来源:发表于2018-02-06 18:17 被阅读8406次

之前使用NodeJs与智能合约交互,都是访问的自己部署的合约。最近要对线上第三方合约进行转账操作,人数比较多,一笔笔操作起来手指都点断了还容易出错。既然代币Token都遵守ERC20协议,肯定有统一的Transfer(转账)方法供客户端调用,那么编写程序实现自动转账应该可以实现,去查了相关资料发现web3j是不错的选择。

1、web3j简介

轻量级客户端与以太坊交互的Java库。

2、交互方式

既然是调用第三方合约那么肯定需要知道合约地址,合约地址定义了到哪里去访问合约;
ABI(Application Binary Interface): 应用程序二进制接口,定义了智能合约提供的方法功能

3、步骤

  1. 智能合约的地址和ABI的获取可以直接在 https://etherscan.io/ 查询获得。
    image.png
image.png image.png

若是无法获取到ABI接口,也可以使用solc编译生产bin和abi文件。

solcjs lookCoin.sol  --bin --abi --optimize -o ./lookCoin
  1. 通过abi接口文件使用web3j命令行工具生成Java代理类(下载地址 https://github.com/web3j/web3j/releases/tag/v3.2.0
web3j solidity generate --javaTypes key.bin key.abi -o KeySmartCode.java -p com.joshua.eth

(生产代理类时可以指定包路径和类名)

  1. 生产代理类后可以直接使用Java代码调用API来调用智能合约。
        // 创建Web3J
        Web3j web3 = Web3j.build(new HttpService("http://127.0.0.1:8545"));
        // 加载钱包
        Credentials credentials = WalletUtils.loadCredentials("钱包密码", "钱包路径");
        // 加载合约
        Key keySCode = Key.load(SMART_CONTRACT_ADDRESS, web3, credentials, BigInteger.valueOf(27000000000L), BigInteger.valueOf(250000));
        // 调用转账方法
        TransactionReceipt receipt = keySCode.transfer("目的账户", BigInteger.valueOf(1)).send();
        // 打印交易Hash
        System.out.println(receipt.getTransactionHash());

这样一来,便可以使用程序完成批量转账操作。

后来研究发现,使用NodeJs直接调用Web3也可以实现对应功能,不过还是对Java更熟悉一些,就采用了Java的方式。

相关文章

网友评论

  • 唠嗑008:生成java类之后,java去调用合约方法,一直报错,提示: java.lang.NoSuchMethodError: No interface method getTypeName()
    唠嗑008:@程序员大叔日记 问题解决了,谢谢。sol编译生成的java类没有问题。我的问题是:生成web3j对象的方式错了,android和java的不一样。
    程序员大叔日记:生成的代理类不对,看看sol文件
  • 哈哈比心:个人觉得最好的方式是用MetaMask来授权交易,不然在程序中去写私钥终归是不安全的,http://multisender.phizhub.com/?locate=zh# 这个网站貌似实现了用MetaMask批量转账,而且合约代码是开源的
  • 4305f6116899:你好 有demo吗 照着上面来 有的类找不到 能不能发一下你的demo给我(1048440489@qq.com) 或者github的地址 感激不尽
    哈哈比心:@林肯 我的开发不是用的java,我用的web3js,所以我没法给你demo,我去github上搜了一下, 这个实现了与ERC20代币合约的交互 https://github.com/ethjava/web3j-sample/blob/master/src/main/java/com/ethjava/TokenClient.java 可以参考一下
    4305f6116899:@狗子Howe 是这样的 我在做钱包开发 用到的是java语言 所以要java实现代币的转账 看你文章是这样写 Key keySCode = Key.load(SMART_CONTRACT_ADDRESS, web3, credentials, BigInteger.valueOf(27000000000L), BigInteger.valueOf(250000)); 这个Key在哪个包里 我导入的web3j是没有这个类 请问你这个方法是怎么来的 所以问你有没有demo 给我参考一下
    哈哈比心:http://multisender.phizhub.com/?locate=zh# 这个网站貌似可以批量转账,而且合约代码是开源的,应该可以用 这是github https://github.com/howeguo/Token-multisender/blob/master/README_%E4%B8%AD%E6%96%87.md
  • 红豆杉_2c7c:问一下 。使用合约交易代币的时候。
    https://etherscan.io 很快的就显示了交易成功。

    但是 we3j 后台线程在 600 秒内等待获取 交易凭证的时候 老是提示超时 。

    这个是什么原因。

    在 web 上可以查到 交易已经写到区块链上了。
    程序600s的监听却提示:Transaction receipt was not generated after 600 seconds for transaction: 0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
    红豆杉_2c7c:Exception in thread "main" org.web3j.protocol.exceptions.TransactionException:
    而且 gasLimit 和 gasPrice 给的值也是够用的。
  • 大胡子的机器人:我查询代币余额的话,是否可不通过这个方法呢:Key keySCode = Key.load(SMART_CONTRACT_ADDRESS, web3, credentials, BigInteger.valueOf(27000000000L), BigInteger.valueOf(250000));
    因为这里涉及到credentials私钥,只查询代币余额也需要私钥有点不合理,请指教
    大胡子的机器人:@酒趣琴音 对的,谢谢
    酒趣琴音:查询不需要私钥也可以查询。用web3j.EthCall balanceOf方法
  • 编程狂魔:推荐一个java开发以太坊区块链的教程,web3j开发详解:
    http://xc.hubwiz.com/course/5b2b6e82c02e6b6a59171de2?affid=623jianshu
  • 坏男坏男:加载合约时,SMART_CONTRACT_ADDRESS是从哪来的呢?
    酒趣琴音:合约被矿工挖出来以后就有地址了。
  • b4a9cac00bf7:话说,我的为啥会链接失败?我开启了Mist了啊
    b4a9cac00bf7:geth --rinkeby --syncmode "full" --rpc --rpcaddr "192.168.0.173" --rpcport 8545 --mine --minerthreads 2 --etherbase "0x1582580D33A30aD52086Ae445d2241C2b4ae477c"
  • b4a9cac00bf7:loadCredentials的钱包路径是钱包地址吗?
    光鹏的鹏:钱包密码是私钥吗
    b4a9cac00bf7:@程序员大叔日记 :+1:
    程序员大叔日记:@过客_4223 是的
  • 林小海灿:大叔你好 我之前是 php和js的 但是 我们上司说 需要 部署合约后 需要弄链上获取数据 保存在中心化的数据库(比如mysql,用来做缓存或者数据的读取),我现在大概会写智能合约 到时 我就不知道怎么交互 用js,go,java ,py吗
    网上大多数都是js ,我想知道 php能不能用 不然我就要去学习新的编程语言 请大叔赐教
    林小海灿:大叔,我最近学node,express一直看懂,你有推荐入门的吗
    程序员大叔日记:@林小海灿 使用NodeJs吧,PHP的库我没有研究
    林小海灿:如果我在web端用js获取链上的数据 拿到返回数据后 再ajax post给php后端 感觉好麻烦的样子
  • 冰的燃点:大神,请教下~钱包路径里存放的钱包文件是怎么样的啊?钱包的私钥还是什么?
    郝文博:可以用明文私钥创建钱包对象,也可以用密码和keystore文件创建
  • 1234_e1e0:大神,我想批量转账 ETH,苦苦没找到,ETH的合约地址。惆怅
    酒趣琴音:eth转账不需要合约地址,也不一定需要代理类,直接调用web3j的sendRawTransaction
    965a4d278e65:好像是0x0000...
  • 水手月亮兔子:这个key是什么,没有这个类,能不能代码完整的贴出来,谢谢
    程序员大叔日记:@blingbling2018 文章里有介绍生成的方法
    水手月亮兔子:这个怎么生成的呢,我要是程序做好多代币的转账,页面选择发送,这样的代理类能程序生成吗,还有没有什么方式用web3j转eth以外的erc20 token吗
    程序员大叔日记:@blingbling2018 这个就是编写的合约的代理类
  • 蜜糖771:好专业
  • 3e4e3818ed48:我这个不懂代码的人看起来半知不解的,但是已经了解到普通人也是可以参与虚拟货币的建设的,我想程序员看了才会有所收获吧。

本文标题:使用Web3J与第三方合约交互——批量转账

本文链接:https://www.haomeiwen.com/subject/hebgzxtx.html