手把手教你区块链java开发智能合约nft-第五篇(铸造第一个NFT)

这篇具有很好参考价值的文章主要介绍了手把手教你区块链java开发智能合约nft-第五篇(铸造第一个NFT)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

手把手教你区块链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(), data.getS(),
                fees, tokenURI).send();
        System.out.println("mint:hash::"+transactionReceipt.getTransactionHash());
        System.out.println("mint:getContractAddress::"+transactionReceipt.getContractAddress());
    }

关键代码说明:

  • 首先定义了一些传入的参数,这里当做局部变量定义出来
  • 加载智能合约NFT721对象,要用这个对象来调用mint铸造NFT
     NFT721 nft721 = NFT721.load(contractAddress, web3j, transactionManager, contractGasProvider);
  • 对上链数据进行签名
//利用签名账户对应的私钥对上链的tokenId等数据进行签名
 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);
  • 铸造NFT
        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(), data.getS(),
                fees, tokenURI).send();

mint方法参数说明:
public RemoteFunctionCall mint(BigInteger tokenId, BigInteger v, byte[] r, byte[] s, List _fees, String tokenURI)

tokenId:上链的tokenId,或者可以理解为NFT的id,必须保证在链上唯一
v: 签名数据的v
r:签名数据的R
s:签名数据的S
_fees: (我也不太理解具体是什么)从字面上理解是费用信息,

Fee构造方法需要传入两个参数:
public Fee(String recipient, BigInteger value) {
super(new Address(recipient),
new Uint256(value));
this.recipient = recipient;
this.value = value;
}
从命名上看:
recipient : 接受者
value:费用

tokenURI:tokenURI,具体上链的数据,上链后可以通过tokenId查看的数据,一个tokenId需要指定一个tokenURI

执行完以上代码,没有报错的话,等一会就会铸造成功了
这样就完成了NFT的铸造了文章来源地址https://www.toymoban.com/news/detail-401993.html

根据tokenId查看NFT链上数据

    @Test
    public void tokenURI() throws Exception {

        String contractAddress="0x1fc51bf18b49d29f7a40825914e8c68f4ce7b255";
        String tokenId="2";
        TransactionManager transactionManager = getRawTransactionManager();
        ContractGasProvider contractGasProvider = getContractGasProvider();
        NFT721 nft721 = NFT721.load(contractAddress, web3j, transactionManager, contractGasProvider);
        String tokenURI = nft721.tokenURI(new BigInteger(tokenId)).send();
        System.out.println("tokenURI::"+tokenURI);
    }

完整代码

package net.sandboxol.support.deploy.mint;

import net.sandboxol.support.deploy.NFT721;
import net.sandboxol.support.utils.Web3Util;
import org.assertj.core.util.Lists;
import org.junit.Test;
import org.web3j.abi.TypeEncoder;
import org.web3j.abi.datatypes.Type;
import org.web3j.abi.datatypes.Uint;
import org.web3j.crypto.Credentials;
import org.web3j.crypto.ECKeyPair;
import org.web3j.crypto.Hash;
import org.web3j.crypto.Sign;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.core.methods.response.TransactionReceipt;
import org.web3j.protocol.http.HttpService;
import org.web3j.tx.RawTransactionManager;
import org.web3j.tx.TransactionManager;
import org.web3j.tx.gas.ContractGasProvider;
import org.web3j.tx.gas.StaticGasProvider;
import org.web3j.utils.Numeric;

import java.io.IOException;
import java.math.BigInteger;
import java.util.ArrayList;

public class DeployMintTest {
    Web3j web3j = Web3j.build(new HttpService("http://192.168.159.101:8545/"));
	private String userId="214158";
    private String siteId="ishow";
    @Test
    public void mint() throws Exception {

        String contractAddress="0x1fc51bf18b49d29f7a40825914e8c68f4ce7b255";
        String tokenId="2";
        String tokenURI="/static/uploadQmVJoMsgcsCCz75ZHzup7e8boqhBz9R8SKYwKknFEWamzA.png";
        //私钥
        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(), data.getS(),
                fees, tokenURI).send();
        System.out.println("mint:hash::"+transactionReceipt.getTransactionHash());
        System.out.println("mint:getContractAddress::"+transactionReceipt.getContractAddress());
    }


    @Test
    public void tokenURI() throws Exception {

        String contractAddress="0x1fc51bf18b49d29f7a40825914e8c68f4ce7b255";
        String tokenId="1";
        TransactionManager transactionManager = getRawTransactionManager();
        ContractGasProvider contractGasProvider = getContractGasProvider();
        NFT721 nft721 = NFT721.load(contractAddress, web3j, transactionManager, contractGasProvider);
        String tokenURI = nft721.tokenURI(new BigInteger(tokenId)).send();
        System.out.println("tokenURI::"+tokenURI);
    }

    private Credentials getCredentials () {
    //这个Web3Util 是自己定义的工具,能根据userId和siteId生成Credentials 对象的工具,大家可以自己构造,我这个有其他依赖,不方便提供源码
        return Web3Util.getUserCredentials(userId,siteId);
    }

    private TransactionManager getRawTransactionManager() throws IOException {
        BigInteger chainId = web3j.ethChainId().send().getChainId();
        return new RawTransactionManager(web3j, getCredentials(),chainId.longValue());
    }

    private ContractGasProvider getContractGasProvider(){
        return new StaticGasProvider(BigInteger.valueOf(22_000_000_000l),BigInteger.valueOf(6_700_000l));
    }
}

