在Android应用程序上铸造NFT(第1部分)
#web3 #android #区块链 #ipfs

介绍

不可杀菌意味着某些东西是唯一的,不能被其他东西代替。以太坊,多边形和IOTA这样的区块链充当真理的来源,并有助于跟踪谁的持有和交易NFT

nft有多种用例,包括音乐,时尚,游戏,豪华商品,荟萃分析,供应链和门票销售。耐克(Nike)最近与Polygon合作,以数字鞋https://decrypt.co/114494/nike-swoosh-web3-platform-polygon-nfts

的形式启动了NFTS的Web3平台

大多数在线博客都展示了如何使用Web应用程序铸造NFT。在此博客中,我们将通过Android应用程序铸造NFT。移动应用程序将部分为Java和Kotlin。

可以找到完整的工作代码here

先决条件

要求:

1.创建智能合同

通过运行创建一个新的松露项目。

truffle init

通过运行在松露项目中安装openzeppelin。

npm install --save-dev @openzeppelin/contracts

在称为lemurNFT.sol的合同/目录中创建智能合约。

// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

import "openzeppelin-solidity/contracts/token/ERC721/ERC721.sol";
import "openzeppelin-solidity/contracts/utils/Counters.sol";
import "openzeppelin-solidity/contracts/token/ERC721/extensions/RRERC721URIStorage.sol";

