MM3NFT项目研究笔记

MM3NFT( https://mm3nft.com/

1 项目说明

发布玛丽莲.梦露的NFT头像,用户 mint 的时候,会获得一个戴着饰品的头像 A,但是用户可以自行将饰品拆成单独的 NFT,而这些拆分后的饰品 A, 和其他的头像 B 再进行拼装,依然能保持原有的 ID 不变。
核心: 合约支持组合拆分!!
官网上的mint页面连接钱包,提示 钱包地址不在白名单,无法铸造头像。说明网站后台服务端控制着白名单,而不是在合约控制白名单。
白皮书还未发布,要到2022 Q4发布。
可查看头像排名: https://mm3nft.com/rank

2 分析 MM3 #80 的属性、元文件、链接地址等信息

MM3头像属性: 
    BACKGROUND, EARRING,  EYES,   FACE, FASHION,  HAIR,  MAKEUP,  MOUTH, NECKLACE, SKIN
    背景, 耳环, 眼睛, 脸, 时装,妆容, 嘴巴, 项链, 皮肤
tokenID = 80
访问这个链接得到metadata:
{"name":"mm3 #80","attributes":[{"trait_type":"Background","value":"Sapphire Rain","cid":"017","tid":475,"rare":0},{"trait_type":"Face","value":"Superwoman","parent_trait":"Body"},{"trait_type":"Eyes","value":"Dark Blue","parent_trait":"Body"},{"trait_type":"Skin","value":"Porcelain","parent_trait":"Body"},{"trait_type":"Mouth","value":"Tangerine","parent_trait":"Body"},{"trait_type":"Makeup","value":"Natural","parent_trait":"Body"},{"trait_type":"Fashion","value":"Jean Dress","cid":"003","tid":477,"rare":15},{"trait_type":"Necklace","value":"Bogata","cid":"017","tid":454,"rare":20},{"trait_type":"Hair","value":"Dark Brown Bob With Bands And Safari Hat","cid":"028","tid":473,"rare":0},{"trait_type":"Earring","value":"Precious Face","cid":"030","tid":480,"rare":20}],"total_rare":55,"image":"https://image.mm3nft.com/nft/80.png"}
格式化:
{
    "name":"mm3 #80",
    "attributes":[
        {
            "trait_type":"Background",
            "value":"Sapphire Rain",
            "cid":"017",
            "tid":475,
            "rare":0
        },
        {
            "trait_type":"Face",
            "value":"Superwoman",
            "parent_trait":"Body"
        },
        {
            "trait_type":"Eyes",
            "value":"Dark Blue",
            "parent_trait":"Body"
        },
        {
            "trait_type":"Skin",
            "value":"Porcelain",
            "parent_trait":"Body"
        },
        {
            "trait_type":"Mouth",
            "value":"Tangerine",
            "parent_trait":"Body"
        },
        {
            "trait_type":"Makeup",
            "value":"Natural",
            "parent_trait":"Body"
        },
        {
            "trait_type":"Fashion",
            "value":"Jean Dress",
            "cid":"003",
            "tid":477,
            "rare":15
        },
        {
            "trait_type":"Necklace",
            "value":"Bogata",
            "cid":"017",   //图片资源编号 https://etherscan.io/nft/0x1872c6f0d12e7338d6a3016877c22692d324c279/454
            "tid":454,     //组件tokenId #454
            "rare":20
        },
        {
            "trait_type":"Hair",
            "value":"Dark Brown Bob With Bands And Safari Hat",
            "cid":"028",
            "tid":473,
            "rare":0
        },
        {
            "trait_type":"Earring",
            "value":"Precious Face",
            "cid":"030",
            "tid":480,
            "rare":20
        }
    ],
    "total_rare":55,
    "image":"https://image.mm3nft.com/nft/80.png"
}

3 头像图片资源数据

分析多个头像图片,发现是由多张属性图片叠加合成,找到的图片资源如下:
完整形象: token#1089   https://image.mm3nft.com/nft/1089.png                        
组件#6529  background: https://image.mm3nft.com/Background/Background_026.png      1~27种图片
组件#6530  body:        https://image.mm3nft.com/Body/Body_003.png                  1~40种图片
组件#6531  fishon:      https://image.mm3nft.com/Fashion/Fashion_027.png            1~44种图片
组件#6532  Necklace:    https://image.mm3nft.com/Necklace/Necklace_014.png          1~26
组件#6533  Hair:        https://image.mm3nft.com/Hair/Hair_012.png                  1~40
组件#6534  Earring:     https://image.mm3nft.com/Earring/Earring_029.png            1~31
uint256[] partIds = {6529,6531,6532,6533,6534}
uint256[] slotIds = {0,1,2,3,4}

4 合约源码分析

4.1 下载源码
github上面找不到MM3项目,肯定没有放上来。只能从以太坊浏览器中扒下来合约源码。主要3个合约文件:
ERC721Composable.sol, MM3Component.sol, MM3NFT.sol。
从代码中看,使用的OpenZeppelin Contracts库的版本是v4.6.0, 还使用了这个库@divergencetech。
创建package.json文件内容如下:
{
  "dependencies": {
    "@openzeppelin/contracts": "~4.6.0",
    "divergencetech":"0.31",
    "chai": "^4.3.4",
    "chai-as-promised": "^7.1.1"
}
现在在项目目录下执行安装命令, 就把依赖库都安装好了。
npm install
4.2 合约部署流程
  1. 部署主合约
  2. 部署组件合约
  3. 主合约中设置组件合约地址
  4. 使用组件合约,铸造多个组件,每个组件随机生成资源属性
  5. 组件授权给主合约,
  6. 使用主合约, claimParts铸造一套组件(背景,服装,项链,头发,耳环)
  7. 现在就可以分解出一个组件啦。
4.3 资源存储
组件存储的数据结构位置索引:
Slots[0]:  背景
Slots[1]:  服装
Slots[2]:  项链
Slots[3]:  头发
Slots[4]:  耳环
Slots[5]:
这个Slot槽有6个,原始设计意图是分别存储:背景、身体、服装、项链、发型、耳环。实际上没有保存“身体”,但是组件ID号段上是由“身体”这个NFT的。
uint256[] partIds = {6529,6531,6532,6533,6534}      //缺少的6530就是body。
uint256[] slotIds = {0,1,2,3,4}
主体需要存储的数据:
metadata.json: {.....}
图片数据: https://image.mm3nft.com/nft/80.png       //这是完整形象
组件的存储数据:
metadata: {"name":"Earring #6528","attributes":[{"trait_type":"Name","value":"Gold Joelle"}],"cid":"012","part":"Earring","rare":5,"image":" https://image.mm3nft.com/Earring/Earring_012.png"}
4.4 设计思路
主体
  铸造一套组件(背景,服装,项链,头发,耳环),用了链下签名技术。 免费铸造!!
  注意此时并没有mint每一个组件,只是记录下来主体中包含了什么样的组件。  
  在分解时才检查该组件是否存在,如果不存在就mint出来。
  这样做的目的一般人很少发生分解操作,这种懒汉式设计模式节省了大量的mint操作费用。
主体tokenId =X 和组件tokenId=Y 对应关系
  Y =[ X*5+1, X * 6]      
  此处应该有个对应关系图, 挤掉的第二个token是给body的。
4.5 APP设计推测
服务端发布地址白名单,白名单中的用户地址才能连接钱包进入购买页面
用户输入主体tokenId, 前端自动计算出对应的一套组件tokenId。
前端组装好交易数据,让用户钱包签名。前端收到签名数据后广播上链,完成铸造交易。

5 合成头像 

使用自己开发的NFTCreator工具软件,导入图片资源,设定图层顺序,设置属性、元素资源,采用各属性元素值均匀分布,生成100个头像,我这软件的生成效果那是刚刚的~~~

这是用java开发的窗口软件,水平那是杠杠的啊~~~

V1.0版本可以指定各个属性的概率,或者使用分布模式。

V2.0版本可以指定属性间的依赖关系,为元素添加约束关系,使用起来就可以更多模式了。

猜你喜欢

转载自blog.csdn.net/u012084827/article/details/127357585
mm