交易所開發(穩定版)/交易所繫統開發(python開發)/交易所開發(原始碼版)
智慧合約簡單說,它是一種用計算機語言取代法律語言去記錄條款的合約,可以由一個計算系統自動執行。
更簡單地說,智慧合約就是傳統合約的數字化版本。
如果說區塊鏈是一個資料庫,智慧合約就是能夠使區塊鏈技術應用到現實當中的應用層。
智慧合約是在區塊鏈資料庫上執行的計算機程式,可以在滿足其原始碼中寫入的條件時自行執行。
function _transfer(
address from,
address to,
uint256 tokenId
)internal virtual{
//前置檢查:被轉移的代幣屬於from使用者
require(ERC721.ownerOf(tokenId)==from,"ERC721:transfer from incorrect owner");
//前置檢查:接收代幣的使用者to不能為零地址
require(to!=address(0),"ERC721:transfer to the zero address");
//鉤子函式:代幣轉移前觸發,官方實現無做實際操作,如果業務有特殊的邏輯,我理解可重寫_beforeTokenTransfer函式
_beforeTokenTransfer(from,to,tokenId);
//清除之前的授權—————指向零地址
_approve(address(0),tokenId);
//from賬號代幣數-1
_balances[from]-=1;
//to賬號代幣數+1
_balances[to]+=1;
//執行代幣的轉移,即更換owner地址
_owners[tokenId]=to;
//觸發轉移事件
emit Transfer(from,to,tokenId);
//鉤子函式:代幣轉移後觸發,官方實現無做實際操作
_afterTokenTransfer(from,to,tokenId);
}
/**
*dev See{IERC721-safeTransferFrom}.
*安全代幣轉移,真實中使用該函式比較合適。
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
)public virtual override{
safeTransferFrom(from,to,tokenId,"");
}
/**
*dev See{IERC721-safeTransferFrom}.
*安全轉移函式,攜帶回撥資料_data
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory _data
)public virtual override{
//前置檢查:函式呼叫者是tokenID的owner或者擁有操作許可權
require(_isApprovedOrOwner(_msgSender(),tokenId),"ERC721:transfer caller is not owner nor approved");
//內部函式,執行真正的安全轉移
_safeTransfer(from,to,tokenId,_data);
}
/**
*dev Safely transfers`tokenId`token from`from`to`to`,checking first that contract recipients
*are aware of the ERC721 protocol to prevent tokens from being forever locked.
*`_data`is additional data,it has no specified format and it is sent in call to`to`.
*This internal function is equivalent to{safeTransferFrom},and can be used to e.g.
*implement alternative mechanisms to perform token transfer,such as signature-based.
*
*Requirements:
*-`from`cannot be the zero address.
*-`to`cannot be the zero address.
*-`tokenId`token must exist and be owned by`from`.
*-If`to`refers to a smart contract,it must implement{IERC721Receiver-onERC721Received},which is called upon a safe transfer.
*
*Emits a{Transfer}event.
*/
function _safeTransfer(
address from,
address to,
uint256 tokenId,
bytes memory _data
)internal virtual{
//內部函式:執行轉移
_transfer(from,to,tokenId);
//安全的由來:代幣接收者如果是一個合約,那麼其必須要實現IERC721Receiver規範,否則轉移失敗
require(_checkOnERC721Received(from,to,tokenId,_data),"ERC721:transfer to non ERC721Receiver implementer");
}
/**
*dev Returns whether`tokenId`exists.
*內部函式,判斷代幣是否存在
*/
function _exists(uint256 tokenId)internal view virtual returns(bool){
return _owners[tokenId]!=address(0);
}
/**
*dev Safely mints`tokenId`and transfers it to`to`.
*Requirements:
*-`tokenId`must not exist.
*-If`to`refers to a smart contract,it must implement{IERC721Receiver-onERC721Received},which is called upon a safe transfer.
*Emits a{Transfer}event.
*內部函式:安全鑄造NFT,我們編寫的合約在鑄造NFT的時候,呼叫的就是該方法。
*/
function _safeMint(address to,uint256 tokenId)internal virtual{
//內部函式:鑄造
_safeMint(to,tokenId,"");
}
/**
*真實鑄造NFT函式,內部函式
*/
function _safeMint(
address to,
uint256 tokenId,
bytes memory _data
)internal virtual{
//鑄造
_mint(to,tokenId);
//判斷接收者是否是合約,如果是合約則需要實現ERC721Receiver規範。
require(
_checkOnERC721Received(address(0),to,tokenId,_data),
"ERC721:transfer to non ERC721Receiver implementer"
);
}
/**
*dev Mints`tokenId`and transfers it to`to`.
*Requirements:
*-`tokenId`must not exist.
*-`to`cannot be the zero address.
*Emits a{Transfer}event.
*內部函式:鑄造代幣,但是我們一般不直接呼叫該函式;呼叫_safeMint更安全
*/
function _mint(address to,uint256 tokenId)internal virtual{
//前置檢查:代幣接收者不能是零地址
require(to!=address(0),"ERC721:mint to the zero address");
//前置檢查:代幣的tokenID不能是已存在的(獨一無二)
require(!_exists(tokenId),"ERC721:token already minted");
//鉤子函式:代幣轉移前觸發
_beforeTokenTransfer(address(0),to,tokenId);
//to賬號代幣數+1
_balances[to]+=1;
//代幣歸屬
_owners[tokenId]=to;
//觸發轉移實現,從零地址發起,說明是鑄造生成
emit Transfer(address(0),to,tokenId);
//鉤子函式:代幣轉移後觸發
_afterTokenTransfer(address(0),to,tokenId);
}
/**
*dev Destroys`tokenId`.
*The approval is cleared when the token is burned.
*Requirements:
*-`tokenId`must exist.
*Emits a{Transfer}event.
*內部函式:代幣銷燬
*注意:函式並沒有做許可權檢查。所以我們在我們的合約中如果要呼叫該函式,需要自己做tokenID的所有權檢查!
*/
function _burn(uint256 tokenId)internal virtual{
address owner=ERC721.ownerOf(tokenId);
//鉤子函式:代幣轉移前觸發
_beforeTokenTransfer(owner,address(0),tokenId);
//清除授權
_approve(address(0),tokenId);
//使用者代幣數-1
_balances[owner]-=1;
//清理代幣
delete _owners[tokenId];
//觸發代幣轉移事件,代幣的接受者為零地址,說明是銷燬
emit Transfer(owner,address(0),tokenId);
//鉤子函式:代幣轉移後觸發
_afterTokenTransfer(owner,address(0),tokenId);
}
/**
*內部方法:判斷代幣接收者是否是合約,並且是否實現了IERC721Receiver介面
*我們上面有介紹,如果代幣的接受者是一個合約的話,那麼合約需要實現IERC721Receiver介面
*/
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
)private returns(bool){
//接收者是合約
if(to.isContract()){
//判斷是否實現了IERC721Receiver
try IERC721Receiver(to).onERC721Received(_msgSender(),from,tokenId,_data)returns(bytes4 retval){
return retval==IERC721Receiver.onERC721Received.selector;
}catch(bytes memory reason){
if(reason.length==0){
revert("ERC721:transfer to non ERC721Receiver implementer");
}else{
assembly{
revert(add(32,reason),mload(reason))
}
}
}
}else{
return true;
}
}
/**
*dev Hook that is called before any token transfer.This includes minting
*and burning.
*Calling conditions:
*-When`from`and`to`are both non-zero,``from``'s`tokenId`will be
*transferred to`to`.
*-When`from`is zero,`tokenId`will be minted for`to`.
*-When`to`is zero,``from``'s`tokenId`will be burned.
*-`from`and`to`are never both zero.
*To learn more about hooks,head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*鉤子函式
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
)internal virtual{}
/**
*dev Hook that is called after any transfer of tokens.This includes
*minting and burning.
*Calling conditions:
*-when`from`and`to`are both non-zero.
*-`from`and`to`are never both zero.
*
*To learn more about hooks,head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*鉤子函式
*/
function _afterTokenTransfer(
address from,
address to,
uint256 tokenId
)internal virtual{}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70016819/viewspace-2947862/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Uniswap交易所開發穩定版丨Uniswap交易所繫統開發(開發模板)
- Uniswap交易所繫統開發(穩定版)丨Uniswap交易所開發成品及原始碼原始碼
- 交易所開發(海外版)丨交易所繫統開發(Python)丨 交易所繫統原始碼功能Python原始碼
- 交易所開發(海外版)丨交易所繫統開發(Demo)交易所專案系統開發(原始碼定製)原始碼
- 深度解析:交易所繫統開發(海外版)交易所繫統開發(多語言)交易所開發(原始碼部署)原始碼
- 交易所開發(海外版)/交易所繫統開發(案例詳細)/交易所繫統原始碼及demo原始碼
- 交易所繫統丨交易所繫統開發(上線版)丨交易所開發詳細原始碼部署原始碼
- 交易所開發(海外版)丨交易所繫統開發(多語言)丨交易所成熟原始碼版原始碼
- (demo)交易所App開發功能|交易所繫統開發原始碼APP原始碼
- BSEX交易所開發運營版丨BSEX交易所繫統開發(開發詳細)及原始碼功能原始碼
- 合約跟單/交易所開發方案,合約跟單/交易所繫統開發(穩定版)丨原始碼詳細原始碼
- 區塊鏈交易所繫統開發(海外版)丨區塊鏈交易所繫統開發(開發案例及原始碼)區塊鏈原始碼
- BSEX交易所繫統開發(開發方案)丨BSEX交易所開發(原始碼詳情)原始碼
- 交易所繫統開發(海外版)
- 數字貨幣交易所繫統開發(海外版)丨數字貨幣交易所開發(原始碼版)原始碼
- swap交易所繫統(原始碼)丨swap交易所繫統開發(去中心化交易所開發詳細)原始碼中心化
- swap交易所繫統開發(成熟技術)交易所中心繫統開發流程(原始碼搭建)原始碼
- 數字貨幣交易所開發(海外版)丨數字貨幣交易所繫統開發(swap交易所開發案例)
- 現貨期權交易所開發案例原始碼丨現貨期權交易所繫統開發(海外版)原始碼
- 數字貨幣交易所開發方案丨數字貨幣交易所繫統開發(正式版)丨數字貨幣交易所開發原始碼原始碼
- 數字貨幣交易所開發正式版丨數字貨幣交易所繫統開發(開發詳情)及案例原始碼原始碼
- GCCX交易所繫統開發GC
- 現貨合約跟單交易所開發(穩定版)丨現貨合約跟單交易所繫統開發(詳情及邏輯)原始碼原始碼
- swap去中心化交易所繫統開發(正式版)丨swap交易所原始碼部署中心化原始碼
- 區塊鏈交易所開發公司 | 交易所繫統開發搭建上線區塊鏈
- 數字貨幣交易所開發(案例)丨數字貨幣交易所繫統開發(JAVA/PHP開發)及原始碼JavaPHP原始碼
- 紅牛交易所繫統開發
- 去中心化交易所開發正式版丨去中心化交易所繫統開發技術詳細及原始碼分析中心化原始碼
- 合約跟單交易所開發運營版丨合約跟單交易所繫統開發成熟方案及原始碼詳細原始碼
- 合約跟單/交易所繫統開發(開發demo),合約跟單/交易所繫統開發(邏輯及案例)
- NFT交易所繫統執行規則分析 | NFT交易所繫統開發原始碼示例原始碼
- 區塊鏈交易所開發運營版丨區塊鏈交易所繫統開發(詳細案例)及邏輯方案丨原始碼區塊鏈原始碼
- BOW弓箭swap交易所繫統開發流程及原始碼示例原始碼
- 去中心化交易所繫統開發需求中心化
- Uniswap交易所繫統開發模式方案搭建模式
- 區塊鏈交易所繫統開發方案區塊鏈
- 數字貨幣交易所繫統開發技術原始碼丨區塊鏈去中心化交易所繫統開發(成熟技術)原始碼區塊鏈中心化
- 數字貨幣交易所錢包系統開發(開發說明)丨數字貨幣錢包交易所繫統開發(原始碼詳細)原始碼