您好,登錄后才能下訂單哦!
本篇內容介紹了“EOS開發中區塊鏈數據怎么實現持久性”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
之前,你創建了一個合約目錄,現在就在那里開始。
//shell cd CONTRACTS_DIR
為我們的合約創建一個新目錄并進入目錄:
//c++ mkdir addressbook cd addressbook
//c++ touch addressbook.cpp
在你喜歡的編輯器中打開文件。
在之前的教程中,你創建了一個hello world合約,并學習了基礎知識。你將熟悉下面的結構,該類已分別命名為addressbook
。
//c++ #include <eosiolib/eosio.hpp> #include <eosiolib/print.hpp> using namespace eosio; class addressbook : public eosio::contract { public: private: };
在配置和實例化表之前,需要編寫表示地址簿數據結構的結構。 將此視為“schema”。 由于它是一個地址簿,該表將包含人,因此創建一個名為“person”的struct
。
//c++ struct person {};
定義multi_index
表的模式時,需要使用唯一值作為主鍵。
對于此合約,請使用類型為account_name
的名為“key”的字段。此合約將為每個用戶提供一個唯一條目,因此該密鑰將是基于用戶的account_name
保證一致性且有唯一值。
//c++ struct person { account_name key; };
由于該合約是地址簿,因此可能應該為每個條目或人員存儲一些相關的詳細信息。
//c++ struct person { account_name key; string first_name; string last_name; string street; string city; string state; };
ok。基本schema
架構現已完成。接下來,定義一個primary_key
方法,該方法將由multi_index
迭代器使用。每個multi_index
架構都需要一個主鍵。要實現此目的,只需創建一個名為primary_key()
的方法,并返回一個值,在本例中為結構中定義的成員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; } };
現在已經使用結構定義了表的模式,我們需要配置表。需要對eosio::multi_index
構造函數進行命名和配置,以使用我們之前定義的結構。
//c++ typedef eosio::multi_index<N(people), person> address_index;
我們把N
(N(base32 X),用于從X的base32編碼的字符串解釋生成編譯時uint64_t)命名為表。該表包含許多不同的個體“persons”,因此將表命名為“people”。
傳入上一步中定義的單person
結構
聲明此表的類型。此類型將用于稍后實例化此表。
//c++ //configure the table typedef eosio::multi_index<N(people), person> address_index;
使用上述multi_index
配置,有一個名為people
的multi_index
表,該表基于使用struct
person
的該表的單個行的模式或數據結構。
到目前為止,我們的文件應該是這樣的。
//c++ #include <eosiolib/eosio.hpp> #include <eosiolib/print.hpp> 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<N(people), person> address_index; };
使用C++類時,你應該創建的第一個公共方法是構造函數。
我們的構造函數將負責最初設置合約。
EOSIO合約擴展了合約類。使用合約范圍初始化我們的父合約類。我們的構造函數傳遞的范圍參數是正在部署合約的區塊鏈上的帳戶。
//c++ addressbook(account_name self): contract(self){}
以前,多索引表的主鍵被定義為強制執行此合約將僅為每個用戶存儲一條記錄。為了使其全部工作,需要建立一些關于設計的假設。
授權修改通訊簿的唯一帳戶是用戶。
我們表的primary_key
是唯一的,基于用戶名。
對于可用性,合約應該能夠通過單個操作創建和修改表行。
在eosio中,區塊鏈具有唯一的帳戶,因此在此特定用例中,account_name
是作為primary_key
的理想候選者。account_name
類型是uint64_t
。
接下來,為用戶定義添加或更新記錄的操作。此操作需要接受此操作需要能夠放置(創建)或修改的任何值。
格式化定義以使其更容易閱讀。為了簡化用戶體驗和界面,有一個方法負責創建和修改行。因此,將其命名為“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 ) {}
早些時候,有人提到只有用戶才能控制自己的記錄,因為這個合約是選擇加入的。為此,請使用eosio.cdt
提供的require_auth
方法。此方法接受一個參數,即account_name
類型,并斷言執行交易的帳戶等于提供的值。
//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 ); }
實例化表。之前,配置了multi_index
表,并將其聲明為address_index
。要實例化一個表,請考慮這兩個必需參數:
“code”,代表合約的帳戶。可以通過作用域_self
變量訪問此值。
定義合約付款人的范圍“scope”,該用例中的合約負責支付ram費用。
//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 ); }
接下來,查詢迭代器,將其設置為變量,因為此迭代器將被多次使用。
//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); }
安全性已經建立并且表格實例化了,太棒了!
接下來,編寫用于創建或修改表的邏輯。檢測特定用戶是否已存在。
為此,請通過傳遞user
參數來使用表的find
方法。find
方法將返回一個迭代器。使用該迭代器對end
方法進行測試。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
在表中創建記錄。此方法接受兩個參數,即此記錄的范圍“scope”和回調函數。
emplace
方法的回調函數必須使用lamba來創建接口。在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”函數的修改或更新。使用modify
方法,傳遞一些參數
前面定義的迭代器,在調用此操作時設置為聲明的用戶。
范圍“scope”或“ram payer”ram消費者,在這種情況下是用戶,如先前在提出該合約的設計時所決定的那樣。
回調函數用于處理表的修改。
//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; }); } }
地址簿合約現在具有一個功能操作,如果該記錄尚不存在,將允許用戶在表中創建一行,如果已存在則修改它。
“EOS開發中區塊鏈數據怎么實現持久性”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。