就是要学社区 QQ群组:646854445
你并非已无懈可击,所以你不能逃避问题,拒绝学习!

第0224天_区块链学习138_NFT035_学习erc721接口标准

|阅读量:170 |发布于2021-03-26 22:36:08


正文内容

笔记合集在github上:

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


【主要内容】

今天继续修改完善智能合约代码,共耗时30分钟。

(此外整理作笔记花费了约12分钟)

详细学习过程见文末学习过程屏幕录像。

【主要修改了文件Exchange.sol】

```

pragma solidity ^0.4.18;




//第一次合约部署后的合约地址:0x4123B737C7eE8ed3352f950693149a535A52fbB9 部署时基准sol文件是本合约 文件

//第二次合约部署后的合约地址:0xD743566eab537F268759DF6723280D866764F1b8   部署时的基准sol文件是本合约文件

import './StandardAssetRegistryTest.sol';

//这个合约的目的是,对NFT 资产进行 定价 (amount )并进行【交易】

//这个合约引用了 StandardAssetRegistryTest.sol 却没有继承它,目前感觉是直接把StandardAssetRegistryTest当作了一个类来使用,就是说可以直接作为声明一个新类型变量的标识 关键字

contract Exchange {

 // From asset to amount

 mapping(uint256 => uint256) internal _orders; //这个映射表用于记录下 每个ID(第一个uint256)的NFT资产的定价(第二个uint256)

 //----下面单独登记两个数组--------------

 uint256[] idlst;

 uint256[] valuelst;


 StandardAssetRegistryTest internal nonFungible; //目前感觉是直接把StandardAssetRegistryTest当作了一个类来使用,就是说可以直接作为声明一个新类型变量的标识 关键字

 //现在 nonFungible 就可以看作 合约 (类)StandardAssetRegistryTest 实例化后得到的一个具体对象


 constructor(address _nonFungible) public { //本合约 的建构函数 有一个形参

   nonFungible = StandardAssetRegistryTest(_nonFungible); //这儿把这个形参传递给 合约 标识,没有理解

   //现在证实:形参_nonFungible 应当是 合约:StandardAssetRegistryTest.sol先部署后得到的合约地址,这儿直到的连接到这合约地址的作用。只是一种猜想。也就是先部署StandardAssetRegistryTest.sol,再部署本合约。

   //现在 nonFungible 是一个具体的实例化后的对象

 }


 //指定ID的NFT资产的拥有节点把他自己的这个NFT资产定个价出售(挂出来)

 function sell(uint256 assetId, uint256 amount) public {

   require(nonFungible.ownerOf(assetId) == msg.sender); //现在nonFungible.ownerOf使用的方法就是基类合约中的方法

   _orders[assetId] = amount; //在映射表中登记这个资产的目前定价 amount

   //----添加到专门的数组中------------

   idlst.push(assetId);

   valuelst.push(amount);

 }


//这儿是不是应当还有一个合约方法:撤回出售?


 //购买指定ID的NFT资产的方法

 function buy(uint256 assetId) payable public {

   require(msg.value >= _orders[assetId]); //验证当前调用合约的节点 发送的 代币(ETH)的数量是否大于等于这个指定ID资产的 当前 定价

   require(_orders[assetId] > 0); //还得验证这个资产的定价是否不是 0

   address owner = nonFungible.ownerOf(assetId); //在购买完成前,这个资产是属于哪个节点的

   owner.transfer(_orders[assetId]); //原拥有资产的节点 获得 ETH (就是卖方收钱了)

   uint remaining = msg.value - _orders[assetId]; //如果当前调用合约的节点发送的ETH大于此资产的实际定价,那么求出 要找零 的余额。

   if (remaining > 0) {

    msg.sender.transfer(remaining); //找零给买家

   }

   nonFungible.safeTransferFrom(owner, msg.sender, assetId); //完成这个NFT资产的归属节点的转移 (交货)

   //下面把资产的出售状态去除

   _orders[assetId]=0;


 }


 //查询指定ID的资产是否正在出售

 function isassetissaling(uint256 assetId) view public returns (bool){

   if(_orders[assetId]>0){

     return true;

   }else{

     return false;

   }

 }


 //查询指定ID的资产的售价

 function getassetValue(uint256 assetId) view public returns (uint256){

   return _orders[assetId]>0

 }  


 //返回所有在售资产的列表,第一个数组为ID列表,第二个数组为金额列表

 function getAllassetList() view public returns(uint256[],uint256[]){


 }


}



```

然后尝试写自己的Library

```

pragma solidity ^0.4.18;


library ghlhsuintarraylib{

   //下面的函数来自于:https://learnblockchain.cn/2019/02/22/delete-item/

   //作了修改

   function uintarrayremovebyindex(uint256[] array,uint256 index)  returns(uint256[]) {

       if (index >= array.length) return array;


       for (uint256 i = index; i<array.length-1; i++){

           array[i] = array[i+1];

       }

       delete array[array.length-1];

       array.length--;

       return array;

   }


   //这个函数是自己添加的

   function uintarrayremovebyvalue(uint256[] array,uint256 value)  returns(uint[]) {

       if(array.length <1 ) return array;

       uint256 intlen=array.length;

       uint256 intindex=intlen;

       for (uint256 i=0;i<intlen;i++){

           if(array[i]==value){

               intindex=i;

               break;

           }

       }

       return uintarrayremovebyindex(array,intindex);

   }    


}

```

遇到的问题是,又忘记了solidity三个状态的变量要怎么定义。

需要复习学习并继续。


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



【同步语音笔记】

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


【学习过程屏幕录屏】

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


【就是要学】社区
一个平等,纯粹的社群
本社群旨在为真正愿意不断学习,终身成长的朋友提供一个平等互助互相鼓励的清洁纯粹的学习交流的平台。
加入社群将获得
1、与真正终身学习者为伍
2、在榜样带领下坚持每天学习,终身成长
3、养成记录时间日志,成功日记的习惯


【就是要学】社区QQ群:646854445





【返回首页】