contract lemurNFT is ERC721URIStorage {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    constructor() public ERC721("lemurNFT", "LMR") {}

    function mintNFT(address recipient, string memory tokenURI)
        public
        returns (uint256)
    {
        _tokenIds.increment();
        uint256 newItemId = _tokenIds.current();
        _mint(recipient, newItemId);
        _setTokenURI(newItemId, tokenURI);

        return newItemId;
    }

在智能合约中:

  • _tokenIds.increment():增加计数器1,从而使代码能够生成唯一的令牌ID。
  • uint256 newItemid = _tokenIds.current()将当前数字分配给_ tokenids new> newitemid newitemid 。。
  • 的新实例
  • _safemint(收件人,newitemid)薄荷 newitemid 并将其分配给收件人(地址)。
  • _setTokenuri(newitemid,tokenuri) sets tokenuri ,我们先前创建了。

2.建立开发环境

通过添加或评论以下部分来配置truffle-config.js文件以使用开发环境。确保启用Websockets。这是因为我们将通过WebSocket连接到我们的节点。

  development: {
      host: "127.0.0.1", // Localhost (default: none)
      port: 8545, // Standard Ethereum port (default: none)
      network_id: "*", // Any network (default: none)
      websocket: true, // Enable EventEmitter interface for web3 (default: false)
    }

3.部署智能合同

要编译智能合约,运行

truffle compile

输出应该看起来类似于

Compiling your contracts...
===========================
> Compiling .\contracts\Migrations.sol
> Compiling .\contracts\lemurNFT.sol
> Compiling openzeppelin-solidity\contracts\token\ERC721\ERC721.sol
> Compiling openzeppelin-solidity\contracts\token\ERC721\IERC721.sol
> Compiling openzeppelin-solidity\contracts\token\ERC721\IERC721Receiver.sol
> Compiling openzeppelin-solidity\contracts\token\ERC721\extensions\ERC721URIStorage.sol
> Compiling openzeppelin-solidity\contracts\token\ERC721\extensions\IERC721Metadata.sol
> Compiling openzeppelin-solidity\contracts\utils\Address.sol
> Compiling openzeppelin-solidity\contracts\utils\Context.sol
> Compiling openzeppelin-solidity\contracts\utils\Counters.sol
> Compiling openzeppelin-solidity\contracts\utils\Strings.sol
> Compiling openzeppelin-solidity\contracts\utils\introspection\ERC165.sol
> Compiling openzeppelin-solidity\contracts\utils\introspection\IERC165.sol
> Compilation warnings encountered:

    Warning: Visibility for constructor is ignored. If you want the contract to be non-deployable, making it "abstract" is sufficient.
  --> project:/contracts/lemurNFT.sol:12:5:
   |
12 |     constructor() public ERC721("lemurNFT", "LMR") {}
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


> Artifacts written to C:\Users\peter\Documents\GitHub\lemur-nft\contract\build\contracts
> Compiled successfully using:
   - solc: 0.8.13+commit.abaa5c0e.Emscripten.clang

通过运行
运行本地节点

ganache

输出应该看起来类似于

ganache v7.5.0 (@ganache/cli: 0.6.0, @ganache/core: 0.6.0)
Starting RPC server

Available Accounts
==================
(0) 0x42703e1F2CCB08583088D96d71d4549Be08b52a7 (1000 ETH)
(1) 0x859e7f120E751C505EB14C942A192eC3448a12a1 (1000 ETH)
(2) 0x2864E9c62dE39c44a97866D31546069fD86DF71E (1000 ETH)
(3) 0x656d2d16C6ad06677A9A87e105e786E9f0420d5c (1000 ETH)
(4) 0x70BDc8926bb41e3a778e3F812Fe18db181aa2602 (1000 ETH)
(5) 0x05A2e3a72a63D2e0A85c7259E3aD6A5b9773cb79 (1000 ETH)
(6) 0x135A6788B85973890d11AdED97a76BfD5acd9F37 (1000 ETH)
(7) 0x19fCd2F3F957b9761e52C5583A14CE2669bbF257 (1000 ETH)
(8) 0xaf47CA6B33E5b895E68D937fDb2CaEEB4e462845 (1000 ETH)
(9) 0x61cDEbBCc8579560A79aaA41936fc553E22615E2 (1000 ETH)

Private Keys
==================
(0) 0xbea5ebe59d051534239ec8e81018b9d2f8458eee5864584d9d520a0c4307de90
(1) 0x5c0fd2fc115d1ab0c8e0ab3f367ac68dcb6e8e9c037a7de791cfba3d50dff993
(2) 0x3d0f2dc97eb7203213c42363f2f2fad34aa4bd0d1029347e72dfad41f900bc2c
(3) 0xa697dc1f7e4d08e899bdbdef17b303048d425bb7bfa712653071f4270fef6a7b
(4) 0x9dd1cccefa2486212ac11cd451d36de3a956ae2be9d4740783b55f94053fa837
(5) 0x1044bba3f188578d08a5c36aae4d4f0bacbfaa60e31e2b96791e5c2b099278a6
(6) 0x02314898ed8983c1c3598e74757bb3e933d4506e4d238706938479f756da8b94
(7) 0x7a7988d32c9a7ab50a9d4d4a9bf5ddf05db49cf2a0f5e196b5fb076d183f4bec
(8) 0xaac1f5cfc3c8ad7c2ed6eb843e0412668e00b4f87e82341bd6090239acb561fe
(9) 0x5b072abfa5a17d7a88fe456867789d0ba97c625e1c969485921765301c916b90

HD Wallet
==================
Mnemonic:      truth manual elephant border predict castle payment suspect mimic insect wish acoustic
Base HD Path:  m/44'/60'/0'/0/{account_index}

Default Gas Price
==================
2000000000

BlockGas Limit
==================
30000000

Call Gas Limit
==================
50000000

Chain Id
==================
1337

RPC Listening on 127.0.0.1:8545

确保您保持过程运行。将种子存放在安全的地方,以后需要为Android应用程序。不要在其他任何地方使用私钥或种子,否则您可能会被黑客入侵。

设置Android配置时,将使用Mnemonic(真相手动大象边境预测城堡付款嫌疑犯模仿声学)。

我们还将使用第一个公共地址 0x42703E1F2CCB08583088D96D71D4549BE08B52A7 作为钱包地址。

运行开发命令以部署智能合约。

truffle migrate --network development

如果成功,它应该显示

Compiling your contracts...
===========================
> Compiling .\contracts\Migrations.sol
> Compiling .\contracts\lemurNFT.sol
> Compiling openzeppelin-solidity\contracts\token\ERC721\ERC721.sol
> Compiling openzeppelin-solidity\contracts\token\ERC721\IERC721.sol
> Compiling openzeppelin-solidity\contracts\token\ERC721\IERC721Receiver.sol
> Compiling openzeppelin-solidity\contracts\token\ERC721\extensions\ERC721URIStorage.sol
> Compiling openzeppelin-solidity\contracts\token\ERC721\extensions\IERC721Metadata.sol
> Compiling openzeppelin-solidity\contracts\utils\Address.sol
> Compiling openzeppelin-solidity\contracts\utils\Context.sol
> Compiling openzeppelin-solidity\contracts\utils\Counters.sol
> Compiling openzeppelin-solidity\contracts\utils\Strings.sol
> Compiling openzeppelin-solidity\contracts\utils\introspection\ERC165.sol
> Compiling openzeppelin-solidity\contracts\utils\introspection\IERC165.sol
> Compilation warnings encountered:

    Warning: Visibility for constructor is ignored. If you want the contract to be non-deployable, making it "abstract" is sufficient.
  --> project:/contracts/lemurNFT.sol:12:5:
   |
12 |     constructor() public ERC721("lemurNFT", "LMR") {}
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


> Artifacts written to C:\Users\peter\Documents\GitHub\lemur-nft\contract\build\contracts
> Compiled successfully using:
   - solc: 0.8.13+commit.abaa5c0e.Emscripten.clang


Starting migrations...
======================
> Network name:    'development'
> Network id:      1668618749782
> Block gas limit: 30000000 (0x1c9c380)


1_deploy_contract.js
====================

   Deploying 'lemurNFT'
   --------------------
   > transaction hash:    0xbe14c78e8b59c002e2537a3cbc9a4f616fbbddafd94f4722a59c719d42137860
   > Blocks: 0            Seconds: 0
   > contract address:    0x129Ff5b9D7C128527F3Be5ca5fb4F2E7A991482d
   > block number:        1
   > block timestamp:     1668618761
   > account:             0x7b2D85916C1fc56BBa4706DF0cE1D86532fB3839
   > balance:             999.99153599275
   > gas used:            2507854 (0x26444e)
   > gas price:           3.375 gwei
   > value sent:          0 ETH
   > total cost:          0.00846400725 ETH

   > Saving artifacts
   -------------------------------------
   > Total cost:       0.00846400725 ETH


1_initial_migration.js
======================

   Deploying 'Migrations'
   ----------------------
   > transaction hash:    0x7d4912cdabd080e6d49d0b244a88f86de933f61d491c76ef2847c133626e2d11
   > Blocks: 0            Seconds: 0
   > contract address:    0x12365fE3BA0F866A6E392BD3614B4322D73244C3
   > block number:        2
   > block timestamp:     1668618762
   > account:             0x7b2D85916C1fc56BBa4706DF0cE1D86532fB3839
   > balance:             999.990714509168638856
   > gas used:            250154 (0x3d12a)
   > gas price:           3.283911436 gwei
   > value sent:          0 ETH
   > total cost:          0.000821483581361144 ETH

   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:     0.000821483581361144 ETH

Summary
=======
> Total deployments:   2
> Final cost:          0.009285490831361144 ETH

确保您存储合同地址(在此示例 0x129FF5B9D7C128527F3BE5CA5CA5CA5FB4F2E7A991482D ),位于 1_deploy_contracts 下,我们将在设置合同地址时使用此 1_deploy_contract 1_deploy_contract

4.设置Websocket

在执行此步骤之前,请确保Ganache正在运行。 Ganache运行后,运行命令:

ngrok http 8545

ngrok将充当前锋代理。它将公开本地网络127.0.0.1:8085,并为您提供一个可以将Android应用程序连接到的网址。响应应该看起来像这样:


ngrok

Add Okta or Azure to protect your ngrok dashboard with SSO: <https://ngrok.com/dashSSO>

Session Status:         online
Account:                P.Okwara (Plan: Free)
Version:                3.1.0
Region:                 United States (us)
Latency:                265ms
Web Interface:          http://127.0.0.1:4040
Forwarding:             <https://550b-105-163-1-231.ngrok.io> -> http://localhost:8545
Connections:            ttl opn rt1 rt5 p50 p90 0 0 0.00 0.00 0.00 0.00

我们将使用转发地址 https://550b-105-163-1-231.ngrok.io 作为Websocket URL。添加到配置时,我们将更改https:将wss更改为WSS,以使我们最终使用的URL看起来像这样:

wss://550b-105-163-1-231.ngrok.io

5.使用IPF配置NFT的元数据

我们的lemurnft智能合约功能采用A tokenuri 参数,该参数应解析为描述NFTS元数据的JSON文档,这实际上是将NFT带入寿命的原因,允许其具有可配置的属性,例如作为名称,描述,图像和其他属性。

行星际文件系统(IPFS)是一个分散的协议和点对点网络,用于在分布式文件系统中存储和共享数据。

我们将使用便捷的IPFS API和工具包Pinata来存储我们的NFT资产和元数据,并确保我们的NFT真正分散。如果您没有Pinata帐户,请注册一个免费帐户here

创建了一个帐户后:

  • 导航到 pinata上传右上角
  • 将图像上传到Pinata-这将是您NFT的图像资产。随意命名您想要的资产
  • 上传后,在页面顶部,应该有一个绿色弹出窗口,使您可以查看上传的哈希 - - > copy hashCode。您可以在以下位置查看您的上传:https://gateway.pinata.cloud/ipfs/https://gateway.pinata.cloud/ipfs/<

在您的根目录中,制作一个名为nft-metadata.json的新文件,并添加以下JSON代码:
nft-metadata.json

{
    "attributes" : [ {
      "trait_type" : "Breed",
      "value" : "Maltipoo"
    }, {
      "trait_type" : "Eye color",
      "value" : "Mocha"
    } ],
    "description" : "The world's most adorable and sensitive pup.",
    "image" : "https://gateway.pinata.cloud/ipfs/QmWmvTJmJU3pozR9ZHFmQC2DNDwi2XJtf3QGyYiiagFSWb",
    "name" : "Ramses"
}

随意更改JSON中的数据。您可以添加或删除属性。最重要的是,请确保图像字段指向IPFS图像的位置,否则您的NFT将不包括照片。

完成编辑JSON文件后,将其保存并将其上传到Pinata,遵循我们上传图像的相同步骤。

还记得您上传到Pinata的 metadata.json 吗?从Pinata获取哈希码。我们将在下一步中使用此哈希和URL。