145孤荷凌寒自學第0231天_區塊鏈第145天NFT042繼續自己的NFT合約與前端

【主要內容】

今天繼續修改完善智能合約代碼,共耗時30分鐘。

(此外整理作筆記花費了約26分鐘)

詳細學習過程見文末學習過程屏幕錄像。

 

【搞清楚了數組的一些知識】

https://blog.csdn.net/qq_33764491/article/details/80394739

https://www.jianshu.com/p/8e3da36fe587

1.添加memory的關鍵字的內存數組,不會記錄到區塊中,只存在於內存中,因此:

(1)儘量聲明成定長數組

聲明方法

uint[5] a;

方括號裏必須是一個常數,而不能是變量之類的。

(2)也可以聲明爲變長數組,但必須在聲明後明確初始化,一旦初始化,數組的長度Length又被固定了,再也不能修改,也就又成爲了定長數組。

但在初始化時,使用New關鍵字的時候,就可以使用變量來指定長度了。

於是最終寫法是這樣的

c是一個整數型變量

```

        uint256[] memory idlst=new uint[](c);

```

這樣就完成了一個memory類型的數組的初始化,這個數組將擁有c個元素。後面數組的元素個數(就是它的Length)就再也不能修改了。

3.只要在智能合約的函數中的數組使用了storage關鍵字,這個函數方法就是一個必須 付gas的方法。此外的發現,如果在函數內聲明一個數組,既不使用storage關鍵字,也不使用memory關鍵字,則也是要求付gas的,這兒尚且不明白,難道默認聲明數組就是storage嗎?

【今天修改後的用於讀取合約中已經被註銷的NFT的ID列表的函數】

```

  //這兒還應當有一個方法:把已經被節點自己註銷的NFT的ID信息查詢出來 ,返回所有已被註銷的NFT資產的ID數組

  function getdestroyid() public view returns (uint256[]){

      //這裏不能返回字符串數組,

      //https://blog.csdn.net/weixin_34242819/article/details/89695922

      uint intc = _assetsIds.length;

      uint c = 0; //第一步讀取出有多少個NFT 是被註銷的

      if(intc > 0){

        uint i = 0;

        uint256 id = 0;

        for(i = 0;i < intc;i++){

          id=_assetsIds[i];

          if(_holderOf[id]==0){

            //===擁有者爲零的nft就是已經被註銷掉的

            c=c+1; ///這一次只是在計數

          }

        }

 

        uint256[] memory idlst=new uint[](c);

        //https://www.jianshu.com/p/8e3da36fe587

        //定長數組的定義,方括號裏只能是常量,不能是變量,所以使用new 關鍵字來指明 初始化值

        //重新獲取 具體的ID

        uint k = 0;

        for(i=0;i<intc;i++){

          id=_assetsIds[i];

          if(_holderOf[id]==0){

            //===擁有者爲零的nft就是已經被註銷掉的

            k=k+1;

            if(k<=c){

              idlst[k-1] = id;

            }

          }

        }

       

        return idlst;

 

      }

  }

```

已經測試通過。

 

【最終完成的文件:StandardAssetRegistryTest.sol】

已部署測試成功。

