中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

ERC721藏品合約怎么實(shí)現(xiàn)

這篇文章主要講解了“ERC721藏品合約怎么實(shí)現(xiàn)”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“ERC721藏品合約怎么實(shí)現(xiàn)”吧!

創(chuàng)新互聯(lián)聯(lián)系熱線:18982081108,為您提供成都網(wǎng)站建設(shè)網(wǎng)頁設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),創(chuàng)新互聯(lián)網(wǎng)頁制作領(lǐng)域十多年,包括服務(wù)器托管等多個行業(yè)擁有豐富的網(wǎng)站運(yùn)維經(jīng)驗(yàn),選擇創(chuàng)新互聯(lián),為網(wǎng)站錦上添花!

ERC721約定了一些接口函數(shù),使它在一定程度上符合ERC20代幣標(biāo)準(zhǔn)。這么做是為了讓現(xiàn)有的 錢包更容易顯示代幣的基本信息。這些函數(shù)可以讓符合ERC721標(biāo)準(zhǔn)的智能合約像比特幣或者 以太幣這樣普通的數(shù)字加密幣一樣,通過智能合約編程的方式定義一些功能讓用戶實(shí)現(xiàn)向他人 發(fā)送代幣或檢查賬戶余額等操作。

這是一個簡明的ERC721智能合約聲明:

contract ERC721 {
   //與ERC20兼容的接口
   function name() constant returns (string name);
   function symbol() constant returns (string symbol);
   function totalSupply() constant returns (uint256 totalSupply);
   function balanceOf(address _owner) constant returns (uint balance);
   //所有權(quán)相關(guān)的接口
   function ownerOf(uint256 _tokenId) constant returns (address owner);
   function approve(address _to, uint256 _tokenId);
   function takeOwnership(uint256 _tokenId);
   function transfer(address _to, uint256 _tokenId);
   function tokenOfOwnerByIndex(address _owner, uint256 _index) constant returns (uint tokenId);
   //通證元數(shù)據(jù)接口
   function tokenMetadata(uint256 _tokenId) constant returns (string infoUrl);
   //事件
   event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
   event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);
}

name - 名稱

該函數(shù)應(yīng)當(dāng)返回通證的名稱。 例如:

contract MyNFT {
  function name() constant returns(string name){
    return "My Non-FungibleToken";  
  }
}

Symbol - 符號

該函數(shù)應(yīng)當(dāng)返回通證的符號,它有助于提高與ERC20的兼容性。例如:

contract MyNFT {
  function symbol() constant returns(string symbol){
    return "MNFT";
  }
}

ERC721藏品合約怎么實(shí)現(xiàn)

totalSupply - 總發(fā)行量

該函數(shù)應(yīng)當(dāng)返回區(qū)塊鏈上供應(yīng)的通證總數(shù)量,該數(shù)量不一定是固定不變的。 例如:

contract MyNFT {
  //想發(fā)行多少取決于你 ;)
  uint256 private totalSupply = 1000000000;

  function totalSupply() constant returns (uint256supply){
    return totalSupply;
  }
}

balanceOf - 余額

該函數(shù)用于查詢某一地址里的通證余額。例如:

contract MyNFT {
  mapping(address => uint) privatebalances;
  
  function balanceOf(address _owner) constant returns(uint balance){ 
    return balances[_owner];
  }
}

下面這些函數(shù)定義了合約如何處理通證的所有權(quán)及如何轉(zhuǎn)移所有權(quán)。其中最重要的兩個函數(shù) 是獲取(takeOwnership)和轉(zhuǎn)賬(transfer),用來實(shí)現(xiàn)用戶之間的通證流轉(zhuǎn),就像銀行的提款 和匯款功能。

ownerOf - 持幣人

該函數(shù)返回通證持有人的地址。因?yàn)槊恳粋€ERC721通證都是不可替代的,因此可以在區(qū)塊鏈上 唯一的地址找到,我們可以用通證的ID來確定其持有人。

contract MyNFT {
  mapping(uint256 => address) privatetokenOwners;
  mapping(uint256 => bool) private tokenExists;

  function ownerOf(uint256 _tokenId) constant returns (address owner) {
    require(tokenExists[_tokenId]);
    return tokenOwners[_tokenId];
  }
}

approve - 授權(quán)

該函數(shù)用來授權(quán)給另一主體代表持有人進(jìn)行通證轉(zhuǎn)移操作。例如,假設(shè)Alice有一個ERC721通證,她可以 調(diào)用approve函數(shù)來授權(quán)給她的朋友Bob,然后Bob就可以代表Alice行使通證持有人的權(quán)利。

contract MyNFT {
  mapping(address => mapping (address=> uint256)) allowed;
  
  function approve(address _to, uint256 _tokenId){
    require(msg.sender ==ownerOf(_tokenId));
    require(msg.sender != _to);
   
    allowed[msg.sender][_to] = _tokenId;
    Approval(msg.sender, _to, _tokenId);
  }
}

takeOwnership - 獲取

該函數(shù)類似于取款功能,一個外部主體通過調(diào)用takeOwnership函數(shù)來從另一個用戶的賬戶 中提取ERC721通證。

因此,在一個用戶被(其他人)授權(quán)擁有一定數(shù)量的通證的情況下,可以通過該功能將這部分 通證從另一個用戶的賬戶中提取出來。

contract MyNFT {
  function takeOwnership(uint256_tokenId){
    require(tokenExists[_tokenId]);

    address oldOwner = ownerOf(_tokenId);
    address newOwner = msg.sender;

    require(newOwner != oldOwner);

    require(allowed[oldOwner][newOwner] == _tokenId);
    balances[oldOwner] -= 1;
    tokenOwners[_tokenId] = newOwner;

    balances[oldOwner] += 1;
    Transfer(oldOwner, newOwner,_tokenId);
  }
}

