摘要:需要對構(gòu)造函數(shù)進(jìn)行命名和配置,以使用我們之前定義的結(jié)構(gòu)。我們的構(gòu)造函數(shù)傳遞的范圍參數(shù)是正在部署合約的區(qū)塊鏈上的帳戶。此方法接受兩個(gè)參數(shù),即此記錄的范圍和回調(diào)函數(shù)?;卣{(diào)函數(shù)用于處理表的修改。但是如果用戶想要完全刪除記錄呢請看的數(shù)據(jù)持久性下。
本教程假定你已經(jīng)完成了EOS開發(fā)從智能合約開始。
要了解數(shù)據(jù)持久性,請編寫一個(gè)簡單的智能合約,作為地址記錄。雖然這個(gè)用例由于各種原因而不太適合作為生產(chǎn)智能合約,但開始學(xué)習(xí)數(shù)據(jù)持久性如何在EOSIO上運(yùn)行而不被與eosio的multi_index功能無關(guān)的業(yè)務(wù)邏輯分心,這也算的上一個(gè)很好的合約。
第1步:創(chuàng)建一個(gè)新目錄之前,你創(chuàng)建了一個(gè)合約目錄,現(xiàn)在就在那里開始。
//shell cd CONTRACTS_DIR
為我們的合約創(chuàng)建一個(gè)新目錄并進(jìn)入目錄:
//c++ mkdir addressbook cd addressbook第2步:創(chuàng)建并打開一個(gè)新文件
//c++ touch addressbook.cpp
在你喜歡的編輯器中打開文件。
第3步:編寫擴(kuò)展標(biāo)準(zhǔn)類并包含EOSIO在之前的教程中,你創(chuàng)建了一個(gè)hello world合約,并學(xué)習(xí)了基礎(chǔ)知識。你將熟悉下面的結(jié)構(gòu),該類已分別命名為addressbook。
//c++ #include第4步:為表創(chuàng)建數(shù)據(jù)結(jié)構(gòu)#include using namespace eosio; class addressbook : public eosio::contract { public: private: };
在配置和實(shí)例化表之前,需要編寫表示地址簿數(shù)據(jù)結(jié)構(gòu)的結(jié)構(gòu)。 將此視為“schema”。 由于它是一個(gè)地址簿,該表將包含人,因此創(chuàng)建一個(gè)名為“person”的struct。
//c++ struct person {};
定義multi_index表的模式時(shí),需要使用唯一值作為主鍵。
對于此合約,請使用類型為account_name的名為“key”的字段。此合約將為每個(gè)用戶提供一個(gè)唯一條目,因此該密鑰將是基于用戶的account_name保證一致性且有唯一值。
//c++ struct person { account_name key; };
由于該合約是地址簿,因此可能應(yīng)該為每個(gè)條目或人員存儲一些相關(guān)的詳細(xì)信息。
//c++ struct person { account_name key; string first_name; string last_name; string street; string city; string state; };
ok。基本schema架構(gòu)現(xiàn)已完成。接下來,定義一個(gè)primary_key方法,該方法將由multi_index迭代器使用。每個(gè)multi_index架構(gòu)都需要一個(gè)主鍵。要實(shí)現(xiàn)此目的,只需創(chuàng)建一個(gè)名為primary_key()的方法,并返回一個(gè)值,在本例中為結(jié)構(gòu)中定義的成員key。
//c++ struct person { account_name key; string first_name; string last_name; string street; string city; string state; uint64_t primary_key() const { return key; } };步驟5:配置多索引表
現(xiàn)在已經(jīng)使用結(jié)構(gòu)定義了表的模式,我們需要配置表。需要對eosio::multi_index構(gòu)造函數(shù)進(jìn)行命名和配置,以使用我們之前定義的結(jié)構(gòu)。
//c++ typedef eosio::multi_indexaddress_index;
我們把N(N(base32 X),用于從X的base32編碼的字符串解釋生成編譯時(shí)uint64_t)命名為表。該表包含許多不同的個(gè)體“persons”,因此將表命名為“people”。
傳入上一步中定義的單person結(jié)構(gòu)
聲明此表的類型。此類型將用于稍后實(shí)例化此表。
//c++ //configure the table typedef eosio::multi_indexaddress_index;
使用上述multi_index配置,有一個(gè)名為people的multi_index表,該表基于使用struct person的該表的單個(gè)行的模式或數(shù)據(jù)結(jié)構(gòu)。
到目前為止,我們的文件應(yīng)該是這樣的。
//c++ #include第6步:構(gòu)造函數(shù)#include using namespace eosio; class addressbook : public eosio::contract { public: private: struct [[eosio::table]] person { account_name key; std::string first_name; std::string last_name; std::string street; std::string city; std::string state; uint64_t primary_key() const { return key; } }; typedef eosio::multi_index address_index; };
使用C++類時(shí),你應(yīng)該創(chuàng)建的第一個(gè)公共方法是構(gòu)造函數(shù)。
我們的構(gòu)造函數(shù)將負(fù)責(zé)最初設(shè)置合約。
EOSIO合約擴(kuò)展了合約類。使用合約范圍初始化我們的父合約類。我們的構(gòu)造函數(shù)傳遞的范圍參數(shù)是正在部署合約的區(qū)塊鏈上的帳戶。
//c++ addressbook(account_name self): contract(self){}第7步:向表中添加記錄
以前,多索引表的主鍵被定義為強(qiáng)制執(zhí)行此合約將僅為每個(gè)用戶存儲一條記錄。為了使其全部工作,需要建立一些關(guān)于設(shè)計(jì)的假設(shè)。
授權(quán)修改通訊簿的唯一帳戶是用戶。
我們表的primary_key是唯一的,基于用戶名。
對于可用性,合約應(yīng)該能夠通過單個(gè)操作創(chuàng)建和修改表行。
在eosio中,區(qū)塊鏈具有唯一的帳戶,因此在此特定用例中,account_name是作為primary_key的理想候選者。account_name類型是uint64_t。
接下來,為用戶定義添加或更新記錄的操作。此操作需要接受此操作需要能夠放置(創(chuàng)建)或修改的任何值。
格式化定義以使其更容易閱讀。為了簡化用戶體驗(yàn)和界面,有一個(gè)方法負(fù)責(zé)創(chuàng)建和修改行。因此,將其命名為“upsert”,即“update”和“insert”的組合。
//c++ void upsert( account_name user, std::string first_name, std::string last_name, std::string street, std::string city, std::string state ) {}
早些時(shí)候,有人提到只有用戶才能控制自己的記錄,因?yàn)檫@個(gè)合約是選擇加入的。為此,請使用eosio.cdt提供的require_auth方法。此方法接受一個(gè)參數(shù),即account_name類型,并斷言執(zhí)行交易的帳戶等于提供的值。
//c++ void upsert(account_name user, std::string first_name, std::string last_name, std::string street, std::string city, std::string state) { require_auth( user ); }
實(shí)例化表。之前,配置了multi_index表,并將其聲明為address_index。要實(shí)例化一個(gè)表,請考慮這兩個(gè)必需參數(shù):
“code”,代表合約的帳戶??梢酝ㄟ^作用域_self變量訪問此值。
定義合約付款人的范圍“scope”,該用例中的合約負(fù)責(zé)支付ram費(fèi)用。
//c++ void upsert(account_name user, std::string first_name, std::string last_name, std::string street, std::string city, std::string state) { require_auth( user ); address_index addresses(_self, _self ); }
接下來,查詢迭代器,將其設(shè)置為變量,因?yàn)榇说鲗⒈欢啻问褂谩?/p>
//c++ void upsert(account_name user, std::string first_name, std::string last_name, std::string street, std::string city, std::string state) { require_auth( user ); address_index addresses(_self, _self ); auto iterator = addresses.find(user); }
安全性已經(jīng)建立并且表格實(shí)例化了,太棒了!
接下來,編寫用于創(chuàng)建或修改表的邏輯。檢測特定用戶是否已存在。
為此,請通過傳遞user參數(shù)來使用表的find方法。find方法將返回一個(gè)迭代器。使用該迭代器對end方法進(jìn)行測試。end方法是“null”的別名。
//c++ void upsert(account_name user, std::string first_name, std::string last_name, std::string street, std::string city, std::string state) { require_auth( user ); auto iterator = addresses.find( user ); address_index addresses(_self, _self ); if( addresses.find( user ) == addresses.end() ) { //The user isn"t in the table } else { //The user is in the table } }
使用multi_index方法emplace在表中創(chuàng)建記錄。此方法接受兩個(gè)參數(shù),即此記錄的范圍“scope”和回調(diào)函數(shù)。
emplace方法的回調(diào)函數(shù)必須使用lamba來創(chuàng)建接口。在body中分配行的值和提供給upsert的值。
//c++ void upsert(account_name user, std::string first_name, std::string last_name, std::string street, std::string city, std::string state) { require_auth( user ); address_index addresses(_self, _self ); auto iterator = addresses.find( user ); if( iterator == addresses.end() ) { addresses.emplace(user, [&]( auto& row ) { row.key = user; row.first_name = first_name; row.last_name = last_name; row.street = street; row.city = city; row.state = state; }); } else { //The user is in the table } }
接下來,處理“upsert”函數(shù)的修改或更新。使用modify方法,傳遞一些參數(shù)
前面定義的迭代器,在調(diào)用此操作時(shí)設(shè)置為聲明的用戶。
范圍“scope”或“ram payer”ram消費(fèi)者,在這種情況下是用戶,如先前在提出該合約的設(shè)計(jì)時(shí)所決定的那樣。
回調(diào)函數(shù)用于處理表的修改。
//c++ void upsert(account_name user, std::string first_name, std::string last_name, std::string street, std::string city, std::string state) { require_auth( user ); address_index addresses(_self, _self ); auto iterator = addresses.find( user ); if( iterator == addresses.end() ) { addresses.emplace(user, [&]( auto& row ) { row.key = user; row.first_name = first_name; row.last_name = last_name; row.street = street; row.city = city; row.state = state; }); } else { addresses.modify(iterator, user, [&]( auto& row ) { row.first_name = first_name; row.last_name = last_name; row.street = street; row.city = city; row.state = state; }); } }
地址簿合約現(xiàn)在具有一個(gè)功能操作,如果該記錄尚不存在,將允許用戶在表中創(chuàng)建一行,如果已存在則修改它。
但是如果用戶想要完全刪除記錄呢?請看EOS的數(shù)據(jù)持久性(下)。
對了,文中調(diào)用的各種eos方法可以參考EOS.IO C語言API手冊。
======================================================================
分享一個(gè)交互式的在線編程實(shí)戰(zhàn),EOS智能合約與DApp開發(fā)入門:
EOS教程
本課程幫助你快速入門EOS區(qū)塊鏈去中心化應(yīng)用的開發(fā),內(nèi)容涵蓋EOS工具鏈、賬戶與錢包、發(fā)行代幣、智能合約開發(fā)與部署、使用代碼與智能合約交互等核心知識點(diǎn),最后綜合運(yùn)用各知識點(diǎn)完成一個(gè)便簽DApp的開發(fā)。
匯智網(wǎng)原創(chuàng)翻譯,轉(zhuǎn)載請標(biāo)明出處。這里是原文
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/24323.html
摘要:需要對構(gòu)造函數(shù)進(jìn)行命名和配置,以使用我們之前定義的結(jié)構(gòu)。我們的構(gòu)造函數(shù)傳遞的范圍參數(shù)是正在部署合約的區(qū)塊鏈上的帳戶。此方法接受兩個(gè)參數(shù),即此記錄的范圍和回調(diào)函數(shù)?;卣{(diào)函數(shù)用于處理表的修改。但是如果用戶想要完全刪除記錄呢請看的數(shù)據(jù)持久性下。 本教程假定你已經(jīng)完成了EOS開發(fā)從智能合約開始。 要了解數(shù)據(jù)持久性,請編寫一個(gè)簡單的智能合約,作為地址記錄。雖然這個(gè)用例由于各種原因而不太適合作為生...
摘要:多索引數(shù)據(jù)庫是中的一種數(shù)據(jù)結(jié)構(gòu),它根據(jù)范圍的定義方式提供存儲數(shù)據(jù)的靈活性。例如,每個(gè)帳戶已存儲在合約中定義的多索引數(shù)據(jù)庫中的數(shù),該合約由定義范圍的每個(gè)帳戶的一小塊組成。 對于EOS RAM的來說什么最重要呢?我們經(jīng)常在每天的數(shù)字貨幣和區(qū)塊鏈相關(guān)新聞中看到EOS旁邊的RAM這個(gè)詞,但是無論如何我們應(yīng)該關(guān)注它的價(jià)格,為什么要關(guān)注它的價(jià)格,即使是那些只想深入了解智能合約開發(fā)的人也需要這樣嗎?...
摘要:與數(shù)據(jù)庫交互的被官方稱為,中文可以叫做持久化。下圖為數(shù)據(jù)結(jié)構(gòu)。所有對數(shù)據(jù)的操作必須通過迭代器完成。迭代器會(huì)移動(dòng)到需要的數(shù)據(jù)對象上。相關(guān)文章和視頻推薦許曉笛數(shù)據(jù)庫與持久化實(shí)戰(zhàn)圓方圓學(xué)院匯集大批區(qū)塊鏈名師,打造精品的區(qū)塊鏈技術(shù)課程。 EOS 數(shù)據(jù)庫結(jié)構(gòu)詳解 在 EOS 中,智能合約執(zhí)行完畢后,所占用的內(nèi)存會(huì)釋放。程序中的所有變量都會(huì)丟失。如果智能合約里要持久地記錄信息,比如游戲智能合約要記...
閱讀 540·2023-04-25 14:26
閱讀 1295·2021-11-25 09:43
閱讀 3489·2021-09-22 15:25
閱讀 1458·2019-08-30 15:54
閱讀 533·2019-08-30 12:57
閱讀 778·2019-08-29 17:24
閱讀 3174·2019-08-28 18:13
閱讀 2696·2019-08-28 17:52