Magician-Scanning 是一个用 Java 开发的扫描区块链的工具包,当我们在程序中需要一些功能时,它可以派上用场,比如说。
当一个地址收到ETH时,程序中的一个方法会被自动触发,这个交易会被传入该方法。
当一个合约的某个功能被调用时(比如ERC20转账),它会自动触发程序中的一个方法,并将这个交易传递给这个方法。它甚至可以只在代币被转移到指定地址时被触发。
当程序需要保留一个区块高度开始以来的所有交易记录时,也可以使用这个工具包。
它计划支持三种链,ETH(BSC,POLYGON等),SOL和TRON
<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>
监听器 可以创建多个,根据你的需求 分别设置监听条件
/**
* 创建一个类,实现 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);
}
}
如果你想监控,某合约内的某函数 被调用的交易
public EthMonitorFilter ethMonitorFilter() {
return EthMonitorFilter.builder()
.setToAddress("0x552115849813d334C58f2757037F68E2963C4c5e") // 合约地址
.setInputDataFilter( // 根据inputData筛选
InputDataFilter.builder()
.setFunctionCode("0xadasasdf") // 被调用的函数编码(inputData前十位)
);
}
如果 有一个合约[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
);
}
开发中......
// 初始化线程池,核心线程数必须 >= 扫块的任务数量 + 重试策略的数量
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(new EventOne()) // 添加 监听事件
.addEthMonitorEvent(new EventTwo()) // 添加 监听事件
.addEthMonitorEvent(new EventThree()) // 添加 监听事件
.start();
// TODO 暂时不支持SOL和TRON, 正在开发中......
本书可以作为Node.js开发加密货币的入门书籍(正式出版可能使用《Node.js区块链开发》),也可以作为亿书(及以Crypti为核心的应用Lisk)的官方开发文档。
要使用 TypeScript 开发 Vue 应用程序,我们强烈建议您使用Visual Studio Code,它为 TypeScript 提供了极好的“开箱即用”支持。 如果你正在使用单文件组件(SFC), 可以安装提供 SFC 支持以及其他更多实用功能的Vetur 插件。 WebStorm同样为 TypeScript 和 Vue.js 提供了“开箱即用”的支持。
面试官不苟言笑,态度不能说不好,挺有耐心的。 1.自我介绍 2.讲简历上的项目,面试官虽然不懂,但问的还是很细致。在问项目的时候结合区块链原理、核心技术、特点都聊了聊,面试官很专业; 3.指针和引用的区别; 4.三次握手、四次挥手 5.智能指针 6.右值引用 7.问我接触过MySQL和Redis没,我说没...,然后就过了 8.手撕代码,最大不重复子串,限时十分钟,没写完,但是讲了一下思路,思路是
Blog 系统属于非常典型的 WEB 应用. 通常开发者都会首先考虑选择一个 WEB 框架. 这里我们打算用另外一种方式: 工具链进行开发. 用独立的 Go package 通过组合完成开发. 为什么 这不需要什么理由. 软件开发的过程就是通过分治解决问题的. 把大问题分解成数个小的, 相关度很低(解耦)的问题并解决. 这些小问题被解决实现的代码, 多数可以复用到其他开发中. Go 语言中有 pa
第一步:必须先编译过sdk,然后可以在以下路径找到工具链: openwrt/staging_dir/toolchain-arm_cortex-a7+neon_gcc-5.3.0_glibc-2.22_eabi 第二步:拷贝toolchain-arm_cortex-a7+neon_gcc-5.3.0_glibc-2.22_eabi到/opt目录下,设置环境变量: root@ubuntu:~$ vi
工作证明(PoW)是区块链网络中的原始一致性算法。该算法用于确认事务并为链创建新块。在该算法中,minor(一群人)相互竞争以完成网络上的交易。相互竞争的过程称为挖掘。一旦矿工成功创建了一个有效的区块,他们就会获得奖励。PoW最着名的应用是比特币。 制作工作证明可能是一个概率很低的随机过程。在此过程中,在生成有效的工作证明之前,需要进行大量的试验和错误。工作证明的主要工作原理是一个数学难题,很容易