EOSIO Smart Contract Database Walkthrough

The EOS.IO software introduces a new blockchain architecture designed to enable vertical and horizontal scaling of decentralized applications. This is achieved by creating an operating system-like construct upon which applications can be built. The software provides accounts, authentication, databases, asynchronous communication, and the scheduling of applications across many of CPU cores or clusters. The resulting technology is a blockchain architecture that may ultimately scale to millions of transactions per second, eliminates user fees, and allows for quick and easy deployment and maintenance of decentralized applications, in the context of a governed blockchain.

Create

void test_da::create(account_name user, string title, string content)
{
require_auth( user ); // Authenticate user permissions.
das datable( _self, user); // Define a database object.
datable.emplace(user, [&]( da & d){
d.title = title;
d.content = content;
d.post_id = datable.available_primary_key();
d.poster = user;
});// Create data in a database.
}
class test_da : public contract {
public:
test_da( account_name self ):contract(self){}
// @abi action
void create(account_name user, string title, string content);
private:
// @abi table data i64
struct da {
uint64_t post_id;
account_name poster;
string title;
string content;
uint64_t primary_key()const { return post_id; }
account_name get_poster() const { return poster; }
EOSLIB_SERIALIZE(da, (post_id)(poster)(title)(content))
};
typedef eosio::multi_index<N(data), da, indexed_by<N(byposter), const_mem_fun<da, account_name, &da::get_poster>> > das;
};
} /// namespace eosio
{
"types": [],
"structs": [{
"name": "da",
"base": "",
"fields": [{
"name": "post_id",
"type": "uint64"
},{
"name": "poster",
"type": "account_name"
},{
"name": "title",
"type": "string"
},{
"name": "content",
"type": "string"
}
]
},{
"name": "create",
"base": "",
"fields": [{
"name": "user",
"type": "account_name"
},{
"name": "title",
"type": "string"
},{
"name": "content",
"type": "string"
}
]
}}
],
"actions": [{
"name": "create",
"type": "create",
}
],
"tables": [{
"name": "data",
"index_type": "i64",
"key_names": [
"post_id"
],
"key_types": [
"uint64"
],
"type": "da"
}
],
"ricardian_clauses": []
}

Data Creation Example

cleos set contract eosio test_da     
Reading WAST/WASM from test_da/test_da.wasm...
Using already assembled WASM...
Publishing contract...
executed transaction: 3d6f04278617d3807fe876a33057f1155acf9c9e5a392ac6ed8ad51e79506009 6752 bytes 24679 us
# eosio <= eosio::setcode {"account":"eosio","vmtype":0,"vmversion":0,"code":"0061736d0100000001ad011a60037f7e7e0060057f7e7e7f...
# eosio <= eosio::setabi {"account":"eosio","abi":{"types":[],"structs":[{"name":"da","base":"","fields":[{"name":"post_id","...
cleos push action eosio create '{"user":"eosio","title":"first","content":"create a first one"}' -p eosio
executed transaction: 830057f270fa499b1d61b82e80ad8cda1774cdc1786c1e786f558a3e0a48974c 216 bytes 17229 us
# eosio <= eosio::create {"user":"eosio","title":"first","content":"create a first one"}
cleos get table eosio eosio data
{
"rows": [{
"post_id": 0,
"poster": "eosio",
"title": "first",
"content": "create a first one"
}
],
"more": false
}
cleos push action eosio create '{"user":"eostea","title":"eostea first","content":"eostea create a first one"}' -p eostea
executed transaction: 8542a87e563a9c62b7dbe46ae09ccf829c7821f8879167066b658096718de148 232 bytes 2243 us
# eosio <= eosio::create {"user":"eostea","title":"eostea first","content":"eostea create a first one"}
cleos get table eosio eostea data
{
"rows": [{
"post_id": 0,
"poster": "eostea",
"title": "eostea first",
"content": "eostea create a first one"
}
],
"more": false
}

Query

Query data by primary key

