Magician-Web3 上线了


Magician-Web3是一个区块链开发工具包。它由两个功能组成。一个是扫描区块链,根据开发者的需要监控交易。另一个是对web3j的一些二次封装,可以减少开发者在一些常见场景下的工作量。它计划支持三种链,ETH(BSC、POLYGAN等)、SOL和TRON,目前已经完成了对ETH的支持。

自此以后,Magician的定位发生了改变,他不再是一个web领域的框架了,而是一套Java开发的工具包,涵盖区块链,web开发两个领域,我们可以回顾一下现有的所有组件。

这些组件并没有强依赖,有些甚至没有任何依赖,比如Magician-Web3, Magician, Magician-JDBC, Magician-Configure 这几个组件,都是可以单独使用的,他们之间没有任何依赖关系。 

  • 如果你刚好需要开发一个扫块+入库的操作,那么Magician-Web3 + Magician-JDBC 组合刚好可以满足你。

  • 如果你只想对外提供一个简单的http接口,websocket服务,那么Magician刚好可以满足你。

  • 如果你有一个不是web的项目,但是刚好有个需求需要把数据入库,那么Magician-JDBC刚好可以帮到你。

Magician的定位并不是web开发,而是一套Java开发的工具包!如果你需要一个功能,但是别人的方案又太重,那我或许可以帮到你。

Magician-Web3

说了这么多,我们回到Magician-Web3的介绍上,上面提到了有两个功能,一个是扫块,监听账户地址 或者 合约的动态,一个是对Web3j的二次封装。

扫块+监听

先创建一个监听器,注意看代码中的注释

