下一代互联网鉴权系统——NFT

696 阅读3分钟

NFT介绍

我想玩过大厂数字藏品的应该了解过一点NFT,非同质化代币(英语:Non-Fungible Token,简称:NFT)。但大厂的那些数字藏品,还无法在市场上自由交易,所以本质和图片没有什么区别。是的,你买了就真的只是收藏,除非以后开放交易和编程相关的功能。

今天我就带你看看什么是真正的NFT,真正的NFT一定是建立在去中心化的区块链公链上的,哪怕是一条从以太坊copy出来的以太坊兼容链,比如Polygon,那也是真正的NFT。

通过fair.xyz铸造自己的NFT

首先打开fair.xyz/ 官网,需要一定的英语基础。

截屏2025-01-09 01.09.29.png

截屏2025-01-09 01.10.50.png

铸造过程按界面一步一步操作就可以了,发行NFT时可以限制NFT集合的数量,单个、固定数量和可无限增发的模式。最后点击Metamask小狐狸钱包的确认使用POL代币发起铸造。这时还不是真正的铸造。你可以设定一个交易价格,等待买方购买进行铸造。

截屏2025-01-09 01.15.57.png

点击分享按钮,把铸币信息分享出去。

截屏2025-01-09 01.17.06.png

买方点击Mint就可以进行铸造了,fair.xyz收取2.5MATIC的手续费,现在MATIC更名为POL了,只是换了个名字而已。

截屏2025-01-09 01.18.40.png

在Metamask中完成支付,就可以铸造成功了,NFT通证就会自动发送到该支付的钱包中。

截屏2025-01-09 01.23.25.png

怎么鉴权

使用智能合约可以进行鉴权。 常用方法有:

  • ownerOf(tokenId) :返回指定 Token ID 的当前所有者。
  • balanceOf(address) :返回某个地址拥有的 NFT 数量。
  • 事件日志:验证 NFT 的铸造、转移记录。

示例代码

pragma solidity ^0.8.0;

interface IERC721 {
    function ownerOf(uint256 tokenId) external view returns (address);
}

contract NFTOwnershipChecker {
    address nftContractAddress;

    constructor(address _nftContractAddress) {
        nftContractAddress = _nftContractAddress;
    }

    function checkOwnership(uint256 tokenId, address user) public view returns (bool) {
        IERC721 nftContract = IERC721(nftContractAddress);
        return nftContract.ownerOf(tokenId) == user;
    }
}

前端结合Web3.js

import { ethers } from "ethers";

async function verifyOwnership(nftContractAddress, tokenId, userAddress) {
    const abi = [
        "function ownerOf(uint256 tokenId) public view returns (address)"
    ];
    const provider = new ethers.providers.Web3Provider(window.ethereum);
    const contract = new ethers.Contract(nftContractAddress, abi, provider);

    const owner = await contract.ownerOf(tokenId);
    return owner.toLowerCase() === userAddress.toLowerCase();
}

// 示例使用
const nftContractAddress = "0xYourNFTContractAddress";
const tokenId = 1;
const userAddress = "0xUserWalletAddress";

verifyOwnership(nftContractAddress, tokenId, userAddress)
    .then(isOwner => console.log(isOwner ? "User owns the NFT" : "User does not own the NFT"))
    .catch(console.error);

后端则采用node.js。

const Web3 = require('web3');
const web3 = new Web3('https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID');

async function isAuthorized(nftContractAddress, tokenId, userAddress) {
    const abi = [
        { "constant": true, "inputs": [{ "name": "tokenId", "type": "uint256" }], "name": "ownerOf", "outputs": [{ "name": "", "type": "address" }], "type": "function" }
    ];
    const contract = new web3.eth.Contract(abi, nftContractAddress);
    const owner = await contract.methods.ownerOf(tokenId).call();
    return owner.toLowerCase() === userAddress.toLowerCase();
}

// 示例使用
isAuthorized("0xYourNFTContractAddress", 1, "0xUserWalletAddress")
    .then(isOwner => console.log(isOwner ? "Access granted" : "Access denied"))
    .catch(console.error);

那么鉴权的代码就如此简单的完成了。

项目如何运作

我们知道这个世界上的资产有钱还有证,NFT就充当这个证件的角色,比如房产证。可以想象一下,当你买了一套房,使用NFT作为房卡的情况。房地产开发商的app可以直接通过NFT调用智能合约代码进行鉴权,然后房门就奇迹般的打开了。而且你一不小心在市场上把房卖了,权限就会转移,这样你就打不开房门了,别人就能打开房门了。你晚上一不小心点了交易,别人神不知鬼不觉的就进来了,是不是很可怕😨。当然这只是一个例子,所有的权限都可以使用这种方式进行转移。另外NFT的发行方还可以收取一定比例的版权费,即每次NFT进行交易,都可以从交易价格中获取一定的手续费,这个过程智能合约自动完成。

总结

目前来说,安全性和稳定性还没有完全得到市场的验证,所以还没有大规模的应用出现,但这个已经可以用在部分场景完全没有问题了。另外对区块链基础概念感兴趣的童鞋可以看我这篇文章juejin.cn/post/719900…