文章目录
手把手教你区块链java开发智能合约nft-第二篇(部署第一个NFT智能合约)
刚搞区块链开发真的是太累了,自己摸石头过河,动不动就报错,网上搜索错误,一律看不出什么问题,或者报错的信息太少,问同事同事不鸟,问领导,领导也烦,无奈,对于英文不好的我,只能被迫去看英文文档了,企图找出java开发的方法
在阅读本文之前,建议先阅读我的上一篇文章
手把手教你区块链java开发智能合约nft-第一篇
在这篇文章中,主要介绍如何搭建基本的环境,和如何将solidity编写出来的智能合约,通过tuffle编译转为json,最后转为java代码。
将智能合约java代码拷贝到自己的工程目录下
从上篇文章:
手把手教你区块链java开发智能合约nft-第一篇
的教程方法中操作,得到的java 文件,如NFT721.java
拷贝到自己项目工程对应的包目录下,包目录具体放哪里都可以,像平常写java代码一样用就好,没有限制
引入web3j 依赖
java开发基本上都是用web3j 进行RPC远程调用链上开发,为什么要用web3j,主要是web3j封装了很多关于web3的远程调用操作,也是区块链开发比较成熟的框架
<dependency>
<groupId>org.web3j</groupId>
<artifactId>core</artifactId>
<version>4.8.7</version>
</dependency>
调用智能合约部署到私链
@Test
public void deployNFT721() throws Exception {
BigInteger chainId = web3j.ethChainId().send().getChainId();
System.out.println("chainId::"+chainId);
RawTransactionManager transactionManager = new RawTransactionManager(web3j, getCredentials(),chainId.longValue());
NFT721 nft721 = NFT721.deploy(web3j,transactionManager,new StaticGasProvider(BigInteger.valueOf(22_000_000_000l),BigInteger.valueOf(6_700_000l)),
"NFT721.01","harry","0x849997c5fb88d45bd3471ace2e25e0db76eee7d2","ipfs://","ipfs://").send();
//0xc095782ebd324bc9619dfa3e388eada85398179d
System.out.println("contractAddress::"+nft721.getContractAddress());
String contractURI = nft721.contractURI().send();
System.out.println("contractURI::"+contractURI);
String tokenURIPrefix = nft721.tokenURIPrefix().send();
System.out.println("tokenURIPrefix:::"+tokenURIPrefix);
}
我这里执行后,生成的合约地址是0xc095782ebd324bc9619dfa3e388eada85398179d
每执行一次部署,都会得到一个新的合约地址,部署一般执行一次就可以了,除非你需要多个合约,才需要部署多次
我这里解析一下,NFT721部署方法的参数是什么?为什么要这么写?这个其实要结合solidity编写的智能合约定义入参的。我这个NFT721智能合约,也是从别人开源框架那拷贝过来用的,让我自己写solidity,我也写不出来。如果读者也想要,可以评论区留言,我看到了会回复你的。
从链上查询已经部署的合约
@Test
public void read() throws Exception {
//部署完智能合约后得到合约地址
String contractAddress="0xc095782ebd324bc9619dfa3e388eada85398179d";
TransactionManager transactionManager = new ReadonlyTransactionManager(web3j,contractAddress);
NFT721 nft721 = NFT721.load(contractAddress,web3j,transactionManager,new DefaultGasProvider());
System.out.println("contractAddress::"+nft721.getContractAddress());
String contractURI = nft721.contractURI().send();
System.out.println("contractURI::"+contractURI);
String tokenURIPrefix = nft721.tokenURIPrefix().send();
System.out.println("tokenURIPrefix:::"+tokenURIPrefix);
BigInteger totalSupply = nft721.totalSupply().send();
System.out.println("totalSupply::"+totalSupply);
}
完整代码
public class NFT721Test {
//我这里的案例是使用truffle搭建起来的私链,上篇文章中关于truffle的文章链接有介绍如何搭建truffle私链
Web3j web3j = Web3j.build(new HttpService("http://192.168.159.101:9545/"));
@Test
public void deployNFT721() throws Exception {
BigInteger chainId = web3j.ethChainId().send().getChainId();
System.out.println("chainId::"+chainId);
RawTransactionManager transactionManager = new RawTransactionManager(web3j, getCredentials(),chainId.longValue());
NFT721 nft721 = NFT721.deploy(web3j,transactionManager,new StaticGasProvider(BigInteger.valueOf(22_000_000_000l),BigInteger.valueOf(6_700_000l)),
"NFT721.01","harry","0x849997c5fb88d45bd3471ace2e25e0db76eee7d2","ipfs://","ipfs://").send();
//0xc095782ebd324bc9619dfa3e388eada85398179d
System.out.println("contractAddress::"+nft721.getContractAddress());
String contractURI = nft721.contractURI().send();
System.out.println("contractURI::"+contractURI);
String tokenURIPrefix = nft721.tokenURIPrefix().send();
System.out.println("tokenURIPrefix:::"+tokenURIPrefix);
}
private Credentials getCredentials () {
return Credentials.create("0xade1a7bc3c13f22433872987bb233014a62e6b76abef4482e464a2ea555c31f5");
}
@Test
public void read() throws Exception {
//部署完智能合约后得到合约地址
String contractAddress="0xc095782ebd324bc9619dfa3e388eada85398179d";
TransactionManager transactionManager = new ReadonlyTransactionManager(web3j,contractAddress);
NFT721 nft721 = NFT721.load(contractAddress,web3j,transactionManager,new DefaultGasProvider());
System.out.println("contractAddress::"+nft721.getContractAddress());
String contractURI = nft721.contractURI().send();
System.out.println("contractURI::"+contractURI);
String tokenURIPrefix = nft721.tokenURIPrefix().send();
System.out.println("tokenURIPrefix:::"+tokenURIPrefix);
BigInteger totalSupply = nft721.totalSupply().send();
System.out.println("totalSupply::"+totalSupply);
}
}
到这里,第一个NFT智能合约部署完成了