NFT系统开发,NFT开发源码规范,NFT开发教程【含源码】

NFT系统开发,NFT开发源码规范,NFT开发教程【含源码】,第1张

NFT开发源码规范 按需求

一般NFT源码也有几个方面,一个是直接使用模板的,这样的相对来说会比较便宜一些,小程序可能几百几千就可以搞定,商城或者是APP相对来说就要高一些,几万几十万都是可能的,具体需要根据自己的需求,向很快咨询。

2.按功能

功能多了自然就贵了,毕竟是互联网产品。 它不可能在一夜之间完成。 平时的 *** 作和维护都是少不了的。 从前期的UI到写代码以及后期的测试维护等,这些都是少不了的过程。

3.按使用

此外,这取决于你想做什么。 一般电子商务使用起来相对便宜。 如果是餐饮店,就稍微贵一点。 如果要更换APP应用,需要开发、运营、维护、更新,成本较高。

所以看自己的需求,不仅要考虑前期的成本,还要考虑到后期的运维。NFT源码开发属于定制开发,价格比较贵。

主流方式,定制开发为主的网络公司。

优点是:独特,为你的业务或店面定制,功能由你决定,后期修改bug方便,改东西也很方便,最重要的是 永久使用权! !

缺点是:相对价格比较高!!! 定制版的基本成本从几万到几十万不等! 然而,昂贵是有原因的。 毕竟功能比较全面,你所想的基本都能实现。

FT交易所平台将长期存在,NFT帮助区块链技术实现其作为“开展业务的新方法”的潜力,区块链是参与各种交易和合同的各方之间的信任来源。

元宇宙NFT交易所平台项目通过BAYC培育的东西开始了解交叉文化、社区和商业的价值,许多人已经探索了建立自己的方法。

NFT最近爆发了,但这不是近期才出现的。NFT的起源可以追溯到2012年区块链支持的彩色硬币。2017年,CryptoKitties热潮兴起,吸引人们购买cryptocats,NFT真正成为主流。

NFT广泛应用于各个领域:

例如:游戏、艺术、雕塑、土地、人物、视频、音乐,吸引大量收藏家、交易者和创意项目。

NFT开发(成品系统,源码交付,独立部署,快速搭建)

一、数字藏品管理

“区块链+艺术”数字收藏服务生态,针对艺术设计市场推出了专业化的区块链藏品解决方案。

二、数字票务管理

“区块链+票务”数字生态服务,针对票务市场推出的专业化的区块链藏品解决方案。

三、NFT数字盲盒

NFT数字盲盒

四、3D作品数字化

“区块链+3D作品”数字生态服务,针对3D作品市场推出了专业化的区块链藏品解决方案。

五、手账作品数字化

手帐作品属于创意数字作品,区块链+手账的解决方案能够很好的解决作品确权、二次创作溯源、分润等难题,为手账产业数字化赋能。

NFT开发教程【含源码】

深入分析NFT合约源码——以Surge Women为例

github源码地址:https://github.com/youngqqcn/mynft

Surge Women合约地址:0x0632aDCab8F12edD3b06F99Dc6078FE1FEDD32B0

智能合约源码:surge.sol

tokenId: 1802

opensea链接:https://opensea.io/assets/0x0632adcab8f12edd3b06f99dc6078fe1fedd32b0/1802

token mint 交易链接:https://etherscan.io/tx/0xbede5e44cc631303a22d066cc269f989469742b5bb6d9a74185e146dab9211e4

问题1:NFT(non-fungible token),即非同质化代币,如何理解“非同质化”?在代码层面如何实现的?

答:fungible中文意思是“可互换的”,可互换的东西是没有特殊性的,如果是独一无二的东西则具有了“不可互换的”属性。例如,1元钱的硬币和1元钱的纸钞则可以互换,虽然在形态上不同,但是在作为货币的属性上本质相同,都是代表1元。

至于如何编码实现,前面说了non-fungible的东西必须具备“独一无二”的属性,在编程领域什么东西独一无二呢?
答案很简单,就是唯一的id,用一个整数即可,在solidity中uint256能够表示的整数完全够用。

问题2:NFT的图片(或者音频、视频等)是怎样和智能中tokenId一一对应起来的?

图片等资源文件放在IPFS,智能合约中只存储每个token对应的IPFS上的URI即可。每个NFT项目有一个目录,目录下可以放很多资源文件,在构造合约的时候将目录在IPFS上的URI设置为baseURI,那么每个token的资源文件在IPFS的URI就确定了。例如,某个NFT项目在IPFS上总目录的URI为ipfs://QmYVsw73haPgm9jK9BopsuKtzuxLANjYn75xeHLpht13D5,tokenId为1802的token在IPFS上的URI则为ipfs://QmYVsw73haPgm9jK9BopsuKtzuxLANjYn75xeHLpht13D5/1802。

