当一个地址收到ETH时,程序中的一个方法会被自动触发,这个交易会被传入该方法。
当一个合约的某个功能被调用时(比如ERC20转账),它会自动触发程序中的一个方法,并将这个交易传递给这个方法。它甚至可以只在代币被转移到指定地址时被触发。
当程序需要保留一个区块高度开始以来的所有交易记录时,也可以使用这个工具包。
它计划支持三种链,ETH(BSC,POLYGON等),SOL和TRON初始化配置导入依赖<dependency><groupId>com.github.yuyenews</groupId><artifactId>Magician-Scanning</artifactId><version>1.0.6</version></dependency><!--Thisistheloggingpackage,youmusthaveitortheconsolewillnotseeanything,anyloggingpackagethatcanbridgewithslf4jissupported--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-jdk14</artifactId><version>1.7.12</version></dependency>扫块,监听交易事件创建一个监听器监听器可以创建多个,根据你的需求分别设置监听条件
ETH(BSC,POYGAN等)监听器/***创建一个类,实现EthMonitorEvent接口即可*/publicclassEventDemoimplementsEthMonitorEvent{/***筛选条件,如果遇到了符合条件的交易,会自动触发call方法*这些条件都是并且的关系,必须要同时满足才行*如果不想根据某个条件筛选,直接不给那个条件设置值就好了*这个方法如果不实现,或者返回null,那么就代表监听任意交易*/@OverridepublicEthMonitorFilterethMonitorFilter(){returnEthMonitorFilter.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(//此方法的参数列表(仅类型)newTypeReference<Address>(){},newTypeReference<Uint256>(){}).setValue("0x552115849813d334C58f2757037F68E2963C4c5e",null)//筛选第几个参数=什么值);}/***如果遇到了符合上面条件的交易,就会触发这个方法*transactionModel.getEthTransactionModel()是一个交易对象,内部包含hash,value,from,to等所有的数据*/@Overridepublicvoidcall(TransactionModeltransactionModel){Stringtemplate="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);}}InputDataFilter详解如果你想监控,某合约内的某函数被调用的交易
publicEthMonitorFilterethMonitorFilter(){returnEthMonitorFilter.builder().setToAddress("0x552115849813d334C58f2757037F68E2963C4c5e")//合约地址.setInputDataFilter(//根据inputData筛选InputDataFilter.builder().setFunctionCode("0xadasasdf")//被调用的函数编码(inputData前十位));}如果有一个合约[0x552115849813d334C58f2757037F68E2963C4c5e],里面有一个函数是transferFrom(addressfrom,addressto,uint256amount)
你想实现一个监控:如果有人用这个合约里的这个函数,将代币转给[0x552115849813d334C58f2757037F68E2963C4c5e]时,就触发Monitor事件,那么你可以这样写
publicEthMonitorFilterethMonitorFilter(){returnEthMonitorFilter.builder().setToAddress("0x552115849813d334C58f2757037F68E2963C4c5e")//合约地址.setInputDataFilter(//根据inputData筛选InputDataFilter.builder().setFunctionCode(ERC20.TRANSFER_FROM.getFunctionCode())//被调用的函数编码(inputData前十位).setTypeReferences(//此方法的参数列表(仅类型)newTypeReference<Address>(){},//第一个参数的类型newTypeReference<Address>(){},//第二个参数的类型newTypeReference<Uint256>(){}//第三个参数的类型).setValue(null,"0x552115849813d334C58f2757037F68E2963C4c5e",null)//筛选第二个参数(to)=0x552115849813d334C58f2757037F68E2963C4c5e);}SOL,TRON链的扫块正在开发中......开发中......开启一个扫块任务//初始化线程池,核心线程数必须>=扫块的任务数量+重试策略的数量EventThreadPool.init(1);//开启一个扫块任务,如果你想扫描多个链,那么直接拷贝这段代码,并修改配置即可MagicianBlockchainScan.create().setRpcUrl(EthRpcInit.create().addRpcUrl("https://data-seed-prebsc-1-s1.binance.org:8545").addRpcUrl("https://data-seed-prebsc-2-s1.binance.org:8545").addRpcUrl("https://data-seed-prebsc-1-s2.binance.org:8545"))//节点的RPC地址.setScanPeriod(5000)//每轮扫描的间隔.setBeginBlockNumber(BigInteger.valueOf(24318610))//从哪个块高开始扫描.addEthMonitorEvent(newEventOne())//添加监听事件.addEthMonitorEvent(newEventTwo())//添加监听事件.addEthMonitorEvent(newEventThree())//添加监听事件.start();//TODO暂时不支持SOL和TRON,正在开发中......文档地址https://magician-io.com/chain
评论