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();
}
}
}