淺談智能合約代幣流動性質(zhì)押挖礦分紅系統(tǒng)開發(fā)(詳細邏輯)及成熟方案丨源碼案例
簡而言之,如果一個區(qū)塊的交易信息被改變,那么該區(qū)塊體、區(qū)塊的哈希值也將被改變,該區(qū)塊之后區(qū)塊的哈希值也將被改變。如果想讓后面的區(qū)塊還能連接到它后面所有的區(qū)塊必須全部同時修改,否則被改之后的區(qū)塊就全部脫離了區(qū)塊鏈。
區(qū)塊鏈最重要的功能,就是建立一種價值共識,而這個“共識”,主要基于“價值量化的能力”和“價值安全的過程”兩個方面。先是“價值量化能力”:把一件事通過數(shù)字化的方式描述清楚,就是一個價值量化的過程。
其次是“價值安全的過程”:通過數(shù)字化的方式描述清楚后,還要保護數(shù)據(jù)不被篡改,并可以隨時隨地地查詢。詳細案例及源碼唯:yy625019,這兩個方面疊加起來,就形成了價值共識。所以,區(qū)塊鏈在數(shù)據(jù)互通機制、信用體系的搭建上,必將發(fā)揮非常重要的作用。
常規(guī)實現(xiàn)中,Transfer定義如下:
event Transfer(address indexed _from,address indexed _to,uint256 indexed _tokenId);
1
來自EIP-721標準原文
我們可以看到此事件拋出了3個topic,但事實上Transfer作為事件名稱也需要占用一個topic,所以此處使用了log4操作碼。
此操作碼需要的變量如下:
offset拋出內(nèi)容位于內(nèi)存的起始位置
size拋出內(nèi)容的長度(與offset參數(shù)共同使用)
topic1拋出的的變量
topic2
topic3
topic4
補充函數(shù)
在ERC721A的實現(xiàn)中,開發(fā)者提供了一些其他的mint函數(shù)實現(xiàn),這些實現(xiàn)的主體邏輯與_mint類似,但提供了一些特別的功能或者符合一些特定的ERC標準。
我們首先分析_mintERC2309函數(shù),此函數(shù)根據(jù)ERC 2309標準編寫。在介紹函數(shù)具體實現(xiàn)前,我們簡單介紹一下ERC 2309的具體內(nèi)容。
ERC 2309主要解決在大規(guī)模鑄造和代幣轉(zhuǎn)賬過程中釋放過多event的問題。如在標準_mint函數(shù)實現(xiàn)中,我們在最后使用了while循環(huán)以逐一釋放事件。這顯然是低效的,且無法用于大規(guī)模代幣鑄造。
為解決這一問題,ERC 2309的開發(fā)者設(shè)計了一個新的事件:
event ConsecutiveTransfer(uint256 indexed fromTokenId,uint256 toTokenId,address indexed fromAddress,address indexed toAddress);
基于此事件,我們可以一次性釋放所有代幣轉(zhuǎn)移的事件,大大降低了gas消耗。
對于_mintERC2309具體實現(xiàn),與_mint基本一致,除了增加了以下代碼:
ERC2309最大轉(zhuǎn)移量檢查
if(quantity>_MAX_MINT_ERC2309_QUANTITY_LIMIT)_revert(MintERC2309QuantityExceedsLimit.selector);
用于判斷單次轉(zhuǎn)移量是否超過5000
ConsecutiveTransfer事件拋出
emit ConsecutiveTransfer(startTokenId,startTokenId+quantity-1,address(0),to);
由于使用了solidity語法編寫,所以此處也減少了大量安全性代碼編寫(如上文的address到uint256轉(zhuǎn)化等)。
另一個實現(xiàn)mint功能的函數(shù)是_safeMint函數(shù),此函數(shù)會判斷NFT接收地址to的屬性,以避免NFT接受方不具有接受NFT的能力。
unchecked{
if(to.code.length!=0){
uint256 end=_currentIndex;
uint256 index=end-quantity;
do{
if(!_checkContractOnERC721Received(address(0),to,index++,_data)){
_revert(TransferToNonERC721ReceiverImplementer.selector);
}
}while(index<end);
//Reentrancy protection.
if(_currentIndex!=end)_revert(bytes4(0));
}
}