jogger跑鞋系統(tǒng)開發(fā)(開發(fā)案例)丨跑鞋jogger慢跑著系統(tǒng)開發(fā)方案項(xiàng)目及源碼部署
一般來說,區(qū)塊鏈可按許可權(quán)限分為公有區(qū)塊鏈、聯(lián)盟區(qū)塊鏈和私有區(qū)塊鏈,其中,公有鏈面向全球所有用戶,任何人都可以在其中讀取數(shù)據(jù)和發(fā)送交易;聯(lián)盟鏈由若干業(yè)務(wù)相關(guān)的機(jī)構(gòu)共同參與管理,每個機(jī)構(gòu)都運(yùn)行著一個或多個節(jié)點(diǎn),讀寫權(quán)限僅對聯(lián)盟內(nèi)的節(jié)點(diǎn)有限度地開放。
web3.js是一個JavaScript API庫。要讓DApp在以太坊上運(yùn)行,我們可以使用web3.js庫提供的web3對象。web3.js通過RPC調(diào)用與本地節(jié)點(diǎn)通信,It can be used with any Ethereum node that exposes the RPC layer.Web3 contains eth object-web3.eth(for interaction with Ethereum blockchain)and shh object-web3.shh(for interaction with Whisper)
DAPP是去中心化應(yīng)用程序/分布式的應(yīng)用程序,是底層區(qū)塊鏈平臺生態(tài)上衍生的各種分布式應(yīng)用,也是區(qū)塊鏈?zhǔn)澜缰械幕A(chǔ)服務(wù)提供方。將應(yīng)用程序分布在不同節(jié)點(diǎn)上,Applications that complete tasks through consensus mechanisms and blockchain platforms are inherently decentralized and do not rely on any centralized servers,promoting safer user transactions.
從本質(zhì)上看,區(qū)塊鏈?zhǔn)且苑植际綌?shù)據(jù)存儲、點(diǎn)對點(diǎn)傳輸、共識機(jī)制、加密算法、,智能合約等計(jì)算機(jī)技術(shù)集成創(chuàng)新而產(chǎn)生的分布式賬本技術(shù),是基于互聯(lián)網(wǎng)的分布式數(shù)據(jù)庫,具有去中心化、共識機(jī)制、不可篡改、可以追溯、規(guī)則透明等特點(diǎn),
contract ERC721 is IERC721,IERC165{
mapping(bytes4=>bool)supportsInterfaces;
bytes4 invalidID=0xffffffff;
bytes4 constant ERC165_InterfaceID=0x01ffc9a7;//erc165
bytes4 constant ERC721_InterfaceID=0x80ac58cd;//erc721
mapping(address=>uint256)ercTokenCount;
mapping(uint256=>address)ercTokenOwner;
mapping(uint256=>address)ercTokenApproved;
mapping(address=>mapping(address=>bool))ercOperatorForAll;
using Address for address;
constructor(){
_registerInterface(ERC165_InterfaceID);
_registerInterface(ERC721_InterfaceID);
}
//授權(quán)
modifier canOperator(uint256 _tokenId){
address owner=ercTokenOwner[_tokenId];
require(msg.sender==owner||ercOperatorForAll[owner][msg.sender]);
_;
}
modifier canTransfer(uint256 _tokenId,address _from){
address owner=ercTokenOwner[_tokenId];
require(owner==_from);
require(msg.sender==owner||msg.sender==ercTokenApproved[_tokenId]||ercOperatorForAll[owner][msg.sender]);
_;
}
function _registerInterface(bytes4 interfaceID)internal{
supportsInterfaces[interfaceID]=true;
}
function supportsInterface(bytes4 interfaceID)override external view returns(bool){
require(invalidID!=interfaceID);
return supportsInterfaces[interfaceID];
}
//721
function balanceOf(address _owner)override external view returns(uint256){
return ercTokenCount[_owner];
}
function ownerOf(uint256 _tokenId)override external view returns(address){
return ercTokenOwner[_tokenId];
}
function getApproved(uint256 _tokenId)override external view returns(address){
return ercTokenApproved[_tokenId];
}
function isApprovedForAll(address _owner,address _operator)external view returns(bool){
return ercOperatorForAll[_owner][_operator];
}
function approve(address _approved,uint256 _tokenId)override external payable{
ercTokenApproved[_tokenId]=_approved;
emit Approval(msg.sender,_approved,_tokenId);
}
function setApprovalForAll(address _operator,bool _approved)override external{
ercOperatorForAll[msg.sender][_operator]=_approved;
emit ApprovalForAll(msg.sender,_operator,_approved);
}
function transferFrom(address _from,address _to,uint256 _tokenId)override external payable{
_transferFrom(_from,_to,_tokenId);
}
function _transferFrom(address _from,address _to,uint256 _tokenId)internal canTransfer(_tokenId,_from){
ercTokenOwner[_tokenId]=_to;
ercTokenCount[_to]+=1;
ercTokenApproved[_tokenId]=address(0);
emit Transfer(_from,_to,_tokenId);
}
function safeTransferFrom(address _from,address _to,uint256 _tokenId,bytes memory data)override external payable{
_safeTransferFrom(_from,_to,_tokenId,data);
}
function safeTransferFrom(address _from,address _to,uint256 _tokenId)override external payable{
_safeTransferFrom(_from,_to,_tokenId,"");
}
function _safeTransferFrom(address _from,address _to,uint256 _tokenId,bytes memory data)internal{
_transferFrom(_from,_to,_tokenId);
//add safe code
if(_to.isContract()){//首先判斷對方是否是合約
bytes4 retval=ERC721TokenReceiver(_to).onERC721Received(msg.sender,_from,_tokenId,data);
require(retval==ERC721TokenReceiver.onERC721Received.selector);
}
}
function mint(address _to,uint256 _tokenId,bytes memory data)external{
require(_to!=address(0));
require(ercTokenOwner[_tokenId]==address(0));
ercTokenOwner[_tokenId]=_to;
ercTokenCount[_to]+=1;
if(_to.isContract()){//首先判斷對方是否是合約
bytes4 retval=ERC721TokenReceiver(_to).onERC721Received(msg.sender,address(0),_tokenId,data);//是否實(shí)現(xiàn)了ERC721Received
require(retval==ERC721TokenReceiver.onERC721Received.selector);
}
emit Transfer(address(0),_to,_tokenId);
}