热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java智能合约工具包|Java调用智能合约|Java调用ERC20、ERC721、ERC1155合约

Magician-ContractsTools是一个用于调用智能合约的工具包,你可以非常容易地在Java程序中调用智能合约进行查询和写入操作。有三个内置的标准合约模板

Magician-ContractsTools是一个用于调用智能合约的工具包,你可以非常容易地在Java程序中调用智能合约进行查询和写入操作。

有三个内置的标准合约模板,分别是ERC20、ERC721和ERC1155,如果你需要调用这三个合约中的标准函数,可以帮助你非常快速地完成工作。除了内置的合同模板外,如果你需要调用自定义的合同函数也是很容易的。


一、导入依赖

<dependency><groupId>com.github.yuyenews</groupId><artifactId>Magician-ContractsTools</artifactId><version>1.0.0</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>

二、合约查询 以及 写入

String privateKey &#61; ""; // 私钥
Web3j web3j &#61; Web3j.build(new HttpService("https://data-seed-prebsc-1-s1.binance.org:8545/")); // 链的RPC地址
String contractAddress &#61; "";EthContractUtil ethContractUtil &#61; EthContractUtil.builder(web3j);// 查询
List<Type> result &#61; ethContractUtil.select(contractAddress, // 合约地址EthAbiCodecTool.getInputData("balanceOf", // 要调用的方法名称new Address(toAddress) // 方法的参数&#xff0c;如果有多个&#xff0c;可以继续传入下一个参数), // 要调用的方法的inputDatanew TypeReference<Uint256>() {} // 方法的返回类型&#xff0c;如果有多个返回值&#xff0c;可以继续传入下一个参数);// 往合约里写入数据
// gasPrice&#xff0c;gasLimit 两个参数&#xff0c;如果想用默认值可以不传&#xff0c;或者传null
// 如果不传的话&#xff0c;两个参数都必须不传&#xff0c;要传就一起传&#xff0c; 如果设置为null的话&#xff0c;可以一个为null&#xff0c;一个有值
SendResultModel sendResultModel &#61; ethContractUtil.sendRawTransaction(senderAddress, // 调用者的地址contractAddress, // 合约地址privateKey, // senderAddress的私钥new BigInteger("1200000"), // gasPrice&#xff0c;如果想用默认值 可以直接传null&#xff0c;或者不传这个参数new BigInteger("800000"), // gasLimit&#xff0c;如果想用默认值 可以直接传null&#xff0c;或者不传这个参数EthAbiCodecTool.getInputData("transfer", // 要调用的方法名称new Address(toAddress), // 方法的参数&#xff0c;如果有多个&#xff0c;可以继续传入下一个参数new Uint256(new BigInteger("1000000000000000000")) // 方法的参数&#xff0c;如果有多个&#xff0c;可以继续传入下一个参数) // 要调用的方法的inputData);sendResultModel.getEthSendTransaction(); // 发送交易后的结果
sendResultModel.getEthGetTransactionReceipt(); // 交易成功上链后的结果

三、调用ERC20合约

查询

提供合约地址查询view方法&#xff0c;比如totalSupply总量&#xff0c;balanceOf余额&#xff0c;allowance授权等信息。

Web3j web3j &#61; Web3j.build(new HttpService("https://data-seed-prebsc-2-s1.binance.org:8545"));String contractAddress &#61; "";ERC20Contract erc20Contract &#61; ERC20Contract.builder(web3j, contractAddress);// 调用合约的 totalSupply 函数
BigInteger total &#61; erc20Contract.totalSupply();// 调用合约的 balanceOf 函数
BigInteger amount &#61; erc20Contract.balanceOf("0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84");// 调用合约的 allowance 函数
BigInteger amount &#61; erc20Contract.allowance("0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", "0x552115849813d334C58f2757037F68E2963C4c5e");

写入

可以发起transfertransferFrom等函数&#xff0c;可自定义gasPricegasLimit等参数值。交易发起成功后可查询交易结果。

