文章目录
手把手教你区块链java开发智能合约nft-第五篇(铸造第一个NFT)
回顾
初学区块链,那真叫一个痛苦并无助。如果没有人带你的话
今天写的这篇是在前面文章基础上写的,初学区块链的朋友建议先看我前面写的文章
手把手教你区块链java开发智能合约nft-第一篇
手把手教你区块链java开发智能合约nft-第二篇(部署第一个NFT智能合约)
手把手教你区块链java开发智能合约nft token-第三篇(部署token)
手把手教你区块链java开发智能合约nft(第四篇)-如何动态获取gasPrice和gasLimit?
部署NFT721
关于部署NFT721 ,可以参考之前的文章:
手把手教你区块链java开发智能合约nft-第二篇(部署第一个NFT智能合约)
部署完成后,将得到一个NFT721的智能合约地址:contractAddress,这个智能合约地址值需要保存好,待会铸造NFT时需要用到它
比如我在部署合约完成后,得到的contractAddress值为:0x1fc51bf18b49d29f7a40825914e8c68f4ce7b255
铸造NFT
铸造NFT也是比较简单的,直接调用NFT721 的方法mint 就可以了,主要难点是在对数据的签名上
直接上代码吧
@Test
public void mint() throws Exception {
//NFT721合约地址
String contractAddress="0x1fc51bf18b49d29f7a40825914e8c68f4ce7b255";
String tokenId="2"; //上链的NFT id
String tokenURI="/static/uploadQmVJoMsgcsCCz75ZHzup7e8boqhBz9R8SKYwKknFEWamzA.png"; //上链的tokenId对应的值
//铸造NFT需要用到的私钥,在部署合约时指定的地址对应的私钥
String miner="0x5369576889297382912123166219811286283737728368986117127236719812";
TransactionManager transactionManager = getRawTransactionManager();
ContractGasProvider contractGasProvider = getContractGasProvider();
NFT721 nft721 = NFT721.load(contractAddress, web3j, transactionManager, contractGasProvider);
Credentials credentials = getCredentials();
ECKeyPair ecKeyPair = ECKeyPair.create(Numeric.hexStringToByteArray(miner));
Type<BigInteger> tId = new Uint(new BigInteger(tokenId));
String a = contractAddress + Numeric.cleanHexPrefix(TypeEncoder.encode(tId));
a = Hash.sha3(a);
byte[] b = Numeric.hexStringToByteArray(a);
Sign.SignatureData data = Sign.signPrefixedMessage(b, ecKeyPair);
ArrayList<NFT721.Fee> fees = Lists.newArrayList(new NFT721.Fee(credentials.getAddress(), BigInteger.valueOf(200)));
TransactionReceipt transactionReceipt = nft721.mint(new BigInteger(tokenId), new BigInteger(data.getV()), data.getR()