Omni扫块流程

首先需要拿到当前USDT高度(也可以去TokenView去查
通过grpc也好,封装的api也可以,我这里是通过client的方式

 currentHeigth = omniCoreClient.currentBlockHeight();

每次扫完要把当前高度存到数据库中,下次从DB中的高度继续扫描(这里我防止意外情况,又引入了Redis存放高度,每次扫先和DB的比较谁高用谁)

log.info("当前最新高度:{}",currentHeigth);log.info("DB中上次高度:{}",index);//这个标志位是为了跳出下面while用的boolean flag = true;Integer block = (Integer) redisTemplate.opsForValue().get("IN_BLOCK");if(block != null){if(block > index){log.info("redis中高度大 使用{}",block);index = block;}else{log.info("数据库中高度大 使用{}",index);}}else{log.info("数据库中高度大 使用{}",index);}

然后就是扫块的方法

while (flag && index <= currentHeigth.intValue()-1){List<Sha256Hash> sha256Hashes = omniCoreClient.getOmniClient().omniListBlockTransactions(index);for (Sha256Hash txid : sha256Hashes) {LinkedHashMap jsonObject = omniCoreClient.getOmniClient().send("omni_gettransaction",txid.toString().trim());if(jsonObject==null){continue;}if(jsonObject.get("propertyid")==null || !jsonObject.get("propertyid").equals(31)){log.info("非USDT交易跳过 {}",txid.toString());continue;}if(!(boolean)jsonObject.get("valid")){log.info("并不是有效数据跳过 {}",txid.toString());continue;}if((int)jsonObject.get("confirmations") <= 1 ){flag = false;log.info("确认数小于2 不增加高度等待下次扫描 {}",txid.toString());break;}}}

每次要从DB或Redis的最新高度-1开始扫,也就是最低多扫两个高度。
解释一下上面为什么要确认小于2的跳过,因为如果确认只有1的话会有一定几率被退回,这样的话钱已经转入了,数据库的记录也有了,但是实际上钱并没有打进来,被退回了

jsonObject.get("referenceaddress")

接下来就可以去拿数据库中的地址去和扫到的地址比对,如果相同的,并且事务ID没有被记录过就开始自己的业务逻辑(加钱,插入记录等)

由于每次index会从-1开始扫,有概率会重复扫到,只凭地址是无法判断是否扫过了,这个时候就需要事务ID来记录(txid,hex)

if(index == currentHeigth.intValue()){redisTemplate.opsForValue().set("BLOCK_HEIGHT",index-1);operationExtendMapper.updateDbIndex(String.valueOf(index-1));log.info("更新到高度{}",index-1);}else{redisTemplate.opsForValue().set("BLOCK_HEIGHT",index);operationExtendMapper.updateDbIndex(String.valueOf(index));log.info("更新到高度{}",index);}

上面的全部结束之后就可以更新本次的高度了.

归集

由于这个API受到限制所以绝大部分都使用原生归集(下次说)
本次使用的归集方法是omni_funded_send方式,这个方法本身是有问题的,为什么这么说,看一下api的介绍

omni_funded_send
omni_funded_send调用创建并发送一个简单充值交易。发送方发出的所有比特币都将被消耗掉,如果比特币来自指定的手续费 来源,那么找零将返回该来源地址。

没错,它每次都会把BTC耗空,也就是说用户连续充值多次,只有一次能够被归集成功,,其他的几次归集会全部失败,因为没有账户btc。
如果是每次都单笔充值的情况是没问题的,也不需要打0.00000546,用户充值会带进来一笔,并且需要一个代扣手续费的地址,这个地址一定要有足够的BTC

下面方法设置本次手续费(这个可以通过其他方式获取到全网平均手续费,太少了到账慢,太多了浪费)

omniClient.setTxFee();

接下来就等待归集完成,如果记录够全面的话,就可以连续查询到两笔转账记录,从外面转入内部地址,从内部地址转入(冷,热地址)汇集地址。

一般这个扫块作为定时服务存在程序里面,我设置是5分钟,你也可以设置其他时间,USDT每天会平均生成80个高度,每个高度150-1000+的交易记录,建议每次扫到就进行逻辑处理,不需要加事务,每次扫的速度取决于链上的交易笔数,越多则越慢

Omni扫块,和非原生归集相关推荐

  1. python代码块-Python中的代码块和非代码块是什么

    Python中的代码块和非代码块是什么 发布时间:2020-06-26 13:53:30 来源:亿速云 阅读:150 今天就跟大家聊聊有关Python中的代码块和非代码块是什么,可能很多人都不太了解, ...

  2. java自由块_JAVA 静态的自由块和非静态的自由块

    java中的自由块分为静态的自由块和非静态的自由块,这两种的执行是有区别的. 非静态自由块的执行时间是:在执行构造函数之前. 静态自由块的执行时间是:class文件加载时执行. 执行的时间不同,造成的 ...

  3. java中static代码块与非静态代码块

    static代码块与非静态代码块的区别: static代是码块是在类加载时就加载的,而非静态代码块只有在对象实例化时才执行! 转载于:https://www.cnblogs.com/dazhuzhu/ ...

  4. 编程开发涉及的非原生英文名词的读法

    (今天太晚了,以后再慢慢写)   程序员往往比较严谨,喜欢对一个命名争论不休,又同时爱好制造交流上的障碍,比方说发明字典里没有的词汇,但是又疏于注明其读音.笔者常常被这些富有创造力的程序员所困扰,与人 ...

  5. 静态代码块、非静态代码块、构造函数执行顺序

    静态代码块.非静态代码块.构造函数执行顺序 /*** 类的实例化顺序,静态代码块.非静态代码块.构造函数.* @author MING*/ class Person {static String na ...

  6. 浅谈 JAVA中静态初始化块和非静态初始化块的区别

    众所周知在JAVA编程语言中有两种初始化块: 静态初始化块 非静态初始化块 他们到底有什么区别呢?今天就浅谈一下JAVA中静态初始化块和非静态初始化块的区别 静态初始化块 定义: static{} 执 ...

  7. 原生安卓与html 好坏,安卓非原生 系统体验差别大

    安卓非原生 系统体验差别大 接下来我们了解一下蓝魔i100 Pro的双系统体验.先说一个设计上的不足,机器在运行一个系统时,我们是无法进行系统切换的.目前很多双系统平板都带系统切换功能,Win系统下我 ...

  8. 身份证识别SDK——混合非原生调用

    身份证识别SDK可支持Android.iOS主流移动操作系统,android平台提供jar包,ios提供静态库.a文件.APP集成身份证识别SDK后,用户采用手机.平板电脑对身份证进行拍摄识别即可自动 ...

  9. Docking非原生配体

    转载于 https://mp.weixin.qq.com/s/VDN1qAZGIMol6prwQW4umw Docking非原生配体 在前面的例子中,AutoDock Vina能把配体构象调整到几乎原 ...

最新文章

  1. 时间处理_pandas_时间处理小结
  2. 下载keep运动软件_我把私教带回了家,Keep智能动感单车体验|钛极客
  3. Windows - node版本管理工具NVM
  4. 用 Visual Studio Code 在 macOS 上创建首个 ASP.NET Core 应用程序
  5. mysql中文编码问题
  6. 局域网中另外一台服务器的内存_局域网共享打印机,但另外一台电脑却看不到,可能是这3个原因...
  7. dm数据库 linux版下载,linux环境搭建DM数据库
  8. 嵌入式Linux内核开发工程师必须掌握的三十道题
  9. 数据挖掘概念与技术_文本挖掘
  10. 线程之成员变量的线程共享
  11. java lower_Java TreeSet lower()用法及代码示例
  12. 【SVN】解决SVN安装语言包后无法选择中文的问题
  13. 怎么修改android内存,安卓内存修改器怎么用?
  14. JavaWeb框架三剑客前言
  15. Ubuntu解压、压缩zip、tar、tar.gz、tar.bz2文件
  16. cad玻璃门怎么画_如何使用CAD画门窗 CAD怎么画门窗
  17. 3D游戏设计读书笔记二
  18. python乘积函数_Python中乘法
  19. python做表格教程_表格函数教程
  20. 我在帝都买房后,又开始思考怎样赚更多的钱了。

热门文章

  1. mybatis-plus代码生成器一键生成代码
  2. 如何一键生成set、get、toString方法
  3. aiem模型matlab,基于MIMICS模型的麦田地表土壤含水量反演研究
  4. C语言——矩阵的上三角化
  5. 今日金融词汇--- 高周转模式
  6. mysql在线考试的设计_在线考试系统设计与实现(MySQL)
  7. css扇子展开,CSS3 绝妙的扇形折叠展开加载动画
  8. 个人项目总结---微信扫描二维码强制群发
  9. 北美票房排行榜 实时_诸城客房管理软件排行榜
  10. 数学建模进入“新课标”,告别了“刷题”“押题”数学应该怎么学?