代幣標準與 NFT

NFT 鑄造

鑄造一枚 NFT,就是讓它在鏈上誕生的動作——建立一個新的代幣 id,並指派它的第一位持有者。在合約裡,這是一次對內部函式 _mint(to, tokenId) 的呼叫,它把持有者寫入儲存,並發出一則「來自零地址」的 Transfer 事件,索引器正是以此認出一枚全新的代幣。「鑄造」通常指的是某系列開放讓人付費創建並認領自己作品的那個公開時刻。

真實的鑄造會在其上疊加各種機制。允許清單(也叫白名單)把早期鑄造限定給符合資格的地址;證明資格最省 gas 的方式是 Merkle 證明——合約只儲存一個 Merkle 根,每位鑄造者提交一份「自己的地址是某葉節點」的證明,而非由合約儲存成千上萬個地址。揭曉機制則在開賣後才揭露作品:合約先供應一個佔位用的 tokenURI,待團隊把 baseURI 一翻、才露出真正的元資料,最好再配上一個隨機偏移量,讓人無法因事先知道「哪個代幣 id 對應哪張圖」而精準狙擊稀有特徵。

熱門的鑄造會造成壅塞,俗稱「gas 大戰」:許多人同時廣播鑄造交易,全都競相抬高 gas 價格以求先被收錄,於是手續費飆升,而落敗者還得為失敗的交易付 gas。緩解手段包括荷蘭式拍賣(價格由高往低降,以平緩需求)、每錢包上限,以及像 ERC-721A 這類經 gas 最佳化的鑄造實作——它藉由延後逐枚記帳,讓買家以接近鑄一枚的成本鑄出好幾枚。惰性鑄造(lazy minting)則徹底翻轉成本:NFT 直到首次被購買時才真正寫上鏈,因此創作者無須預先付費。

function mint(bytes32[] calldata proof) external payable {
    require(msg.value == PRICE, "wrong price");
    bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
    require(MerkleProof.verify(proof, allowlistRoot, leaf), "not allowlisted");
    _mint(msg.sender, ++nextId);
}

以 Merkle 證明資格的允許清單鑄造。

鑄造寫入一枚新代幣;標記「誕生」的是那則「來自零地址」的 Transfer。允許清單與揭曉只是疊加其上的便利設計——ERC-721 本身對它們一概不作要求。

又稱
minting鑄幣