孤荷凌寒自學第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/