• Java扫描区块链的工具包|Java扫块|监听token转账


    Magician-Scanning是一个用Java开发的扫描区块链的工具包,当我们在程序中需要一些功能时,它可以派上用场,比如说。

    • 当一个地址收到ETH时,程序中的一个方法会被自动触发,这个交易会被传入该方法。
    • 当一个合约的某个功能被调用时(比如ERC20转账),它会自动触发程序中的一个方法,并将这个交易传递给这个方法。它甚至可以只在代币被转移到指定地址时被触发。
    • 当程序需要保留一个区块高度开始以来的所有交易记录时,也可以使用这个工具包。

    一、导入依赖

    <dependency>
        <groupId>com.github.yuyenews</groupId>
        <artifactId>Magician-Scanning</artifactId>
        <version>1.0.6</version>
    </dependency>
    
    <!-- This is the logging package, you must have it or the console will not see anything, any logging package that can bridge with slf4j is supported -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-jdk14</artifactId>
        <version>1.7.12</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    二、创建一个监听器

    监听器可以创建多个,根据你的需求分别设置监听条件

    ETH(BSC, POYGAN 等)监听器

    /**
     * 创建一个类,实现 EthMonitorEvent接口 即可
     */
    public class EventDemo implements EthMonitorEvent {
    
        /**
         * 筛选条件,如果遇到了符合条件的交易,会自动触发 call方法
         * 这些条件都是 并且的关系,必须要同时满足才行
         * 如果不想根据某个条件筛选,直接不给那个条件设置值就好了
         * 这个方法如果不实现,或者返回null, 那么就代表监听任意交易
         */
        @Override
        public EthMonitorFilter ethMonitorFilter() {
            return EthMonitorFilter.builder()
                    .setFromAddress("0x131231249813d334C58f2757037F68E2963C4crc") // 筛选 fromAddress 发送的交易
                    .setToAddress("0x552115849813d334C58f2757037F68E2963C4c5e") // 筛选 toAddress 或 合约地址 收到的交易
                    .setMinValue(BigInteger.valueOf(1)) // 筛选发送的主链币数量 >= minValue 的交易
                    .setMaxValue(BigInteger.valueOf(10)) // 筛选发送的主链币数量 <= maxValue 的交易
                    .setInputDataFilter( // 根据inputData筛选
                            InputDataFilter.builder()
                                    .setFunctionCode(ERC20.TRANSFER.getFunctionCode()) // 函数签名(被调用的合约内的某方法), 支持任意函数,这里的枚举只是一部分标准的合约函数
                                    .setTypeReferences( // 此方法的参数列表(仅类型)
                                            new TypeReference<Address>(){},
                                            new TypeReference<Uint256>(){}
                                    )
                                    .setValue("0x552115849813d334C58f2757037F68E2963C4c5e", null)// 筛选第几个参数 = 什么值
                    );
        }
    
        /**
         * 如果遇到了符合上面条件的交易,就会触发这个方法
         * transactionModel.getEthTransactionModel() 是一个交易对象,内部包含hash,value,from,to 等 所有的数据
         */
        @Override
        public void call(TransactionModel transactionModel) {
            String template = "EventOne 扫描到了, hash:{0}, from:{1}, to: {2}, input: {3}";
            template = template.replace("{0}", transactionModel.getEthTransactionModel().getBlockHash());
            template = template.replace("{1}", transactionModel.getEthTransactionModel().getFrom());
            template = template.replace("{2}", transactionModel.getEthTransactionModel().getTo());
            template = template.replace("{3}", transactionModel.getEthTransactionModel().getInput());
    
            System.out.println(template);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    InputDataFilter 详解
    如果你想监控,某合约内的某函数 被调用的交易

    public EthMonitorFilter ethMonitorFilter() {
            return EthMonitorFilter.builder()
                    .setToAddress("0x552115849813d334C58f2757037F68E2963C4c5e") // 合约地址
                    .setInputDataFilter( // 根据inputData筛选
                            InputDataFilter.builder()
                                    .setFunctionCode("0xadasasdf") // 被调用的函数编码(inputData前十位)
                    );
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    如果 有一个合约[0x552115849813d334C58f2757037F68E2963C4c5e], 里面有一个函数是 transferFrom(address from, address to, uint256 amount)

    你想 实现一个监控:如果有人用这个合约里的这个函数,将代币转给[0x552115849813d334C58f2757037F68E2963C4c5e]时,就触发 Monitor事件,那么你可以这样写

    public EthMonitorFilter ethMonitorFilter() {
            return EthMonitorFilter.builder()
                    .setToAddress("0x552115849813d334C58f2757037F68E2963C4c5e") // 合约地址
                    .setInputDataFilter( // 根据inputData筛选
                            InputDataFilter.builder()
                                    .setFunctionCode(ERC20.TRANSFER_FROM.getFunctionCode()) // 被调用的函数编码(inputData前十位)
                                    .setTypeReferences( // 此方法的参数列表(仅类型)
                                            new TypeReference<Address>(){}, // 第一个参数的类型
                                            new TypeReference<Address>(){}, // 第二个参数的类型
                                            new TypeReference<Uint256>(){} // 第三个参数的类型
                                    )
                                    .setValue(null, "0x552115849813d334C58f2757037F68E2963C4c5e", null)// 筛选第二个参数(to) = 0x552115849813d334C58f2757037F68E2963C4c5e
                    );
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    三、开启一个扫块任务

    // 初始化线程池,核心线程数必须 >= 扫块的任务数量 + 重试策略的数量
    EventThreadPool.init(1);
    
    // 开启一个扫块任务,如果你想扫描多个链,那么直接拷贝这段代码,并修改配置即可
    MagicianBlockchainScan.create()
            .setRpcUrl(
                    EthRpcInit.create()
                            .addRpcUrl("https://data-seed-prebsc-1-s1.binance.org:8545")
            ) // 节点的RPC地址
            .setScanPeriod(5000) // 间隔多久,扫描下一个区块
            .setBeginBlockNumber(BigInteger.valueOf(24318610)) // 从哪个块高开始扫描
            .addEthMonitorEvent(new EventOne()) // 添加 监听事件
            .addEthMonitorEvent(new EventTwo()) // 添加 监听事件
            .addEthMonitorEvent(new EventThree()) // 添加 监听事件
            .start();
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 相关阅读:
    下载安装nvm教程(附带下载切换node.js版本实操)
    基于Java的大学生救援队网站
    深度学习(PyTorch)——循环神经网络(RNN)基础篇二
    Win7遇到错误无法正常开机进桌面怎么解决?
    Mysql关闭严格模式
    Bipartite Graph Based Multi-View Clustering
    了解常用测试模型 -- V模型、W模型
    SQLlite
    数据库锁及批量更新死锁处理
    ChatGpt提问艺术 prompt工程学习过程
  • 原文地址:https://blog.csdn.net/zgsdzczh/article/details/128083491