/**
 * 创建一个类,实现 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 的交易
.setFunctionCode("0xasdas123"); // 筛选调用合约内 某方法 的交易
}

/**
 * 如果遇到了符合上面条件的交易,就会触发这个方法
 * 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);
}
}

然后开启一个扫块任务即可,注意看代码中的注释

// 初始化线程池,核心线程数必须 >= 扫块的任务数量,建议等于扫块的任务数量
EventThreadPool.init(1);

// 开启一个扫块任务,如果你想扫描多个链,那么直接拷贝这段代码,并修改配置即可
MagicianBlockchainScan.create()
.setRpcUrl("https://data-seed-prebsc-1-s1.binance.org:8545/") // 节点的RPC地址
.setChainType(ChainType.ETH) // 要扫描的链(如果设置成ETH,那么可以扫描BSC, POLYGAN 等其他任意 以太坊标准的链)
.setScanPeriod(5000) // 每轮扫描的间隔
.setScanSize(1000) // 每轮扫描的块数
.setBeginBlockNumber(BigInteger.valueOf(24318610)) // 从哪个块高开始扫描
.addEthMonitorEvent(new EventOne()) // 添加 监听事件
.addEthMonitorEvent(new EventTwo()) // 添加 监听事件
.addEthMonitorEvent(new EventThree()) // 添加 监听事件
.start();

Web3j二次封装

主链币查询以及转账

String privateKey = ""; // 私钥
Web3j web3j = Web3j.build(new HttpService("https://data-seed-prebsc-1-s1.binance.org:8545/")); // 链的RPC地址

// 这种方式是单例的
EthHelper ethHelper =MagicianWeb3.getEthBuilder().getEth(web3j, privateKey);
// 如果你想创建多个EthHelper对象,可以用这种方式
EthHelper ethHelper = EthHelper.builder(web3j, privateKey);

// 余额查询
BigInteger balance = ethHelper.balanceOf(fromAddress);

// 转账
TransactionReceipt transactionReceipt = ethHelper.transfer(
toAddress,
BigDecimal.valueOf(1),
Convert.Unit.ETHER
);

InputData 编解码

// 这种方式是单例的
EthAbiCodec ethAbiCodec = MagicianWeb3.getEthBuilder().getEthAbiCodec();
// 如果你想创建多个EthAbiCodec对象,可以直接new
EthAbiCodec ethAbiCodec = new EthAbiCodec();

// 编码
String inputData = ethAbiCodec.getInputData(
"transfer", // 方法名
new Address(toAddress), // 参数1
new Uint256(new BigInteger("1000000000000000000")) // 参数2,如果还有其他参数,可以继续传入下一个
);

// 解码
List<Type> result = ethAbiCodec.decoderInputData(
"0x" + inputData.substring(10), // 去除方法签名的inputData
new TypeReference<Address>() {}, // 被编码的方法的参数1 类型
new TypeReference<Uint256>() {} // 被编码的方法的参数2 类型, 如果还有其他参数,可以继续传入下一个
);

for(Type type : result){
System.out.println(type.getValue());
}

// 获取方法签名,其实就是inputData的前十位
String functionCode = ethAbiCodec.getFunAbiCode(
"transfer", // 方法名
new Address(toAddress), // 参数1,值随意传,反正我们要的方法签名,不是完整的inputData
new Uint256(new BigInteger("1000000000000000000")) // 参数2,值随意传,反正我们要的方法签名,不是完整的inputData,如果还有其他参数,可以继续传入下一个
);

合约查询 以及 写入

String privateKey = ""; // 私钥
Web3j web3j = Web3j.build(new HttpService("https://data-seed-prebsc-1-s1.binance.org:8545/")); // 链的RPC地址

// 这种方式是单例的
EthContract ethContract = MagicianWeb3.getEthBuilder().getEthContract(web3j, fromAddressPrivateKey);
// 如果你想创建多个EthContract对象,可以用这种方式
EthContract ethContract = EthContract.builder(web3j, privateKey);


EthAbiCodec ethAbiCodec = MagicianWeb3.getEthBuilder().getEthAbiCodec();

// 查询
List<Type> result = ethContract.select(
contractAddress, // 合约地址
ethAbiCodec.getInputData(
"balanceOf", // 要调用的方法名称
new Address(toAddress) // 方法的参数,如果有多个,可以继续传入下一个参数
),// 要调用的方法的inputData
new TypeReference<Uint256>() {} // 方法的返回类型,如果有多个返回值,可以继续传入下一个参数
);

// 往合约里写入数据
// gasPrice,gasLimit 两个参数,如果想用默认值可以不传,或者传null
// 如果不传的话,两个参数都必须不传,要传就一起传, 如果设置为null的话,可以一个为null,一个有值
SendResultModel sendResultModel = ethContract.sendRawTransaction(
fromAddress, // 调用者的地址
contractAddress, // 合约地址
new BigInteger("1200000"), // gasPrice,如果想用默认值 可以直接传null,或者不传这个参数
new BigInteger("800000"), // gasLimit,如果想用默认值 可以直接传null,或者不传这个参数
ethAbiCodec.getInputData(
"transfer", // 要调用的方法名称
new Address(toAddress), // 方法的参数,如果有多个,可以继续传入下一个参数
new Uint256(new BigInteger("1000000000000000000")) // 方法的参数,如果有多个,可以继续传入下一个参数
) // 要调用的方法的inputData
);

sendResultModel.getEthSendTransaction(); // 发送交易后的结果
sendResultModel.getEthGetTransactionReceipt(); // 交易成功上链后的结

如果大家对Magician感兴趣的话,可以访问官网:https://magician-io.com

 


相關推薦

2022-11-19

Magician-web3是一个区块链开发工具包。它由两个功能组成。一个是扫描区块链,根据开发者的需要监控交易。另一个是对web3j的一些二次封装,可以减少开发者在一些常见场景下的工作量。它计划支持三种链,ETH(BSC、POLYGAN等)

2022-11-26

Magician-Web3 是一个区块链开发工具包。它由两个功能组成。一个是扫描区块链,根据开发者的需要监控交易。另一个是对 web3j 的一些二次打包,可以减少开发者在一些常见场景下的工作量。它计划支持三种链,ETH(BSC、POLYGAN 等

2022-11-24

Magician-Web3 是一个区块链开发工具包。它由两个功能组成。一个是扫描区块链,根据开发者的需要监控交易。另一个是对 web3j 的一些二次打包,可以减少开发者在一些常见场景下的工作量。它计划支持三种链,ETH(BSC、POLYGAN 等

2022-11-22

Magician-Route是Magician的官方web组件,由Magician-Web发展而来的新项目,主要是去掉了里面的反射,牺牲了一点易用性,将侧重点放在了性能上,两者的区别主要在于路由和拦截器的创建方式上。 Magician-Web 依然会继续维护,如果大

2024-06-29

新概览: 社区版 MySQL 工单支持存储过程等复杂语法上线 企业版 PostgreSQL TOP SQL 扫描任务 PostgreSQL 中止上线 批量导入数据源功能   专业版 同步更新欢迎下载体验,以下是 SQLE 3.2406.0 正式版的新功能解

2023-05-27

向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。 SQLE 获取 类型 地址 版本库 https://github.com/actiontech/sqle 文档 https://actiontech.git

2022-08-13

Vue 创始人尤雨溪宣布,新版 Vue 3 中文文档上线了! 地址:cn.vuejs.org 其他变化: 原先的 Vue 2 文档现在迁移到了 v2.cn.vuejs.org 之前的临时 v3 文档 (http://v3.cn.vuejs.org) 不再提供,会重定向到最新版对应的 URL http://staging-

2023-09-06

网络 关注我 前言:经过了3个多月的筹备,我们终于上线了“BeikeShop跨平台APP 我们基于uni-app开发框架,构建了这个多平台同步开发解决方案! 现在你有一个更好的解决方案,移动应用开发将变得轻松且高效!接下来将向

2023-08-26

向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。目前支持各种数据库规则 700+。 SQLE 获取 类型 地址 版本库 https://github.com/actiontech/s

2023-06-03

向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。 SQLE 获取 类型 地址 版本库 https://github.com/actiontech/sqle 文档 https://actiontech.git

2023-07-04

便,盗取了公司开发的手游源代码;并“换皮”成新游戏上线,半年内成功盈利 1.5 亿。 事情的起始经过具体为,该公司在 2022 年 11 月发现网上出现了一款与自家产品十分类似的游戏,让他们开始怀疑是否存在源代码泄露问题

2024-04-14

【店滴云】微服务用户中心上线 为什么做? 你是不是在使用vue做后台页面,但是常常找不到好的权限管理系统。客户经常要求能有代理商后台,区县级代理后台,你不能满足。vue路由权限数据不好组装,不能灵活配置vue页面

2023-09-08

Google 开发者在线课程 开始学习 人人站 CMSv1.4.8已经正式上线,本次更新增加了新插件与部分文章功能,具体更新内容如下: 1、[新增]文章内容分页展示功能 2、[修复]模板文件编辑可以打开代码文件的bug 3、[修复]后台添加管

2024-02-27

春节序曲奏响创新华章,紧锣密鼓的工作节奏下,开放签支持移动端签署啦! 在这个万家灯火的春节之际,开放签团队凭借高效的团队协作,在节日的热烈氛围中成功推出了全新版本(企业版1.5版),本次版本升级主要涉及到