前面一篇文章因為一些原因 被設(shè)為了進自己可見 需要的朋友可以私信我
之前 我們編寫的程序上來看 交易所無非是一個代幣的托管上 只是它會更加專業(yè)
本文 我們繼續(xù)來看交易所的一個功能 叫游泳池
例如 我們 100grToken 兌換 1ETH
前提 我們的代幣已經(jīng)能被估值了
例如 你想用人民幣對美元 中間他們之間的匯率是要規(guī)定好的
但我們這里 本身就是一個模擬環(huán)境
我們直接去操作也不太合理
所以 我們這里直接開發(fā)一個游泳池功能 或者叫訂單池
我們可以自己去創(chuàng)建訂單 例如 小明發(fā)布一個 你們誰愿意用 100grToken 換 1 ETH啊
我們未完成的訂單就會在我們游泳池中 如果有人覺得合適 點了這個確定 后臺就會操作 將他和發(fā)布這個訂單的人相應(yīng)的數(shù)據(jù)扣除 完成這個訂單
但也可能 某某發(fā)布了 但因為匯率變化 覺得之前發(fā)的這個不太合適了 也可以取消
這里 我們需要創(chuàng)建三個函數(shù)
makeOrder 創(chuàng)建訂單
cancelOrder 取消訂單
fillorder 填充訂單
還是標準流程 啟動我們的ganache環(huán)境
然后 我們這邊還有個問題 我們不能很好的查到用戶的 token數(shù)量
那么 我們需要在Exchange.sol中 加一個balanceof 函數(shù) 我們指定查詢tokens 下 對應(yīng)地址 下對應(yīng)用戶的值
返回一個uint256數(shù)字類型的值
然后 設(shè)置了 public函數(shù)作用域是公共的 view設(shè)置他只是讀取我們區(qū)塊鏈上的信息
然后 我們?nèi)魏斡唵?都需要包含以下幾個信息
id 這是數(shù)據(jù)結(jié)構(gòu)最基本的東西 要有id才能標記和刪除訂單
創(chuàng)建訂單的用戶 因為 肯定在界面展示時也需要進行權(quán)限判斷 要是當(dāng)前用戶 才能對訂單進行刪除和管理
再就是 用什么 代幣 去 兌換另一種代幣
時間 存儲訂單的創(chuàng)建時間
這些成員必須是要有的
我們要梳理正思想 我們沒有服務(wù)器 沒有數(shù)據(jù)庫 所以 你生命在鏈上的數(shù)據(jù)結(jié)構(gòu) 它就是數(shù)據(jù)存儲
然后 我們在交易所 Exchange.sol 合約中聲明一個這樣的訂單結(jié)構(gòu)體
//訂單結(jié)構(gòu)體
struct _Order{
uint256 id;
address user;
address tokenGet;
uint256 amountGet;
address tokenGive;
uint256 amountGive;
uint256 timestamp;
}
這里 我們 的數(shù)據(jù)結(jié)構(gòu) 就和上面的 對應(yīng)上了 兩種token的數(shù)量和地址 id 用戶地址 時間搓
但是 這種形式 顯然只支持我們創(chuàng)建一個訂單
如果要創(chuàng)建多個 這種方法肯定要加碼
比較簡答的方式 自然就是用一個_Order類型的數(shù)組
_Order[] orderlist;
但這里 為了方便通過id查詢 我選擇直接
mapping(uint256=> _Order) public orders;
定義一個mapping對象屬性 然后 鍵是一個uint256數(shù)字類型 對應(yīng)訂單id 然后 值 是一個_Order對象
學(xué)過js的朋友應(yīng)該都會明白二者之前的差異
數(shù)組的是這樣
[1,2,3]
而我們現(xiàn)在用的對象形式的是這樣的
{
0: 1,
1: 2,
2: 3
}
但無非 我們對象的鍵 我們用的是訂單的id
我們就可以通過 對象[訂單id] 這種形式去找到他
然后 我們再在下面創(chuàng)建一個
uint256 public orderCount;
數(shù)字類型 只是單純記錄一下訂單的數(shù)量
然后 我們就可以在下面去寫這個
makeOrder了 創(chuàng)建訂單
但經(jīng)過前面幾篇 交易所的內(nèi)容 我想大家也養(yǎng)成了 事件記錄的好習(xí)慣
那么 這里 創(chuàng)建訂單 我們也需要記錄
我們定義一個事件
event Order(uint256 id,address user,address tokenGet,uint256 amountGet,address tokenGive,uint256 amountGive,uint256 timestamp);
然后 我們 編寫makeOrder函數(shù)
function makeOrder(address _tokenGet,uint256 _amountGet,address _tokenGive,uint256 _amountGive) public {
orderCount = orderCount.add(1);
orders[orderCount] = _Order(orderCount,msg.sender,_tokenGet,_amountGet,_tokenGive,_amountGive,block.timestamp);
emit Order(orderCount,msg.sender,_tokenGet,_amountGet,_tokenGive,_amountGive,block.timestamp);
}
然后 我們這個參數(shù) 接受 兩種代幣的 地址和 數(shù)量 然后 我們獲取orderCount 將他加一 例如 我們第一次進來 他是0 我們將他加1 這樣 他就是1 然后 我們將當(dāng)前訂單復(fù)制 id就是orderCount
第二次進來 orderCount 是 1 加一 就成了2
然后 我們用戶還是通過msg.sender去拿 誰調(diào)用的拿誰
通過block.timestamp 獲取當(dāng)前時間的時間搓
將數(shù)據(jù)添加完之后 調(diào)用我們剛剛寫的Order 記錄一下訂單信息
好 這里 我們其實還不具備測試的條件 為了保證我們代碼沒問題 我們在終端執(zhí)行文章來源:http://www.zghlxwxcb.cn/news/detail-652385.html
truffle compile
好啊 沒什么語法問題 至于測試 等我將所有訂單操作都完成了 我們在做更多操作了文章來源地址http://www.zghlxwxcb.cn/news/detail-652385.html
到了這里,關(guān)于Web3 solidity訂單池操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!