```

pragma solidity ^0.4.18;

 

import './FullAssetRegistry.sol';

//這個合約是最終可供部署的合約

//第一次部署完成這個合約的地址 0x61b84673A5768Fd046c98e69251C8f5493B44497   第一次部署時,使用的基準sol文件是:exchange.sol

//第二次部署完成的這個合約的地址 0xeD4202E35c63EDfDC38Fff34100Ac86217960DD3   第二次部署時,使用的基準sol文件就是本合約文件

//第三次部署完成的這個合約的地址 0xCDBc486981014948e87F8A53b8F754405F1fA5E8   第三次部署時,使用的基準sol文件與第二次一樣,本次文件作了大量的修改

//第四次部署完成的這個合約的地址 0x487866047aF2078A0dB86E2217539898c0E9c7c3

//第五次部署完成的這個合約地址 0x66f39DBAc585457B57540ebA5eF92aaBE4a0fa8F

//第六次部署完成的這個合約地址 0x4896caDbd8633661ca988f9cb0b21d4b5C5Ea79b

contract StandardAssetRegistryTest is FullAssetRegistry {

 

  constructor() public {

    _name = "ghlhNft"; //給nft命名

    _symbol = "GHLH"; //標識代號

    _description = "ghlh's nft assets"; //描述

    addowner=msg.sender; //指明瞭誰是這個合約的部署者,目前的設想是:合約的擁有者可以把已被原資產擁有者主動銷燬的資產重新分配給新的節點地址;合約擁有者可以獲得一定交易手續費

  }

 

  //下面的方法檢查某個節點地址是不是一個合約地址-------------------------

  function isContractProxy(address addr) public view returns (bool) {

    return _isContract(addr); //在基類合約 ERC721Base.sol 中定義的一個僅供合約內部調用的方法

  }

 

  //生成一個新資產,這個函數已被孤荷凌寒修改。 這個方法供外部調用。beneficiary是受益人節點地址,也就是把指定ID的NFT資產登記到beneficiary節點名下

  function generate(address beneficiary,string data) public {

    uint256 assetId = _getnewfreeassetid(); //獲取一個新的ID,在基類合約 ERC721Base.sol 中定義的一個僅供合約內部調用的方法

    _generate(assetId, beneficiary); //登記這個新的NFT資產在基類合約 ERC721Base.sol 中定義的一個僅供合約內部調用的方法

    //下面是孤荷凌寒補充的,增加這個ID資產的URL

    _update(assetId,data); //這個方法是個僅供內部調用的方法在文件ERC721Metadata.sol中定義的

  }

 

  //讓指定ID的NFT資產(由形參assetId指定)從現在的擁有在手中 脫離(轉移開),就是使其現擁有者不再擁有這個NFT資產,

  //這這時候只有assetId的擁有節點可以執行銷燬操作

  function destroy(uint256 assetId) public {

    _destroy(assetId); //在基類合約 ERC721Base.sol 中定義的一個僅供合約內部調用的方法

  }

 

  //合約擁有者可以把已經註銷的NFT資產進行恢復,並指定給另一個節點

  //只有合約擁有者可以操作

  function recovery(uint256 assetId,address newadd) public {

    _recovery(newadd,assetId);

  }

 

  //這兒還應當有一個方法:把已經被節點自己註銷的NFT的ID信息查詢出來 ,返回所有已被註銷的NFT資產的ID數組

  function getdestroyid() public view returns (uint256[]){

      //這裏不能返回字符串數組,

      //https://blog.csdn.net/weixin_34242819/article/details/89695922

      uint intc = _assetsIds.length;

      uint c = 0; //第一步讀取出有多少個NFT 是被註銷的

      if(intc > 0){

        uint i = 0;

        uint256 id = 0;

        for(i = 0;i < intc;i++){

          id=_assetsIds[i];

          if(_holderOf[id]==0){

            //===擁有者爲零的nft就是已經被註銷掉的

            c=c+1; ///這一次只是在計數

          }

        }

 

        uint256[] memory idlst=new uint[](c); 

        //https://www.jianshu.com/p/8e3da36fe587

        //定長數組的定義,方括號裏只能是常量,不能是變量,所以使用new 關鍵字來指明 初始化值 

        //重新獲取 具體的ID

        uint k = 0;

        for(i=0;i<intc;i++){

          id=_assetsIds[i];

          if(_holderOf[id]==0){

            //===擁有者爲零的nft就是已經被註銷掉的

            k=k+1;

            if(k<=c){

              idlst[k-1] = id;

            }

          }

        }

        

        return idlst;

 

      }

 

  }



  // Problematic override on truffle 轉移資產的方法

  function safeTransfer(address from, address to, uint256 assetId, bytes data) public {

    return _doTransferFrom(from, to, assetId, data, true); //在基類合約 ERC721Base.sol 中定義的一個僅供合約內部調用的方法//這個僅供合約內部使用的函數纔是真正的實現NFT資產轉移 的函數過程

  }

}

 

 

```

 

github: https://github.com/lhghroom/Self-learning-blockchain-from-scratch

 

 

【歡迎大家加入[就是要學]社羣】

如今,這個世界的變化與科技的發展就像一個機器猛獸,它跑得越來越快,跑得越來越快,在我們身後追趕着我們。

很多人很早就放棄了成長,也就放棄了繼續奔跑,多數人保持終身不變的樣子,原地不動,成爲那猛獸的肚中餐——當然那也不錯,在猛獸的逼迫下,機械的重複着自我感覺還良好地穩定工作與生活——而且多半感覺不到這有什麼不正常的地方,因爲在猛獸肚子裏的是大多數人,就好像大多數人都在一個大坑裏,也就感覺不出來這是一個大坑了,反而坑外的世界顯得有些不大正常。

爲什麼我們不要做坑裏的大多數人?

因爲真正的人生,應當有百萬種可能 ;因爲真正的一生可以有好多輩子組成,每一輩子都可以做自己喜歡的事情;因爲真正的人生,應當有無數種可以選擇的權利,而不是總覺得自己別無選擇。因爲我們要成爲一九法則中爲數不多的那個一;因爲我們要成爲自己人生的導演而不是被迫成爲別人安排的戲目中的演員。

【請注意】

就是要學社羣並不會告訴你怎樣一夜暴富!也不會告訴你怎樣不經努力就實現夢想!

【請注意】

就是要學社羣並沒有任何可以應付未來一切變化的獨門絕技,也沒有值得吹噓的所謂價值連城的成功學方法論!

【請注意】

社羣只會互相幫助,讓每個人都看清自己在哪兒,自己是怎樣的,重新看見心中的夢想,喚醒各自內心中的那個英雄,然後勇往直前,成爲自己想要成爲的樣子!

期待與你並肩奔赴未來!

 

QQ羣:646854445 (【就是要學】終身成長)

 

 

 

【原文地址】

https://www.941xue.com/content.aspx?k=941XUEPEXEAE81991768775335325452

 

【同步語音筆記】

https://www.ximalaya.com/keji/19103006/366823278

 

【學習過程屏幕錄屏】

https://www.bilibili.com/video/BV1Hf4y1q7v9/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章