transfer - 轉(zhuǎn)賬

另一種轉(zhuǎn)移通證的方法時使用transfer函數(shù)。轉(zhuǎn)賬(transfer)功能可以讓用戶將通證發(fā)給另一個用戶, 類似于操作比特幣這樣的加密數(shù)字貨幣。然而,只有在匯出賬戶之前授權(quán)過匯入賬戶持有其通證的 情況下,才可以進(jìn)行轉(zhuǎn)賬。

contract MyNFT {
  mapping(address => mapping(uint256 => uint256)) private ownerTokens;
  function removeFromTokenList(address owner, uint256 _tokenId) private {
    for(uint256 i = 0;ownerTokens[owner][i] != _tokenId;i++){
      ownerTokens[owner][i] = 0;
    }
  }
  function transfer(address _to, uint256 _tokenId){
    address currentOwner = msg.sender;
    address newOwner = _to;
    require(tokenExists[_tokenId]);
    require(currentOwner == ownerOf(_tokenId));
    require(currentOwner != newOwner);
    require(newOwner != address(0));
    removeFromTokenList(_tokenId);
    balances[oldOwner] -= 1;
    tokenOwners[_tokenId] = newOwner;
    balances[newOwner] += 1;
    Transfer(oldOwner, newOwner, _tokenId);
  }
}

tokenOfOwnerByIndex - 通證檢索

這個函數(shù)是可選的,但推薦你實(shí)現(xiàn)它。

每一個ERC721通證的持有者可以同時持有不止一個通證,因?yàn)槊總€通證都有唯一的ID,但是,要跟蹤某個用戶持有的 通證可能就會比較困難。為此,合約需要記錄每個用戶持有的每個通證。通過這種方式,用戶可以 通過索引清單檢索其擁有的通證。通證檢索(tokenOfOwnerByIndex)函數(shù)可以通過這種方式追溯某一特定的通證。

contract MyNFT {
  mapping(address => mapping(uint256 => uint256)) private ownerTokens;
  function tokenOfOwnerByIndex(address _owner, uint256 _index) constant returns (uint tokenId){
    return ownerTokens[_owner][_index];
  }
}

tokenMetaData - 通證元數(shù)據(jù)

就像我們之前所說的,使物品具有不可替代性的是它們獨(dú)一無二的特質(zhì)。美元和網(wǎng)球卡不可替代, 因?yàn)樗鼈兊奶卣鞑煌?。但是,在區(qū)塊鏈上將這些區(qū)分每個通證的特征儲存下來成本很高,也不推薦這么做。 為了解決這個問題,我們可以儲存每個通證的引用(references),例如IPFS哈?;騂TTP(S)鏈接,這些 引用,被稱作元數(shù)據(jù)。元數(shù)據(jù)是可選的。

tokenMetaData函數(shù)應(yīng)當(dāng)返回通證的元數(shù)據(jù),或者通證數(shù)據(jù)的鏈接。

contract MyNFT {
  mapping(uint256 => string) tokenLinks;
  function tokenMetadata(uint256 _tokenId) constant returns (string infoUrl) {
    return tokenLinks[_tokenId];
  }
}

當(dāng)調(diào)用合約方法的時候,事件將會被觸發(fā),并且一旦被觸發(fā)就會向監(jiān)聽系統(tǒng)傳播。外部應(yīng)用可以監(jiān)聽區(qū)塊鏈 中的事件,一旦接收到區(qū)塊鏈中的事件被觸發(fā),監(jiān)聽系統(tǒng)就可以通過事件中包含的信息執(zhí)行邏輯程序。 ERC721標(biāo)準(zhǔn)定義了下面兩個事件。

Transfer - 轉(zhuǎn)賬

當(dāng)一個通證的所有權(quán)從一個用戶轉(zhuǎn)移到另一個時,將觸發(fā)該事件,事件的信息包括匯出賬戶、匯入賬戶和通證ID。

contract MyNFT {
  event Transfer(address indexed _from,address indexed _to, uint256 _tokenId);

}

Approval - 批準(zhǔn)

當(dāng)一個用戶允許另一個用戶持有其通證的時候(例如啟用“授權(quán)”功能的時候),該事件就會被觸發(fā),事件的信息中 包含這些通證現(xiàn)在的持有賬戶、被授權(quán)賬戶以及通證ID。

contract MyNFT {
  event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);
}

感謝各位的閱讀,以上就是“ERC721藏品合約怎么實(shí)現(xiàn)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對ERC721藏品合約怎么實(shí)現(xiàn)這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

網(wǎng)站標(biāo)題:ERC721藏品合約怎么實(shí)現(xiàn)
文章網(wǎng)址:http://www.rwnh.cn/article8/jishop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作網(wǎng)站維護(hù)、網(wǎng)站收錄、網(wǎng)站建設(shè)、網(wǎng)站改版、域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)
丘北县| 丰宁| 株洲县| 榆中县| 南开区| 马龙县| 文登市| 永年县| 刚察县| 五华县| 永城市| 达拉特旗| 万年县| 盘锦市| 镇平县| 苍山县| 晋州市| 曲阜市| 凤山县| 莱芜市| 洛南县| 白玉县| 高碑店市| 喀什市| 拉孜县| 威信县| 双辽市| 西吉县| 宜良县| 新晃| 潼南县| 如东县| 嘉义县| 达尔| 堆龙德庆县| 正镶白旗| 邛崃市| 沙湾县| 恩平市| 华蓥市| 民县|