【主要內容】
今天繼續修改完善智能合約代碼與前端代碼,共耗時33分鐘。
(此外整理作筆記花費了約24分鐘)
詳細學習過程見文末學習過程屏幕錄像。
【基本證明我自己寫的solidity庫文件是對的】
之前我自己寫了一個關於uint數組的庫,今天exchange.sol合約部署成功,基本認定庫文件沒有問題:
```
pragma solidity ^0.4.18;
library ghlhsuintarraylib{
//下面的函數來自於:https://learnblockchain.cn/2019/02/22/delete-item/
//作了修改
function uintarrayremovebyindex(uint256[] storage array,int256 index) internal {
uint256 intls=uint256(index);
if (intls < array.length){
for (uint256 i = intls; i<array.length-1; i++){
array[i] = array[i+1];
}
delete array[array.length-1];
array.length--;
}
}
//這個函數是自己添加的,by孤荷凌寒QQ:578652607
function uintarraygetindexbyvalue(uint256[] array,uint256 value) internal pure returns(int256) {
if(array.length < 1){return -1;}
uint256 intlen=array.length;
int256 intindex=-1;
for (uint256 i=0;i<intlen;i++){
if(array[i]==value){
intindex=int256(i);
break;
}
}
return intindex;
}
//這個函數是自己添加的,by孤荷凌寒qq:578652607
function uintarrayremovebyvalue(uint256[] storage array,uint256 value) internal {
int256 intindex=uintarraygetindexbyvalue(array,value);
if(intindex >=0 ){
uintarrayremovebyindex(array,intindex);
}
}
}
```
在合約部署後,已經測試了,寫入數組,刪除數組指定位置的值兩個操作,都沒有問題。
【現在exchange.sol合約的內容】
```
pragma solidity ^0.4.18;
//第一次合約部署後的合約地址:0x4123B737C7eE8ed3352f950693149a535A52fbB9 部署時基準sol文件是本合約 文件
//第二次合約部署後的合約地址:0xD743566eab537F268759DF6723280D866764F1b8 部署時的基準sol文件是本合約文件
//第三次合約部署,對應於NFT合約第六次部署:0x714fa7ad1cAe8E0aB50DA333Ee87D6888f6880A8
import './StandardAssetRegistryTest.sol';
import './ghlhsuintarraylib.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;
//string[] datalst; //這是不行,因爲string數組不能被返回
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);
//datalst.push(nonFungible.tokenMetadata(assetId));
}
//撤回出售
function unsell(uint256 assetId) public {
require(nonFungible.ownerOf(assetId) == msg.sender); //現在nonFungible.ownerOf使用的方法就是基類合約中的方法
_orders[assetId] = 0; //修改定價爲0,意思 就是不再出售
//----從專門的的在售列表數組中刪除當前ID的資產的記錄------------
int256 intindex=ghlhsuintarraylib.uintarraygetindexbyvalue(idlst,assetId);
if(intindex>=0){
ghlhsuintarraylib.uintarrayremovebyindex(idlst,intindex);
ghlhsuintarraylib.uintarrayremovebyindex(valuelst,intindex);
//ghlhsuintarraylib.uintarrayremovebyindex(datalst,intindex);
}
}
//購買指定ID的NFT資產的方法
function buy(uint256 assetId) payable public {
require(msg.value >= _orders[assetId]); //驗證當前調用合約的節點 發送的 代幣(ETH)的數量是否大於等於這個指定ID資產的 當前 定價
require(_orders[assetId] > 0); //還得驗證這個資產的定價是否不是 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;
//從在售列表中把當前資產刪除
int256 intindex=ghlhsuintarraylib.uintarraygetindexbyvalue(idlst,assetId);
if(intindex>=0){
ghlhsuintarraylib.uintarrayremovebyindex(idlst,intindex);
ghlhsuintarraylib.uintarrayremovebyindex(valuelst,intindex);
//ghlhsuintarraylib.uintarrayremovebyindex(datalst,intindex);
}
}
//查詢指定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];
}
//返回所有在售資產的列表,第一個數組爲ID列表,第二個數組爲金額列表
function getAllassetList() view public returns(uint256[],uint256[]){
return (idlst,valuelst);
}
}
```
與exchange.sol合約交互的前端基本沒有修改,只是修改了abi字符串,然後修改了合約地址。
然而測試時,狐狸錢包提示不能授權連接到這個頁面——
MetaMask is not connected this site. To connect to a web3 site, find the connect button on their site.
這情況直接讓我不知所措,折騰了好一會兒,不知道爲什麼同樣的的JS來連接到錢包,這個頁面就不行,而之前 的頁面就可以。
最終今天沒有解決問題,也就沒有嘗試到購買資產的的合約 交互。
github: https://github.com/lhghroom/Self-learning-blockchain-from-scratch
【歡迎大家加入[就是要學]社羣】
如今,這個世界的變化與科技的發展就像一個機器猛獸,它跑得越來越快,跑得越來越快,在我們身後追趕着我們。
很多人很早就放棄了成長,也就放棄了繼續奔跑,多數人保持終身不變的樣子,原地不動,成爲那猛獸的肚中餐——當然那也不錯,在猛獸的逼迫下,機械的重複着自我感覺還良好地穩定工作與生活——而且多半感覺不到這有什麼不正常的地方,因爲在猛獸肚子裏的是大多數人,就好像大多數人都在一個大坑裏,也就感覺不出來這是一個大坑了,反而坑外的世界顯得有些不大正常。
爲什麼我們不要做坑裏的大多數人?
因爲真正的人生,應當有百萬種可能 ;因爲真正的一生可以有好多輩子組成,每一輩子都可以做自己喜歡的事情;因爲真正的人生,應當有無數種可以選擇的權利,而不是總覺得自己別無選擇。因爲我們要成爲一九法則中爲數不多的那個一;因爲我們要成爲自己人生的導演而不是被迫成爲別人安排的戲目中的演員。
【請注意】
就是要學社羣並不會告訴你怎樣一夜暴富!也不會告訴你怎樣不經努力就實現夢想!
【請注意】
就是要學社羣並沒有任何可以應付未來一切變化的獨門絕技,也沒有值得吹噓的所謂價值連城的成功學方法論!
【請注意】
社羣只會互相幫助,讓每個人都看清自己在哪兒,自己是怎樣的,重新看見心中的夢想,喚醒各自內心中的那個英雄,然後勇往直前,成爲自己想要成爲的樣子!
期待與你並肩奔赴未來!
QQ羣:646854445 (【就是要學】終身成長)
【原文地址】
https://www.941xue.com/content.aspx?k=941XUEYBDNUT83211699531490024112
【同步語音筆記】
https://www.ximalaya.com/keji/19103006/367444854
【學習過程屏幕錄屏】