zl程序教程

您现在的位置是:首页 >  其他

当前栏目

马蹄链NFT智能合约系统开发丨技术分析

技术系统智能开发 分析 合约 NFT 马蹄
2023-06-13 09:14:49 时间

  Matic Network是一种基于侧链的公共区块链扩展解决方案。它的基础是Plasma框架的调整实施。Matic提供了可扩展性,同时以安全和分散的方式确保了卓越的用户体验。它在KovanTestnet上为Etalum提供了一个工作实现。Matic打算在未来支持其他区块链,这将使它能够提供互操作性功能,同时为现有的公共区块链提供可伸缩性。

  Matic计划在未来支持其他区块链,这将使其能够提供互操作性功能,同时为现有公共区块链提供可扩展性。

  使用侧链进行可扩展,安全和即时的区块链交易,同时使用Plasma框架和去中心化网络的权益证明(PoS)验证器确保资产安全。

  ​​Web3.0”是对“Web2.0”的改进,在此环境下,用户不必在不同中心化的平台创建多种身份,而是能打造一个去中心化的通用数字身份体系,通行各个平台。

  Web3.0被用来描述互联网潜在的下一阶段,一个运行在“区块链”技术之上的“去中心化”的互联网。

NFT智能合约

我们将使用OpenZeppelin来编写智能合约,该合约是基于ERC-721实现。因此我们需要安装OpenZeppelin的智能合约库。在项目根目录执行如下命令:

npm install @openzeppelin/contracts

1

安装好openZeppelin后,我们就可以开始编写智能合约了。打开contracts文件夹并创建一个新的文件NFT.sol,该合约文件非常简单,让我们看一下具体内容:

pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MyNFT is ERC721, Ownable {
    using Counters for Counters.Counter;
    using Strings for uint256;
    Counters.Counter private _tokenIds;
    mapping (uint256 => string) private _tokenURIs;
constructor() ERC721("MyNFT", "MNFT") {}
function _setTokenURI(uint256 tokenId, string memory _tokenURI)internalvirtual{_tokenURIs[tokenId] = _tokenURI;}
function tokenURI(uint256 tokenId) public view virtual override returns (string memory){
    require(_exists(tokenId), 
    "ERC721Metadata: URI query for nonexistent token"
    );
    string memory _tokenURI = _tokenURIs[tokenId];
    return _tokenURI;
    }
function mint(address recipient, string memory uri)public returns (uint256){
    _tokenIds.increment();
    uint256 newItemId = _tokenIds.current();
    _mint(recipient, newItemId);
    _setTokenURI(newItemId, uri);
    return newItemId;
    }
}

由于我们使用了OpenZeppelin的ERC721合约,因此只需要很少的代码。

第一行定义了我们使用的solidiy的版本。

接下来的三行代码引入所需的OpenZeppelin合约,其中ERC-721合约是最重要的。 有了这些合约,我们编写智能合约的效率就大大提高了。

接下来我们定义contract名为MyNFT,它继承自OpenZeppeline提供的ERC721和Ownable合约。

然偶定义一些变量。Counters和Strings用来帮助计数以及将数据转换为字符串,然后我们定义一个变量来保存下一个token的ID。最后,我们定义一个从通证ID到通证URI的映射表。

引入声明和变量定义完成后,我们可以开始实质性的代码了。构造函数实际上就是定义下通证名称和符号。

在最近的OpenZeppelin更新中,其ERC-721合约不再内置setTokenURI函数。这一选择 的初衷可能是减少用户部署合约的gas成本,不过我们还需要这个函数。

没关系,我们可以自己实现。这就是第一个函数的功能。函数_setTokenURI传入参数通证ID 和通证URI,然后将其添加到映射表中。

通过上述操作,我们现在可以使用tokenURI方法返回通证URI的值。这一点很重要,因为这个URI指向了NFT的全部元数据,例如名称、属性以及资产自身。我们必须确保URI保存下来并能够返回给任何对此感兴趣的人。

const { expect } = require("chai");
describe("NFT", function() {
	it("It should deploy the contract, mint a token, and resolve to the right URI", async function() {const NFT = await ethers.getContractFactory("MyNFT");
	const nft = await NFT.deploy();
	const URI = "ipfs://QmWJBNeQAm9Rh4YaW8GFRnSgwa4dN889VKm9poc2DQPBkv";
	await nft.deployed();
	await nft.mint("0xd72203a26D887b60Af3a11178eF4A48BE8DecbA6", URI)expect(await nft.tokenURI(1)).to.equal(URI)});
	});