NFT721 相关智能合约源码下载

到了这里,关于手把手教你区块链java开发智能合约nft-第五篇(铸造第一个NFT)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 这个人工智能社区火爆了!手把手教你零代码搞定大模型应用开发

            想给自己做个私人定制的旅行攻略,满足个性化的出游需求,还要细致关注到天气、穿衣、老人孩子的作息等等,但太耗时费力怎么办?让AI帮忙搞定。一位开发者在AI Studio星河大模型社区用短短数小时就做好了“旅行规划家”智能应用。像这样的应用,在星河社

    2024年02月07日
    浏览(65)
  • 【Java技术专题】「Guava开发指南」手把手教你如何进行使用Guava工具箱进行开发系统实战指南(基础编程篇)

    Preconditions(前置条件):让方法调用的前置条件判断更简单 。 Guava在Preconditions 类中提供了若干前置条件判断的实用方法,我们强烈建议在 Eclipse 中静态导入这些方法。每个方法都有三个变种: 当方法没有额外参数时,抛出的异常中不包含错误消息,这会使得调用方很难确

    2024年02月07日
    浏览(77)
  • 手把手教你写stm32f103智能风扇

    本系统可以分为两个模式来进行运行,分别为手动模式和自动模式,同时,在上电进入系统后,还会有一个模式选择的界面产生。 模式选择:在此界面中,可以通过按键K1来控制模式选择,两个模式分别为手动模式和自动模式;通过按键K2可以进入模式。 手动模式:在手动模

    2023年04月17日
    浏览(65)
  • 动手实践丨手把手教你用STM32做一个智能鱼缸

    摘要: 本文基于STM32单片机设计了一款基于物联网的智能鱼缸。 本文分享自华为云社区《基于STM32+华为云IOT设计的物联网鱼缸【玩转华为云】》,作者: DS小龙哥 。 为了缓解学习、生活、工作带来的压力,提升生活品质,许多人喜欢在家中、办公室等场所养鱼。为节省鱼友

    2024年01月16日
    浏览(48)
  • 手把手教你配置BSC(币安智能链)网络,只需5分钟

    这里就用小狐狸(Metamask)钱包了,因为本人坚信用狐狸钱包日后可以撸到空投。 1、PC端Chrome浏览器安装metamask钱包插件 要去Metamask官网下载钱包哦,然后把插件添加至Chrome浏览器扩展程序中 这个不会的小伙伴欢迎留言,我可以再出一个教程。 2、打开metamask,找到自定义RP

    2024年02月14日
    浏览(51)
  • 手把手教你5分钟搭建RabbitMq开发环境

    演示环境 1、使用Vagrant 和 VirtualBox创建linux虚拟机 不知道Vagrant怎么使用的可以看这里。 ①在cmd窗口执行命令 vagrant init generic/centos7 ,初始化linux启动环境 ②执行启动命令 vagrant up 启动Linux虚拟机 ③修改当前目录的Vagrantfile文件,为虚拟机配置内网ip,后面登录的时候会用到

    2023年04月12日
    浏览(58)
  • 手把手教你在Windows下搭建Vue开发环境

    最近有小伙伴不会Vue环境的部署,小孟亲自测试了下,大家有需要的可以按照下面的学习。 如果想看视频的,也可以看视频的教程: https://www.bilibili.com/video/BV1if4y1X7BS/?spm_id_from=333.788.recommend_more_video.-1vd_source=e64f225fc5daf048d2687502cb23bb3b 在Windows下搭建Vue开发环境: 官网https://n

    2024年02月08日
    浏览(64)
  • 手把手教你开发第一个HarmonyOS (鸿蒙)移动应用

    移动应⽤开发: Android IOS HarmonyOS (鸿蒙) 文档概览-HarmonyOS应用开发官网 2.1 系统的定义 2.1.1 系统的定位 HarmonyOS有三⼤特征: 搭载该操作系统的设备在系统层⾯融为⼀体、形成超级终端,让设备的硬件能⼒可以弹性 扩展,实现设备之间 硬件互助,资源共享。 对消费者⽽⾔,

    2024年02月02日
    浏览(80)
  • 手把手教你搭建VUE+VScode+elementUI开发环境

    1.安装node.js 按照VUE必须先要安装node.js (1)打开NodeJs官网:https://nodejs.org/en/download/ ,根据系统下载,Windows操作系统一般选择是64-bit。 (2)点击64-bit就开始下载了。 (3)双击安装,安装过程基本直接“NEXT”就可以了。(windows的安装msi文件在过程中会直接添加path的系统变

    2024年02月09日
    浏览(42)
  • 手把手教你成为荣耀开发者:数据报表使用指引

    荣耀开发者服务平台是荣耀面向开发者的统一生态入口,通过聚合周边内外部系统,分全球多站点部署,为全球开发者提供业务全生命周期的商业支撑服务,拥有应用分发、智慧服务、开放能力、HONOR Connect等众多业务等您来合作。 “数据报表”为荣耀开发者提供产品详细的

    2024年02月09日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包