数据作为新型生产要素,能为实体经济带来放大、叠加和倍增作用,是做强做优做大数字经济的关键。
建立数据可信流通体系,增强数据的可用、可信、可流通、可追溯水平,是激活数据要素潜能、赋能实体经济的重要途径。区块链技术具有去中心化、共识机制、不可篡改、可以追溯、规则透明等特点。
从本质上看,区块链是以分布式数据存储、点对点传输、共识机制、加密算法、,智能合约等计算机技术集成创新而产生的分布式账本技术,是基于互联网的分布式数据库,具有去中心化、共识机制、不可篡改、可以追溯、规则透明等特点,
_approve
实现approve的核心函数为_approve函数,其代码如下:
function _approve(
address to,
uint256 tokenId,
bool approvalCheck
)internal virtual{
address owner=ownerOf(tokenId);
if(approvalCheck&&_msgSenderERC721A()!=owner)
if(!isApprovedForAll(owner,_msgSenderERC721A())){
_revert(ApprovalCallerNotOwnerNorApproved.selector);
}
_tokenApprovals[tokenId].value=to;
emit Approval(owner,to,tokenId);
}
其逻辑大致如下:
查询待授权NFT的所有者
进行资格审查,判断函数调用者是否有权进行授权
设置_tokenApprovals映射,确定授权
在资格审查方面,要求函数调用者满足以下条件:
approvalCheck为false且函数调用者是NFT拥有者
approvalCheck为true且函数调用者被授权控制NFT拥有者的所有NFT
首先分析ownerOf函数,其定义如下:
function ownerOf(uint256 tokenId)public view virtual override returns(address){
return address(uint160(_packedOwnershipOf(tokenId)));
function _packedOwnershipOf(uint256 tokenId)private view returns(uint256 packed){
if(_startTokenId()<=tokenId){
packed=_packedOwnerships[tokenId];
if(packed&_BITMASK_BURNED==0){
if(packed==0){
if(tokenId>=_currentIndex)_revert(OwnerQueryForNonexistentToken.selector);
for(;;){
unchecked{
packed=_packedOwnerships[--tokenId];
}
if(packed==0)continue;
return packed;
}
}
return packed;
}
}
_revert(OwnerQueryForNonexistentToken.selector);
}