from web3 import Web3
import json

# https://etherscan.io/tx/0xbede5e44cc631303a22d066cc269f989469742b5bb6d9a74185e146dab9211e4
# https://mainnet.infura.io/v3/8a264f274fd94de48eb290d35db030ab
# contract address is 0x0632aDCab8F12edD3b06F99Dc6078FE1FEDD32B0 

from web3 import Web3
my_provider = Web3.HTTPProvider('https://mainnet.infura.io/v3/8a264f274fd94de48eb290d35db030ab')
w3 = Web3(my_provider)

def main():
    
    contract_address = '0x0632aDCab8F12edD3b06F99Dc6078FE1FEDD32B0'
    contract_abi = json.load(open('surge.abi', 'r'))
    # print(contract_abi)

    mycontract = w3.eth.contract(address=contract_address, abi=contract_abi)
    name = mycontract.functions.name().call()
    print(name)

    symbol = mycontract.functions.symbol().call()
    print(symbol)

    tokenURI = mycontract.functions.tokenURI(1802).call()
    print(tokenURI)

    pass

if __name__ == '__main__':
    main()

运行打印的结果是:

Surge Women Passport
SURGE
ipfs://QmYVsw73haPgm9jK9BopsuKtzuxLANjYn75xeHLpht13D5/1802

但是从ipfs浏览器中的链接却是:ipfs/Qmaseu2BbetLjA6eU7mQ2THEkjdBum5wq1EfuLAY2AoiEA/1802.png

分析tokenURI函数的代码

function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

    // baseURI是目录的URI
    string memory baseURI = _baseURI();
    // 将目录的URI和tokenId拼接在一起就是token的URI
    return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : '';
}

而 _baseURI由 Surge合约重写了父合约的_baseURI函数。Surge合约在构造函数中设置了baseURI,也就是在构造合约时已经设置了baseURI

constructor(
    string memory _name,
    string memory _symbol,
    string memory _baseTokenURI,
    uint128 _price,
    address _receiver,
    uint256 _royalties
) payable ERC721A(_name, _symbol) {
    setBaseURI(_baseTokenURI);
    setPrice(_price);
    setRoyalties(_receiver, _royalties);
}

https://ipfs.io/ipfs/QmYVsw73haPgm9jK9BopsuKtzuxLANjYn75xeHLpht13D5

https://tth-ipfs.com/ipfs/QmYVsw73haPgm9jK9BopsuKtzuxLANjYn75xeHLpht13D5

presaleMint为什么要用到merkleProof?

项目方做了预售,对所有参加预售的地址构造了一棵merkle tree,并将merkle root填入智能合约,调用presale的地址必须在merkle tree中。

使用merkle tree可以隐藏了具体地址。

/// @notice Presale minting verifies callers address is in Merkle Root
/// @param _amountOfTokens Amount of tokens to mint
/// @param _merkleProof Hash of the callers address used to verify the location of that address in the Merkle Root
function presaleMint(uint256 _amountOfTokens, bytes32[] calldata _merkleProof)
    external
    payable
    verifyMaxPerUser(msg.sender, _amountOfTokens)
    verifyMaxSupply(_amountOfTokens)
    isEnoughEth(_amountOfTokens)
{
    require(status == SaleStatus.Presale, "Presale not active");

    bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
    require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), "Not in presale list");

    _mintedAmount[msg.sender] += _amountOfTokens;
    _safeMint(msg.sender, _amountOfTokens);
}

设置merkle root
https://etherscan.io/tx/0x4d6e0c07516115b8a803f77fe3067d52091c8d888eecb8f60fe897a68501ea27

/// @notice Set Presale Merkle Root
/// @param _merkleRoot Merkle Root hash
function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
    merkleRoot = _merkleRoot;
}

presale

https://etherscan.io/tx/0x387dd09362758758b52d56dd2093724039fbd5592b13613cc347a2c1a216b581

同一个地址2次调用presale,那么它提供的merkle proof两次肯定是一样的。
https://etherscan.io/tx/0x5c76c3e78933ccc9f50e3a6f979226c02b9ab96ed320cbd68d4fbf3361c2b366
https://etherscan.io/tx/0xe64591ba680b9fb18f3bac61a20b7343801f03a9905d1f260df4d945089a056e

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/1319651.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-11
下一篇 2022-06-11

发表评论

登录后才能评论

评论列表(0条)

保存