九層天塔DApp合約開發系統搭建技術

搭建猿punk2558發表於2023-04-24

全鏈遊戲的樂趣應該是:在區塊鏈上構築穩固、不可篡改的核心玩法,並將衍生玩法的設計最大限度地讓渡給玩家,使得遊戲衍生本身能產生無數的可能,內容再次創作有無限的延展性。

創作一款好玩的全鏈遊戲,設計者要try to play god(當然是一個有趣的god),造一個有趣的世界,具體來說分三步:

1)提煉出遊戲的核心玩法,明確有哪些要素是希望刻進遊戲dna裡,不希望任何人(包括作者)能改變的,然後將核心玩法拆分成最小的原子

2)將遊戲原子用區塊鏈變成玩家的共識,九層天塔系統13z開4z77發z558,成為遊戲世界執行的底層規則

3)用合理的設計鼓勵人類用這些原子去創造更有趣更豐富的世界。

以下非同質化代幣的鑄造分析,原始程式碼參考以太坊ERC721提案。

首先非同質化代幣的鑄造會執行

_safeMint函式,該函式存在兩個引數,他們分別的作用是:

to:新鑄的代幣接受地址

tokenId:新鑄代幣的id序列

function _safeMint(address to,uint256 tokenId)internal virtual{

_safeMint(to,tokenId,"");//接收以上兩個引數加上空字元湊齊3個引數傳入同名_safeMint函式(過載)

}

可以看到接下來呼叫三引數同名_safeMint函式,

function _safeMint(address to,uint256 tokenId,bytes memory _data)internal virtual{//接收_safeMint函式傳參

_mint(to,tokenId);//將傳參to和tokenId傳入_mint函式

require(_checkOnERC721Received(address(0),to,tokenId,_data),"ERC721:transfer to non ERC721Receiver implementer");//呼叫_checkOnERC721Received函式來檢測函式介面合法性

}

最後呼叫_mint函式進行鑄幣:

function _mint(address to,uint256 tokenId)internal virtual{//接收來自_safeMint函式的傳參

require(to!=address(0),"ERC721:mint to the zero address");//校驗傳參地址是否為空(為假繼續後續操作,為真終止操作)

require(!_exists(tokenId),"ERC721:token already minted");//接著校驗tokenId是否已經存在(為假繼續後續操作,為真終止操作)

_beforeTokenTransfer(address(0),to,tokenId);//初始化;

_balances[to]+=1;//在傳參地址to上生成一個token

_owners[tokenId]=to;//將傳參地址to與引索tokenId進行繫結

emit Transfer(address(0),to,tokenId);//觸發token生成事件

}

就這樣一個獨一無二的NFT被鑄造出來了。總體過程如下:

合約中使用_safeMint函式呼叫鑄幣函式並檢查函式的ERC721函式介面合法性,該函式在ERC721中有所體現,程式碼如下:

function _checkOnERC721Received(address from,address to,uint256 tokenId,bytes memory _data)

private returns(bool)

{

if(to.isContract()){

try IERC721Receiver(to).onERC721Received(_msgSender(),from,tokenId,_data)returns(bytes4 retval){

return retval==IERC721Receiver(to).onERC721Received.selector;

}catch(bytes memory reason){

if(reason.length==0){

revert("ERC721:transfer to non ERC721Receiver implementer");

}else{

//solhint-disable-next-line no-inline-assembly

assembly{

revert(add(32,reason),mload(reason))

}

}

}

}else{

return true;

}

}

在_mint函式中首先檢查了地址是否是0地址,還有tokenId是否已存在。該tokenId在ERC721標準中生成規則是一個不可互換的通證。檢測透過後為to地址鑄幣(相應的tokenId),同時記錄餘額與該NFT藝術品的歸屬者

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70020115/viewspace-2948479/,如需轉載,請註明出處,否則將追究法律責任。

相關文章