21026 large

151 孤荷凌寒自学第 0237 天_区块链第 151 天 NFT048 继续自己的 NFT 合约与前端

941xue · 于 发布 · 782 次阅读

孤荷凌寒自学第0237天
区块链学习第151天
NFT048继续自己的NFT合约与前端
(文末有具体的学习过程录屏视频地址等)

笔记合集在github上:
https://github.com/lhghroom/Self-learning-blockchain-from-scratch

【主要内容】
今天尝试解决交易NFT时的购买操作不能完成,仍然失败了,共耗时30分钟。
(此外整理作笔记花费了约36分钟)
详细学习过程见文末学习过程屏幕录像。

【采用逐步删除排除法修改exchange.sol文件并不断部署测试,但购买nft的操作仍然失败】
最后一次修改到exchange.sol文件的最终样子如下:

//购买指定ID的NFT资产的方法
  function buy(uint256 assetId) payable public {
    //require(msg.value >= _orders[assetId]); //验证当前调用合约的节点 发送的 代币(ETH)的数量是否大于等于这个指定ID资产的 当前 定价
    //require(_orders[assetId] > 0); //还得验证这个资产的定价是否不是 0,这儿默认认为如果价格是0那就不是出售状态
    //---把第一句注释掉的代码换成下面的写法:https://www.cnblogs.com/zhizaixingzou/p/10122209.html
    //if(msg.value < _orders[assetId]){
    //  revert("没有足够的ether来支付");
      //return ; //这种写法未经验证
    //}
    //if(_orders[assetId] == 0){
    //  revert("this nft is unselled.");
    //  return ; //这种写法未经验证
    //}

    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;
    //从在售列表中把当前资产删除
    int256 intindex=ghlhsuintarraylib.uintarraygetindexbyvalue(idlst,assetId);
    if(intindex>=0){
      ghlhsuintarraylib.uintarrayremovebyindex(idlst,intindex);
      ghlhsuintarraylib.uintarrayremovebyindex(valuelst,intindex);
      //ghlhsuintarraylib.uintarrayremovebyindex(datalst,intindex);
    }
  }

还是没有真正定位到是哪句或哪几句代码有错。
不过居然排除发现,一直以为是:
require语句有错,现在发现其实不是,因此 猜测这东西还真是不靠谱,唯有实践才能出真知。

【准备开始学习最新版的solidity语语言规范】
痛定思痛之后呢,决定不如直接学习最新版本的solidity版本0.7
于是找到了官方中文文档:
https://learnblockchain.cn/docs/solidity/layout-of-source-files.html
这是0.7.1版本的官方文档。
此外,在cnsdn上找到了0.5版的更新说明,发现,原来每一次的版本升级,都加入了更严格的限制,看这篇博文:
https://blog.csdn.net/angciyu/article/details/84852385
满满一篇都写满了更严格的限制和语法的不兼容,那我只好准备当作完全学习一种全新的语言来对待了。

【solidity0.7.0学习笔记】
一、版本标识Pragmas
认真阅读官方文档,才明白过来,^符号在版本标识中意思 只是,在当前二级版本号范围内有效。
如:
pragma solidity ^0.5.2;
这样,源文件将既不允许低于 0.5.2 版本的编译器编译, 也不允许高于(包含) 0.6.0 版本的编译器编译(第二个条件因使用 ^ 被添加)。 这种做法的考虑是,编译器在 0.6.0 版本之前不会有重大变更,所以可确保源代码始终按预期被编译。 上面例子中不固定编译器的具体版本号,因此编译器的补丁版也可以使用。
不是我之前理解 的那样,只要版本高于0.5.2就可以,原来是有上限的(到0.6之下)

【欢迎大家加入[就是要学]社群】
如今,这个世界的变化与科技的发展就像一个机器猛兽,它跑得越来越快,跑得越来越快,在我们身后追赶着我们。
很多人很早就放弃了成长,也就放弃了继续奔跑,多数人保持终身不变的样子,原地不动,成为那猛兽的肚中餐——当然那也不错,在猛兽的逼迫下,机械的重复着自我感觉还良好地稳定工作与生活——而且多半感觉不到这有什么不正常的地方,因为在猛兽肚子里的是大多数人,就好像大多数人都在一个大坑里,也就感觉不出来这是一个大坑了,反而坑外的世界显得有些不大正常。
为什么我们不要做坑里的大多数人?
因为真正的人生,应当有百万种可能 ;因为真正的一生可以有好多辈子组成,每一辈子都可以做自己喜欢的事情;因为真正的人生,应当有无数种可以选择的权利,而不是总觉得自己别无选择。因为我们要成为一九法则中为数不多的那个一;因为我们要成为自己人生的导演而不是被迫成为别人安排的戏目中的演员。
【请注意】
就是要学社群并不会告诉你怎样一夜暴富!也不会告诉你怎样不经努力就实现梦想!
【请注意】
就是要学社群并没有任何可以应付未来一切变化的独门绝技,也没有值得吹嘘的所谓价值连城的成功学方法论!
【请注意】
社群只会互相帮助,让每个人都看清自己在哪儿,自己是怎样的,重新看见心中的梦想,唤醒各自内心中的那个英雄,然后勇往直前,成为自己想要成为的样子!
期待与你并肩奔赴未来!

QQ群:646854445 (【就是要学】终身成长)

【原文地址】
https://www.941xue.com/content.aspx?k=941XUECERHRZ74809591430449664207 【同步语音笔记】
https://www.ximalaya.com/keji/19103006/368981680

【学习过程屏幕录屏】
https://www.bilibili.com/video/BV1ki4y1V7YD/

  • 暂无回复。