void test_da::getd(uint64_t post_id){
das datable(_self, _self);
auto post_da = datable.find( post_id);
eosio::print("Post_id: ", post_da->post_id, " Post_Tile: ", post_da->title.c_str(), " Content: ", post_da->content.c_str());
}
cleos push action eosio getd '{"post_id":1}' -p eosio
executed transaction: ac8663235462d947c74542af848cca54a059c3991d193237025da7d4767d6725 192 bytes 1724 us
# eosio <= eosio::getd {"post_id":1}
>> Post_id: 1 Post_Tile: first Content: eosio create a first one

Query data by secondary index

auto poster_index = datable.template get_index<N(byposter)>();
auto pos = poster_index.find( user );
for (; pos != poster_index.end(); pos++)
{
eosio::print("content:", pos->content.c_str(), " post_id:", pos->post_id, " title:", pos->title.c_str());
}
cleos push action eosio getd '{"post_id":2,"user": "eostea"}' -p eosio
executed transaction: 2370e1fb1ee8a581f7321f02fb40645e51269e579d183c33ef470dba0b3afdbc 200 bytes 5403 us
# eosio <= eosio::getd {"post_id":2,"user":"eostea"}
>> Post_id: 2 Post_Tile: eostea first Content: eostea create a first onecontent:eostea create a first one post_id:2 title:eostea first
cleos get table eosio eosio data
{
"rows": [{
"post_id": 0,
"poster": "eosio",
"title": "first",
"content": "eostea create a first one"
},{
"post_id": 1,
"poster": "eosio",
"title": "first",
"content": "eostea create a first one"
},{
"post_id": 2,
"poster": "eostea",
"title": "eostea first",
"content": "eostea create a first one"
}
],
"more": false
}

Modify

cleos get table eosio eosio data
{
"rows": [{
"post_id": 0,
"poster": "eosio",
"title": "first",
"content": "eostea create a first one"
},{
"post_id": 1,
"poster": "eosio",
"title": "first",
"content": "eostea create a first one"
},{
"post_id": 2,
"poster": "eostea",
"title": "eostea first",
"content": "eostea create a first one"
}
],
"more": false
}
void test_da::change(account_name user, uint64_t post_id, string title, string content)
{
require_auth(user);
das datable( _self, user);
auto post = datable.find(post_id);
eosio_assert(post->poster == user, "yonghucuowu");
datable.modify(post, user, [&](auto& p){
if (title != "")
p.title = title;
if (content != "")
p.content = content;
});
}
cleos push action eosio change '{"user":"eosio","post_id":1,"title":"change","content":"change action"}' -p eosio
executed transaction: 8cb561a712f2741560118651aefd49efd161e3d73c56f6d24cf1d699c265e2dc 224 bytes 2130 us
# eosio <= eosio::change {"user":"eosio","post_id":1,"title":"change","content":"change action"}
cleos get table eosio eosio data
{
"rows": [{
"post_id": 0,
"poster": "eosio",
"title": "first",
"content": "eostea create a first one"
},{
"post_id": 1,
"poster": "eosio",
"title": "change",
"content": "change action"
},{
"post_id": 2,
"poster": "eostea",
"title": "eostea first",
"content": "eostea create a first one"
}
],
"more": false
}

Delete

void test_da::dele(account_name user, uint64_t post_id)
{
require_auth(user);
das datable( _self, user);
auto post = datable.find(post_id);
eosio::print(post->title.c_str());
eosio_assert(post->poster == user, "yonghucuowu");
datable.erase(post);
}
cleos push action eosio dele '{"user":"eosio","post_id":1}' -p eosioexecuted transaction: 3affbbbbd1da328ddcf37753f1f2f6c5ecc36cd81a0e12fea0c789e75b59714e  200 bytes  2383 us
# eosio <= eosio::dele {"user":"eosio","post_id":1}
cleos get table eosio eosio data
{
"rows": [{
"post_id": 0,
"poster": "eosio",
"title": "first",
"content": "eostea create a first one"
},{
"post_id": 2,
"poster": "eostea",
"title": "eostea first",
"content": "eostea create a first one"
}
],
"more": false
}

--

--

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store