Web3j web3j &#61; Web3j.build(new HttpService("https://data-seed-prebsc-2-s1.binance.org:8545"));String contractAddress &#61; "";ERC20Contract erc20Contract &#61; ERC20Contract.builder(web3j, contractAddress);// 调用合约的 transfer 函数
SendResultModel sendResultModel &#61; erc20Contract.transfer("0x552115849813d334C58f2757037F68E2963C4c5e", // 转账接收人new BigInteger("1000000000000000000"), // 转账金额"0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 调用者的地址"", // 调用者的私钥null, // gasPrice&#xff0c;如果传null&#xff0c;自动使用默认值null // gasLimit&#xff0c;如果传null&#xff0c;自动使用默认值);
sendResultModel.getEthSendTransaction(); // 发送交易后的结果
sendResultModel.getEthGetTransactionReceipt(); // 交易成功上链后的结果// 调用合约的 transferFrom 函数
SendResultModel sendResultModel &#61; erc20Contract.transferFrom("0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 转账付款人"0x552115849813d334C58f2757037F68E2963C4c5e", // 转账接收人new BigInteger("1000000000000000000"), // 转账金额"0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 调用者的地址"", // 调用者的私钥null, // gasPrice&#xff0c;如果传null&#xff0c;自动使用默认值null // gasLimit&#xff0c;如果传null&#xff0c;自动使用默认值);
sendResultModel.getEthSendTransaction(); // 发送交易后的结果
sendResultModel.getEthGetTransactionReceipt(); // 交易成功上链后的结果// 调用合约的 approve 函数
SendResultModel sendResultModel &#61; erc20Contract.approve("0x552115849813d334C58f2757037F68E2963C4c5e", // 被授权人new BigInteger("1000000000000000000"), // 授权金额"0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 调用者的地址"", // 调用者的私钥null, // gasPrice&#xff0c;如果传null&#xff0c;自动使用默认值null // gasLimit&#xff0c;如果传null&#xff0c;自动使用默认值);
sendResultModel.getEthSendTransaction(); // 发送交易后的结果
sendResultModel.getEthGetTransactionReceipt(); // 交易成功上链后的结果

四、调用ERC721合约

查询

Web3j web3j &#61; Web3j.build(new HttpService("https://data-seed-prebsc-2-s1.binance.org:8545"));String contractAddress &#61; "";ERC721Contract erc721Contract &#61; ERC721Contract.builder(web3j, contractAddress);// 调用合约的 balanceOf 函数
BigInteger amount &#61; erc20Contract.balanceOf("0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84");// 调用合约的 ownerOf 函数
String ownerAddress &#61; erc721Contract.ownerOf(new BigInteger("1002"));// 调用 isApprovedForAll 函数
Boolean result &#61; erc1155Contract.isApprovedForAll("0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", "0x552115849813d334C58f2757037F68E2963C4c5e");// 调用 getApproved 函数
String approvedAddress &#61; erc721Contract.getApproved(new BigInteger("1002"));

写入

