區(qū)塊鏈dapp錢包系統(tǒng)開發(fā)(開發(fā)方案)丨dapp錢包系統(tǒng)開發(fā)(項目案例)及源碼邏輯
去中心化存儲技術(shù)是一種新型存儲技術(shù),它改變了傳統(tǒng)的集中式存儲技術(shù),將數(shù)據(jù)從單一位置移到多個位置,這樣就消除了存儲數(shù)據(jù)的中心機(jī)構(gòu)或服務(wù)器的責(zé)任,增加了安全性和數(shù)據(jù)的有效存儲,確保用戶的數(shù)據(jù)安全性。
去中心化存儲技術(shù)的結(jié)構(gòu)為去中心化節(jié)點網(wǎng)絡(luò),它采用分布式存儲方式來存儲數(shù)據(jù)并保護(hù)這些數(shù)據(jù)。
智能合約的生命周期根據(jù)其運(yùn)行機(jī)制可概括為協(xié)商、開發(fā)、部署、運(yùn)維、學(xué)習(xí)和自毀六個階段,其中開發(fā)階段包括合約上鏈前的合約測試,學(xué)習(xí)階段包括智能合約的運(yùn)行反饋與合約更新等.圖2所示為智能合約的基礎(chǔ)架構(gòu)模型,模型自底向上由基礎(chǔ)設(shè)施層、合約層、運(yùn)維層、智能層、表現(xiàn)層和應(yīng)用層組成,
基礎(chǔ)設(shè)施層:封裝了支持智能合約及其衍生應(yīng)用實現(xiàn)的所有基礎(chǔ)設(shè)施,包括分布式賬本及其關(guān)鍵技術(shù)、開發(fā)環(huán)境和可信數(shù)據(jù)源等,這些基礎(chǔ)設(shè)施的選擇將在一定程度上影響智能合約的設(shè)計模式和合約屬性.
(bool success,bytes memory returndata)=_to.call(abi.encodeWithSelector(
IERC721TokenReceiver(_to).onERC721Received.selector,
msg.sender,
_from,
_tokenId,
_data
));
//判斷返回結(jié)果
if(!success){
revert("合約地址未實現(xiàn)IERC721TokenReceiver接囗");
}else{
bytes4 retval=abi.decode(returndata,(bytes4));
return(retval==_ERC721_RECEIVED);
}
}
//安全轉(zhuǎn)移token-公用內(nèi)部函數(shù)
function _safeTransferFrom(address _from,address _to,uint256 _tokenId,bytes memory _data)internal virtual{
_transferFrom(_from,_to,_tokenId);
require(_checkOnERC721Received(_from,_to,_tokenId,_data),"合約地址未實現(xiàn)IERC721TokenReceiver接囗!");
}
function safeTransferFrom(address _from,address _to,uint256 _tokenId,bytes calldata data)external override payable{
_safeTransferFrom(_from,_to,_tokenId,data);
}
function safeTransferFrom(address _from,address _to,uint256 _tokenId)external override payable{
_safeTransferFrom(_from,_to,_tokenId,"");
}
///轉(zhuǎn)移token
function transferFrom(address _from,address _to,uint256 _tokenId)external override payable{
//轉(zhuǎn)移token
_transferFrom(_from,_to,_tokenId);
}
///授權(quán)token
function _approve(address _approved,uint256 _tokenId)internal{
require(_approved!=msg.sender,;
_tokenApproval[_tokenId]=_approved;
}
function approve(address _approved,uint256 _tokenId)ownerIsNotZeroAddress(_approved)external override payable{
_approve(_approved,_tokenId);
}
function setApprovalForAll(address _operator,bool _approved)external override{
require(_operator!=msg.sender,);
//修改狀態(tài)變量
_operatorApprovals[msg.sender][_operator]=_approved;
//事件
emit ApprovalForAll(msg.sender,_operator,_approved);
}
function _getApproved(uint256 _tokenId)internal view returns(address){
//判斷tokenId的所有者是否存在
require(_isExistTokenId(_tokenId),"tokenId不存在");
return _tokenApproval[_tokenId];
}
///
function getApproved(uint256 _tokenId)external override view returns(address){
return _getApproved(_tokenId);
}
function _isApprovedForAll(address _owner,address _operator)internal view returns(bool){
return _operatorApprovals[_owner][_operator];
}
///是否全部授權(quán),即_owner將自己所有的tokenId全部授權(quán)給_operator
function isApprovedForAll(address _owner,address _operator)external override view returns(bool){
return _isApprovedForAll(_owner,_operator);
}
//生成tokenId-公用函數(shù)
function _mint(address _to,uint256 _tokenId)ownerIsNotZeroAddress(_to)internal virtual{
require(!_isExistTokenId(_tokenId),"token已存在");
//設(shè)置token的所有者
_tokenOwner[_tokenId]=_to;
//所有者擁有的token數(shù)量累加
_ownerTokensCount[_to]=_ownerTokensCount[_to].add(1);
//事件
emit Transfer(address(0),_to,_tokenId);
}
//生成tokenId
function mint(address _to,uint256 _tokenId)ownerIsNotZeroAddress(_to)external{
_mint(_to,_tokenId);
}
//生成tokenId-
function safeMint(address _to,uint256 _tokenId,bytes calldata _data)ownerIsNotZeroAddress(_to)external{
_mint(_to,_tokenId);
require(_checkOnERC721Received(address(0),_to,_tokenId,_data),"合約地址沒有實現(xiàn)ERC721Received接囗");
}