erc20根据合约地址获取所有交易记录

1.etherscan api地址

https://etherscan.io/apis

2.获取特定区块段,中的特定合约的交易记录

https://api.etherscan.io/api?module=account&action=tokentx&contractaddress=填入合约地址&startblock=0&endblock=10000&page=1&offset=100&sort=asc&apikey=YourApiKeyToken

接口原理:按照区块获取交易记录(eth上的es设置只有10000,所以采取这种方式)
部分参数示例:
contractaddress 自己的合约地址
startblock 开始区块
endblock 结束区块
page 页数
offset 每页数量
&apikey=YourApiKeyToken   测试时(最好修改)可不修改,只是限制调用次数

3.获取eth区块高度

https://api.etherscan.io/api?module=proxy&action=eth_blockNumber&apikey=YourApiKeyToken

实现代码:

 @Scheduled(cron = "0/1 * * * * ? ") // 间隔1秒执行
    public synchronized void tokenTranferRec() {
        try {
            logger.info("获取交易记录");
            ErcConfigEntity ercConfigEntity = ercConfigService.selectById(1);
            String result = GetApi.getApi(TOKENTRANSFERRECSTART +
                    STARTBLOCK + ercConfigEntity.getStartBlock() +
                    ENDBLOCK + ercConfigEntity.getEndBlock() +
                    PAGE + ercConfigEntity.getPage() +
                    OFFSET + ercConfigEntity.getOffset() +
                    TOKENTRANSFERRECEND);
            JSONObject object = JSON.parseObject(result);
            //判断接口调用返回值
            if ("1".equals(object.getString("status"))) {
                logger.info("已获取到交易记录");
                JSONArray list = object.getJSONArray("result");
                for (int i = 0; i < list.size(); i++) {
                    JSONObject ercTraTec = list.getJSONObject(i);
                    ErcTraRecEntity ercTraRecEntity = new ErcTraRecEntity();
                    ercTraRecEntity = JSONObject.toJavaObject(ercTraTec, ErcTraRecEntity.class);
                    logger.info(ercTraRecEntity.getHash());
                    ercTraRecService.insertByHash(ercTraRecEntity);
                }
                ercConfigEntity.setPage(ercConfigEntity.getPage() + 1);
                ercConfigEntity.setOffseted(ercConfigEntity.getOffset());
                ercConfigService.updateById(ercConfigEntity);
            }
            //当前区块有数据时,不执行区块+10000,page=1的操作
            if (object.getJSONArray("result").size() <= 0) {
                //当前区段的块中没有记录时,将endBlock赋值给startBlock,endBlock+10000-->判断是否大于当前eth区块高度,
                //将startBlock,endBlock以及page=1入库。
                logger.info("start" + ercConfigEntity.getStartBlock());
                logger.info("end" + ercConfigEntity.getEndBlock());
                //获取区块高度
                String resul = GetApi.getApi(ETHBLOCKNUMBER);
                JSONObject object1 = JSON.parseObject(resul);
                long out = Integer.parseInt(object1.get("result").toString().substring(2, object1.get("result").toString().length()), 16) + 100000000L;
                //
                if (ercConfigEntity.getEndBlock() <= out) {
                    ercConfigEntity.setStartBlock(ercConfigEntity.getEndBlock());
                    ercConfigEntity.setPage(1L);
                }
                if ((ercConfigEntity.getEndBlock() + 10000) < out) {
                    ercConfigEntity.setEndBlock(ercConfigEntity.getEndBlock() + 10000);
                } else {
                    ercConfigEntity.setEndBlock(out);
                }
                ercConfigService.updateById(ercConfigEntity);
            }
        } catch (Exception e) {
            logger.error(e.toString());
        } finally {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值