Web3j web3j &#61; Web3j.build(new HttpService("https://data-seed-prebsc-2-s1.binance.org:8545"));String contractAddress &#61; "";ERC721Contract erc721Contract &#61; ERC721Contract.builder(web3j, contractAddress);// 调用 approve 函数
SendResultModel sendResultModel &#61; erc721Contract.approve("0x552115849813d334C58f2757037F68E2963C4c5e", // 被授权人new BigInteger("1002"), // 授权的tokenId"0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 调用者的地址"", // 调用者的私钥null, // gasPrice&#xff0c;如果传null&#xff0c;自动使用默认值null // gasLimit&#xff0c;如果传null&#xff0c;自动使用默认值);
sendResultModel.getEthSendTransaction(); // 发送交易后的结果
sendResultModel.getEthGetTransactionReceipt(); // 交易成功上链后的结果// 调用合约的 transferFrom 函数
SendResultModel sendResultModel &#61; erc20Contract.transferFrom("0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 转账付款人"0x552115849813d334C58f2757037F68E2963C4c5e", // 转账接收人new BigInteger("1002"), // tokenId"0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 调用者的地址"", // 调用者的私钥null, // gasPrice&#xff0c;如果传null&#xff0c;自动使用默认值null // gasLimit&#xff0c;如果传null&#xff0c;自动使用默认值);
sendResultModel.getEthSendTransaction(); // 发送交易后的结果
sendResultModel.getEthGetTransactionReceipt(); // 交易成功上链后的结果// 调用合约的 safeTransferFrom 函数(没有data参数的那个)
SendResultModel sendResultModel &#61; erc20Contract.safeTransferFrom("0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 转账付款人"0x552115849813d334C58f2757037F68E2963C4c5e", // 转账接收人new BigInteger("1002"), // tokenId"0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 调用者的地址"", // 调用者的私钥null, // gasPrice&#xff0c;如果传null&#xff0c;自动使用默认值null // gasLimit&#xff0c;如果传null&#xff0c;自动使用默认值);
sendResultModel.getEthSendTransaction(); // 发送交易后的结果
sendResultModel.getEthGetTransactionReceipt(); // 交易成功上链后的结果// 调用合约的 safeTransferFrom 函数(有data参数的那个)
SendResultModel sendResultModel &#61; erc20Contract.safeTransferFrom("0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 转账付款人"0x552115849813d334C58f2757037F68E2963C4c5e", // 转账接收人new BigInteger("1002"), // tokenIdnew byte[0], // data"0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 调用者的地址"", // 调用者的私钥null, // gasPrice&#xff0c;如果传null&#xff0c;自动使用默认值null // gasLimit&#xff0c;如果传null&#xff0c;自动使用默认值);
sendResultModel.getEthSendTransaction(); // 发送交易后的结果
sendResultModel.getEthGetTransactionReceipt(); // 交易成功上链后的结果// 调用 setApprovalForAll 函数
SendResultModel sendResultModel &#61; erc1155Contract.setApprovalForAll("0x552115849813d334C58f2757037F68E2963C4c5e", // 被授权人true, // 是否授权全部"0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 调用者的地址"", // 调用者的私钥null, // gasPrice&#xff0c;如果传null&#xff0c;自动使用默认值null // gasLimit&#xff0c;如果传null&#xff0c;自动使用默认值);
sendResultModel.getEthSendTransaction(); // 发送交易后的结果
sendResultModel.getEthGetTransactionReceipt(); // 交易成功上链后的结果

五、调用ERC1155合约

查询

Web3j web3j &#61; Web3j.build(new HttpService("https://data-seed-prebsc-2-s1.binance.org:8545"));String contractAddress &#61; "";ERC1155Contract erc1155Contract &#61; ERC1155Contract.builder(web3j, contractAddress);// 调用 balanceOf 函数
BigInteger amount &#61; erc1155Contract.balanceOf("0x552115849813d334C58f2757037F68E2963C4c5e", new BigInteger("0"));// 调用 balanceOfBatch 函数
List<String> address &#61; new ArrayList<>();
address.add("0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84");
address.add("0x552115849813d334C58f2757037F68E2963C4c5e");List<BigInteger> tokenId &#61; new ArrayList<>();
tokenId.add(new BigInteger("0"));
tokenId.add(new BigInteger("0"));List<BigInteger> amounts &#61; erc1155Contract.balanceOfBatch(address, tokenId);// 调用 isApprovedForAll 函数
Boolean result &#61; erc1155Contract.isApprovedForAll("0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", "0x552115849813d334C58f2757037F68E2963C4c5e");

写入

