基於eos的Dapp開發--元素戰爭(二)
我們上篇文章中講到完成一個Dapp的搭建需要兩個主要的部分,即智慧合約的編寫以及前段的構建,今天我們首先來一步步看智慧合約中主要有哪些內容以及是如何編寫的。
在智慧合約中,資料的儲存是較為重要的一環,我們在做原始碼分析的時候都知道資料是儲存在Multi-Index(多索引表)裡面的,本文將介紹如何建立一個多索引表以及如何通過action來更新表中的內容的,同時我們引入了智慧合約中使用的ABI的概念。
1、第二課
在元素戰爭遊戲中,我們需要儲存玩家的遊戲狀態、細節等資訊,在這裡我們使用eos系統中的Multi-index來實現,對於不太熟悉boost multi-index的朋友們來說,你可以簡單的把multi-idnex想象成一個關係型資料庫,知道他是用來儲存資料的就可以了。如何來建立一個多索引表呢?
1、首先讓我們來建立一個使用者資訊表user_info,user_info中包含了以下內容:
- 使用者名稱
- 贏的次數(初始化為0)
- 輸的次數(初始化為0) 使用者名稱是一個uint64的account_name型別,而贏的次數和輸的次數均為int整型。為了查詢我們儲存的資料,我們還需要定義一個類似主鍵的東西,我們稱之為primary_key()。primary_key()需要實現,返回當前使用者名稱即可。
// @abi table users struct user_info { account_name name; uint16_t win_count = 0; uint16_t lost_count = 0; auto primary_key() const { return name; } };
2、然後我們typedef一個名為users_table,在這裡需要主要user_info要和上一步定義的結構體名一樣,不然編譯就會失敗。我們的typedef包含兩部分內容
- 表名
- 剛宣告的結構體的名
typedef eosio::multi_index<N(users), user_info> users_table;
3、宣告一個多索引變數
users_table _users;
4、在建構函式中初始化這個變數
那麼這一系列的操作中主要包含哪些資訊呢:
- code(合約賬戶名),_users(self,self),提供了code和scope
- scope
- table name,N(user)提供了表名
- primary key,primary_key()返回了主鍵資訊 此處需說明:上面宣告的一個表適用於整個智慧合約範圍內。
多索引表定義號之後,我們來嘗試使用login這個action來更新多索引表,login這個action是為了驗證使用者是否有許可權登陸元素戰爭的,因此我們需要使用require_auth()這個函式來獲取使用者相應的許可權,如果玩家是第一次玩這個遊戲,我們就需要在多索引表中建立這個使用者的相關資訊。
//宣告
void login(account_name username);
//實現
void cardgame::login(account_name username) {
// Ensure this action is authorized by the player
require_auth(username);
// Create a record in the table if the player doesn't exist in our app yet
auto user_iterator = _users.find(username);
if (user_iterator == _users.end()) {
user_iterator = _users.emplace(username, [&](auto& new_user) {
new_user.name = username;
});
}
}
接下來再來看ABI,ABI定義了我們智慧合約中的資料結構和action的資訊,因此在部署智慧合約之前我們需要建立一個和我們智慧合約對應的ABI檔案,eos官方已經提供了一個自動化生成ABI檔案的工具–eosiocpp。eosiocpp可以檢測到我們ABI中的資訊,為了規範我們需要再表名之前寫上@abi table table_name (此處需特別注意),不然就會出現表中資料查詢為空的情況,感興趣的朋友也可以試一下,這和我們平時的註釋內容是有區別的哦。在開發者指引手冊中有詳細的介紹ABI的檔案生成 ABI的相關說明 以及如何手寫一個ABI檔案 如何手寫一個ABI檔案 每個action均需使用EOSIO_ABI來包含,不然在部署完合約之後使用push action的時候會提示你該action不存在,如下:
EOSIO_ABI(cardgame, (login))
然後使用eosiocpp命令來生成ABI檔案如下:
eosiocpp -g cardgame.abi cardgame.cpp
至此,我們便完成了簡單的智慧合約的編寫,更多的功能實現會再接下來的文章中介紹,同時智慧合約的部署、前端和智慧合約之間的通訊也會一步步進行。
如果你覺得我的文章對你有一定的幫助,請點選文章末尾的喜歡該作者。
如果你對eos開發感興趣,歡迎關注本公眾號,一起學習eos開發。
微信公眾號
有任何疑問或者指教請新增本人個人微信,當然有對eos開發感興趣或者金庸粉的也可以新增一起交流,備註eos開發或金庸。
個人微訊號