【主要內容】
今天繼續修改完善智能合約代碼,共耗時34分鐘。
(此外整理作筆記花費了約22分鐘)
詳細學習過程見文末學習過程屏幕錄像。
【較低版本的solidity不支持string數組】
今天在智能合約中,準備加入一個可以返回所有已被節點自行註銷的nft資產ID列表的方法,同時返回每個NFT的對應的data的string。
結果在編譯時就出現 提示,纔想到,string類型本身就是byte數組了,再來個字符串數組,就是二維數組了,solidity低版本是不支持的,同時複習到,字符串數組作爲參數傳遞也是不行的。
【在solidity函數內部定義的事storage關鍵字的變量也是要寫入區塊的】
對這一塊本身不是很熟悉,總感覺自己學習得似是而非,今天一開始在函數內部定義了一個數組對象,沒有使用storage,結果編譯檢查時,提示我加上storage關鍵字,我就加上了,結果 合約部署後,發現這個函數方法就成爲了一個一定要付油費才能調用的方法了。
【最終完成的文件:StandardAssetRegistryTest.sol】
```
pragma solidity ^0.4.18;
import './FullAssetRegistry.sol';
//這個合約是最終可供部署的合約
//第一次部署完成這個合約的地址 0x61b84673A5768Fd046c98e69251C8f5493B44497 第一次部署時,使用的基準sol文件是:exchange.sol
//第二次部署完成的這個合約的地址 0xeD4202E35c63EDfDC38Fff34100Ac86217960DD3 第二次部署時,使用的基準sol文件就是本合約文件
//第三次部署完成的這個合約的地址 0xCDBc486981014948e87F8A53b8F754405F1fA5E8 第三次部署時,使用的基準sol文件與第二次一樣,本次文件作了大量的修改
//第四次部署完成的這個合約的地址 0x487866047aF2078A0dB86E2217539898c0E9c7c3
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 returns (uint256[]){
//這裏不能返回字符串數組,
//https://blog.csdn.net/weixin_34242819/article/details/89695922
uint256[] storage idlst; //如果 定義爲storage就 建議 初始化,但我不會初始化了,暫時沒有理解
//在測試中發現,如果這兒寫爲storage,那麼意味這個變量是要寫入區塊的,是要付出油費的,所以不能這樣寫。
uint intc=_assetsIds.length;
if(intc>0){
uint i=0;
uint256 id=0;
for(i=0;i<intc;i++){
id=_assetsIds[i];
if(_holderOf[id]==0){
//===擁有者爲零的nft就是已經被註銷掉的
idlst.push(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=941XUENHKGMY74850990474712933399
【同步語音筆記】
https://www.ximalaya.com/keji/19103006/366527157
【學習過程屏幕錄屏】