NFT合约级mint实践

#blockchain #eth #smartcontract

Table of Contents

简明教程

  1. 找到对应地址

    可以先试用页面触发小狐狸的审批页面,之后找对应的地址。

  2. 浏览器查看合约交互

    nft 项目一般都是 mint 的方法的调用。在交易详情的advance里面看到decode 之后的内容,一般是合约的方法名和参数

  3. 看合约代码

    直接找到 调用的mint 函数的定义内容,检查其逻辑。

  4. 构造调用参数,进行合约交互

实践记录

以下面的合约为例子。

https://polygonscan.com/address/0x3a67c34c7dbd846108044fed38a3154b99a97cb1

看到有大量的Mint 调用,在advence查看调用内容,如下

Function: mint(uint256 amount, uint256 timeout) ***

MethodID: 0x1b2ef1ca
[0]:  0000000000000000000000000000000000000000000000000000000000000001
[1]:  000000000000000000000000000000000000000000000000000000000001c378

这里主要是看解码出来的 Functiin name,这里的参数不一定百分百准确,因为是使用 字典来进行解码的。

这里推荐使用 4byte来进行方法名解码。有比较强大的 DB

https://www.4byte.directory/signatures/?bytes4_signature=0x1b2ef1ca

我们可以看到解码的内容是。

IDText SignatureBytes Signature
167720mint(uint256,uint256)0x1b2ef1ca

在其公布的sol code的 RaremintsERC721 里面我们可以找到mint的定义:

    function mint(uint256 num, uint256 metadata) public payable {
        uint256 supply = totalSupply();
        require( !_paused,                              "Sale paused" );
        require( supply + num <= _supply - _reserved,   "Exceeds maximum supply" );
        require( msg.value >= _price * num,             "Ether sent is not correct" );

        for(uint256 i; i < num; i++){
            performMint(msg.sender, supply + i, metadata);
        }
    }

可以看到 :

  1. payable
  2. num
  3. metadata

这里第三个request就看出来我们的payable需要达到单价以上。在这里price 设置的是 0.5matic 所以我们这里就保持1:0.5 的数量价格比。另外一个参数是 metadata,这里 performMint用到了这个参数,其函数内容如下。

    function performMint(address _to, uint256 _tokenId, uint256 _metadata) private {
        _safeMint(_to, _tokenId);
        emit MintEvent(_to, _tokenId, _metadata);
    }

我们可以看到,这里只是在 emit 事件的时候用到了这个 metadata,其他地方没有,所以这里意味着我们可以进行自定义。

综上 构建出参数 ,使用 write Contract 来进行交互。

找到 mint 函数,参数如下

  1. Payable: 1.5 matic
  2. Num: 3
  3. Metadata: 0000(任意)

点击 Write 写合约 ,完成交互过程。简单轻松

从简单的流程分析来切入智能合约的路子上