Magician-Web3是一个区块链开发工具包。它由两个功能组成。一个是扫描区块链,根据开发者的需要监控交易。另一个是对web3j的一些二次打包,可以减少开发者在一些常见场景下的工作量。
Magician-Web3 是一个区块链开发工具包。它由两个功能组成。一个是扫描区块链,根据开发者的需要监控交易。另一个是对 web3j 的一些二次打包,可以减少开发者在一些常见场景下的工作量。它计划支持三种链,ETH(BSC、POLYGAN 等)、SOL 和 TRON
新增 InputDataFilter,可以更加精准的根据 inputData 进行监控了
改变扫描模式,现在只需要设定一个起始块就好了,程序会按照一定的频率从起始块往后扫描,不再需要设置每轮扫描块数
Web3j 的扩展部分,修改了私钥的传入方式
如果你想监控,某合约内的某函数 被调用的交易
public EthMonitorFilter ethMonitorFilter() {
return EthMonitorFilter.builder()
.setToAddress("0x552115849813d334C58f2757037F68E2963C4c5e") // 合约地址
.setInputDataFilter( // 根据inputData筛选
InputDataFilter.create()
.setFunctionCode("0xadasasdf") // 被调用的函数编码(inputData前十位)
);
}
如果 有一个合约 [0x552115849813d334C58f2757037F68E2963C4c5e], 里面有一个函数是 transferFrom (address from, address to, uint256 amount)
你想 实现一个监控:如果有人用这个合约里的这个函数,将代币转给 [0x552115849813d334C58f2757037F68E2963C4c5e] 时,就触发 Monitor 事件,那么你可以这样写
public EthMonitorFilter ethMonitorFilter() {
return EthMonitorFilter.builder()
.setToAddress("0x552115849813d334C58f2757037F68E2963C4c5e") // 合约地址
.setInputDataFilter( // 根据inputData筛选
InputDataFilter.create()
.setFunctionCode(ERC20.TRANSFER_FROM.getFunctionCode()) // 被调用的函数编码(inputData前十位)
.setTypeReferences( // 此方法的参数列表(仅类型)
new TypeReference<Address>(){}, // 第一个参数的类型
new TypeReference<Address>(){}, // 第二个参数的类型
new TypeReference<Uint256>(){} // 第三个参数的类型
)
.setValue(null, "0x552115849813d334C58f2757037F68E2963C4c5e", null)// 筛选第二个参数(to) = 0x552115849813d334C58f2757037F68E2963C4c5e
);
}
MagicianBlockchainScan.create()
.setRpcUrl("https://data-seed-prebsc-1-s1.binance.org:8545/")
.setChainType(ChainType.ETH)
.setScanPeriod(5000)
.setScanSize(1000) // 这个配置项已经被彻底移除了,不再需要配置了
.setBeginBlockNumber(BigInteger.valueOf(24318610))
.addEthMonitorEvent(new EventOne())
.addEthMonitorEvent(new EventTwo())
.addEthMonitorEvent(new EventThree())
.start();
扫描的逻辑换成了从起始块 按照一定的频率 一块一块的往后扫,不再是以前的 每轮扫描多少块了
这种方式已经淘汰了
EthHelper ethHelper = MagicianWeb3.getEthBuilder().getEth(web3j, privateKey);
EthContract ethContract = MagicianWeb3.getEthBuilder().getEthContract(web3j, privateKey);
现在换成了,在调用方法时 才传入,目的是为了解决:如果有多个地址 需要发起交易,可以只用一个对象解决
// 转账
TransactionReceipt transactionReceipt = ethHelper.transfer(
toAddress,
privateKey, // 调用方法时传入私钥
BigDecimal.valueOf(1),
Convert.Unit.ETHER
);
// 往合约里写入数据
SendResultModel sendResultModel = ethContract.sendRawTransaction(
fromAddress,
contractAddress,
privateKey, // 调用方法时传入私钥
new BigInteger("1200000"),
new BigInteger("800000"),
ethAbiCodec.getInputData(
"transfer",
new Address(toAddress),
new Uint256(new BigInteger("1000000000000000000"))
)
);
可以访问官网了解更多:https://magician-io.com
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!