Web3j web3j &#61; Web3j.build(new HttpService("https://data-seed-prebsc-2-s1.binance.org:8545"));String contractAddress &#61; "";ERC1155Contract erc1155Contract &#61; ERC1155Contract.builder(web3j, contractAddress);// 调用 setApprovalForAll 函数
SendResultModel sendResultModel &#61; erc1155Contract.setApprovalForAll("0x552115849813d334C58f2757037F68E2963C4c5e", // 被授权人true, // 是否授权全部"0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 调用者的地址"", // 调用者的私钥null, // gasPrice&#xff0c;如果传null&#xff0c;自动使用默认值null // gasLimit&#xff0c;如果传null&#xff0c;自动使用默认值);
sendResultModel.getEthSendTransaction(); // 发送交易后的结果
sendResultModel.getEthGetTransactionReceipt(); // 交易成功上链后的结果// 调用 safeTransferFrom 函数
SendResultModel sendResultModel &#61; erc1155Contract.safeTransferFrom("0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 转账付款人"0x552115849813d334C58f2757037F68E2963C4c5e", // 转账接收人new BigInteger("1002"), // tokenIdnew BigInteger("1"), // 数量new byte[0], // data"0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 调用者的地址"", // 调用者的私钥null, // gasPrice&#xff0c;如果传null&#xff0c;自动使用默认值null // gasLimit&#xff0c;如果传null&#xff0c;自动使用默认值);
sendResultModel.getEthSendTransaction(); // 发送交易后的结果
sendResultModel.getEthGetTransactionReceipt(); // 交易成功上链后的结果// 调用 safeBatchTransferFrom 函数
List<BigInteger> tokenIds &#61; new ArrayList<>();
tokenIds.add(new BigInteger("1002"));
tokenIds.add(new BigInteger("1003"));List<BigInteger> amounts &#61; new ArrayList<>();
amounts.add(new BigInteger("1"));
amounts.add(new BigInteger("10"));SendResultModel sendResultModel &#61; erc1155Contract.safeBatchTransferFrom("0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 转账付款人"0x552115849813d334C58f2757037F68E2963C4c5e", // 转账接收人tokenIds, // tokenId 集合amounts, // 数量 集合new byte[0], // data"0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 调用者的地址"", // 调用者的私钥null, // gasPrice&#xff0c;如果传null&#xff0c;自动使用默认值null // gasLimit&#xff0c;如果传null&#xff0c;自动使用默认值);
sendResultModel.getEthSendTransaction(); // 发送交易后的结果
sendResultModel.getEthGetTransactionReceipt(); // 交易成功上链后的结果

六、InputData 编解码

// 编码
String inputData &#61; EthAbiCodecTool.getInputData("transfer", // 方法名new Address(toAddress), // 参数1new Uint256(new BigInteger("1000000000000000000")) // 参数2&#xff0c;如果还有其他参数&#xff0c;可以继续传入下一个);// 解码
List<Type> result &#61; EthAbiCodecTool.decoderInputData("0x" &#43; inputData.substring(10), // 去除方法签名的inputDatanew TypeReference<Address>() {}, // 被编码的方法的参数1 类型new TypeReference<Uint256>() {} // 被编码的方法的参数2 类型&#xff0c; 如果还有其他参数&#xff0c;可以继续传入下一个);for(Type type : result){System.out.println(type.getValue());
}// 获取方法签名&#xff0c;其实就是inputData的前十位
String functionCode &#61; EthAbiCodecTool.getFunAbiCode("transfer", // 方法名new Address(toAddress), // 参数1&#xff0c;值随意传&#xff0c;反正我们要的方法签名&#xff0c;不是完整的inputDatanew Uint256(new BigInteger("1000000000000000000")) // 参数2&#xff0c;值随意传&#xff0c;反正我们要的方法签名&#xff0c;不是完整的inputData&#xff0c;如果还有其他参数&#xff0c;可以继续传入下一个);

七、主链币查询以及转账

提供地址的私钥可以完成对该钱包的余额查询和发起转账等操作。

String privateKey &#61; ""; // 私钥
Web3j web3j &#61; Web3j.build(new HttpService("https://data-seed-prebsc-1-s1.binance.org:8545/")); // 链的RPC地址// 这种方式是单例的
EthHelper ethHelper &#61; MagicianWeb3.getEthBuilder().getEth(web3j);
// 如果你想创建多个EthHelper对象&#xff0c;可以用这种方式
EthHelper ethHelper &#61; EthHelper.builder(web3j);// 余额查询
BigInteger balance &#61; ethHelper.balanceOf(fromAddress);// 转账
TransactionReceipt transactionReceipt &#61; ethHelper.transfer(toAddress,privateKey, BigDecimal.valueOf(1),Convert.Unit.ETHER
);


推荐阅读
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
author-avatar
莫念暧昧_zTq
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有