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