摘要:相關(guān)文章和視頻推薦許曉笛智能合約案例解析圓方圓學(xué)院匯集大批區(qū)塊鏈名師,打造精品的區(qū)塊鏈技術(shù)課程。
Daniel Larimer 在他的博客介紹了EOS新的智能合約架構(gòu)(EOS團(tuán)隊(duì)的開發(fā)速度實(shí)在是太嚇人,根本追不上)。他給出了最簡(jiǎn)單的一個(gè)新幣種的智能合約代碼,僅有49行就能完成一個(gè)新幣種的開發(fā),一個(gè)新的“愛息歐”就誕生了。讓我們一步一步實(shí)現(xiàn)吧。
首先實(shí)現(xiàn)私有成員,建立一個(gè) account 結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體里保存的是所有持有我們這種代幣的人的賬戶和余額。
private: //account 結(jié)構(gòu)體 struct account { //EOS 賬戶名 account_name owner; //余額 uint64_t balance; //主鍵 uint64_t primary_key()const { return owner; }
下一步 我們要利用 Boost 庫(kù)中的多索引列表,將上面聲明的結(jié)構(gòu)體放入一個(gè)列表中,方便查詢和修改。
eosio::multi_index_accounts;
接著,實(shí)現(xiàn) add_balance() 函數(shù),這個(gè)私有函數(shù)的目的是給特定的 EOS 賬戶增加特定的代幣。
void add_balance( account_name payer, account_name to, uint64_t q ) { //在列表中查詢,看要收幣的用戶是否已經(jīng)在列表中。 auto toitr = _accounts.find( to ); //如果不在列表中,說(shuō)明用戶從未持有過(guò)這種幣,要將用戶加入列表 if( toitr == _accounts.end() ) { //增加一個(gè)用戶 _accounts.emplace( payer, [&]( auto& a ) { a.owner = to; //因?yàn)橹皼](méi)有這種幣,用戶名下的余額為要接收的數(shù)量 a.balance = q; }); //如果用戶在列表中,說(shuō)明已經(jīng)持有或持有過(guò)這種幣 } else { _accounts.modify( toitr, 0, [&]( auto& a ) { //直接將余額增加要轉(zhuǎn)入的數(shù)量 a.balance += q; //判斷用戶余額是否溢出(余額增加了q,之后數(shù)量應(yīng)該大于q) eosio_assert( a.balance >= q, "overflow detected" ); }); } }
之后就要實(shí)現(xiàn)公有方法了,首先是構(gòu)造函數(shù),別忘了初始化 _accounts 列表。
public: simpletoken( account_name self ) :contract(self),_accounts( _self, _self){}
實(shí)現(xiàn)公有的 transfer(轉(zhuǎn)賬)函數(shù),將代幣從一個(gè)賬戶轉(zhuǎn)移到另一個(gè)賬戶。
void transfer( account_name from, account_name to, uint64_t quantity ) { //從付款方獲取權(quán)限 require_auth( from ); //從列表中搜索發(fā)幣方賬戶 const auto& fromacnt = _accounts.get( from ); //驗(yàn)證付款方余額,是否透支 eosio_assert( fromacnt.balance >= quantity, "overdrawn balance" ); //從付款方減去代幣 _accounts.modify( fromacnt, from, [&]( auto& a ){ a.balance -= quantity; } ); //收款方增加代幣(之前實(shí)現(xiàn)的私有函數(shù)) add_balance( from, to, quantity ); }
OK,是不是以為大功告成了?還有最重要的 issue(發(fā)行)函數(shù),要不從哪“印錢?”
void issue( account_name to, uint64_t quantity ) { //得到合約主人的權(quán)限 require_auth( _self ); //直接印錢 add_balance( _self, to, quantity );
最后一步,將我們的 transfer 和 issue 函數(shù)接口提供給 EOS 系統(tǒng),通過(guò)一個(gè)宏就可以快速實(shí)現(xiàn)。
EOSIO_ABI( simpletoken, (transfer)(issue) )
這個(gè)宏是咋回事?我們看看 dispacher.hpp 文件中對(duì)這個(gè)宏的定義,其實(shí)是替開發(fā)者實(shí)現(xiàn)了 apply 函數(shù),使得開發(fā)者可以專注于業(yè)務(wù)邏輯。
#define EOSIO_ABI( TYPE, MEMBERS ) extern "C" { void apply( uint64_t receiver, uint64_t code, uint64_t action ) { auto self = receiver; if( code == self ) { TYPE thiscontract( self ); switch( action ) { EOSIO_API( TYPE, MEMBERS ) } eosio_exit(0); } } }
大功告成,看看全部的代碼吧,是不是49行就搞定了?不過(guò) EOS 表示以后會(huì)有系統(tǒng)的標(biāo)準(zhǔn)代幣,連以上的具體邏輯都不用我們實(shí)現(xiàn)了,不過(guò)這段代碼對(duì)系統(tǒng)學(xué)習(xí) EOS 智能合約架構(gòu)還是很有意義的。
#includeclass simpletoken : public eosio::contract { public: simpletoken( account_name self ) :contract(self),_accounts( _self, _self){} void transfer( account_name from, account_name to, uint64_t quantity ) { require_auth( from ); const auto& fromacnt = _accounts.get( from ); eosio_assert( fromacnt.balance >= quantity, "overdrawn balance" ); _accounts.modify( fromacnt, from, [&]( auto& a ){ a.balance -= quantity; } ); add_balance( from, to, quantity ); } void issue( account_name to, uint64_t quantity ) { require_auth( _self ); add_balance( _self, to, quantity ); } private: struct account { account_name owner; uint64_t balance; uint64_t primary_key()const { return owner; } }; eosio::multi_index _accounts; void add_balance( account_name payer, account_name to, uint64_t q ) { auto toitr = _accounts.find( to ); if( toitr == _accounts.end() ) { _accounts.emplace( payer, [&]( auto& a ) { a.owner = to; a.balance = q; }); } else { _accounts.modify( toitr, 0, [&]( auto& a ) { a.balance += q; eosio_assert( a.balance >= q, "overflow detected" ); }); } } }; EOSIO_ABI( simpletoken, (transfer)(issue) )
【許曉笛】 EOS智能合約案例解析(1)
圓方圓學(xué)院匯集大批區(qū)塊鏈名師,打造精品的區(qū)塊鏈技術(shù)課程。 在各大平臺(tái)都長(zhǎng)期有優(yōu)質(zhì)免費(fèi)公開課,歡迎報(bào)名收看。
公開課地址:https://ke.qq.com/course/345101
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/24417.html
摘要:區(qū)塊長(zhǎng)啥樣對(duì)于一個(gè)區(qū)塊鏈項(xiàng)目來(lái)說(shuō),最核心的數(shù)據(jù)莫過(guò)于區(qū)塊數(shù)據(jù),區(qū)塊數(shù)據(jù)結(jié)構(gòu)是整個(gè)區(qū)塊鏈項(xiàng)目的技術(shù)基礎(chǔ)。區(qū)塊頭首先是區(qū)塊頭數(shù)據(jù)結(jié)構(gòu),包括了哈希時(shí)間戳默克爾根見證人賬戶等。完整交易信息總結(jié)我們用圖形繪出了區(qū)塊數(shù)據(jù)結(jié)構(gòu),便于大家理解。 EOS 區(qū)塊長(zhǎng)啥樣? 對(duì)于一個(gè)區(qū)塊鏈項(xiàng)目來(lái)說(shuō),最核心的數(shù)據(jù)莫過(guò)于區(qū)塊數(shù)據(jù),區(qū)塊數(shù)據(jù)結(jié)構(gòu)是整個(gè)區(qū)塊鏈項(xiàng)目的技術(shù)基礎(chǔ)。不過(guò)由于 EOS 項(xiàng)目一直在快速迭代,區(qū)塊數(shù)...
摘要:寫在前面,這一篇文章是許曉笛在北京開發(fā)者圓桌會(huì)議上的發(fā)言實(shí)錄,感謝主辦方戴嘉樂(lè)和董天一的邀請(qǐng),感謝編輯們。我這次分享題目是有可能有點(diǎn)標(biāo)題黨,前面拉了三個(gè)字有可能是落地的一個(gè)非常重要的途徑。共識(shí)機(jī)制共識(shí)機(jī)制,就是所有代幣持有人選舉。 寫在前面,這一篇文章是許曉笛 2018.05.20 在北京 《IPFS開發(fā)者圓桌會(huì)議》上的發(fā)言實(shí)錄,感謝主辦方戴嘉樂(lè)和董天一的邀請(qǐng),感謝編輯們。先介紹一下《...
摘要:的跟其他區(qū)塊鏈項(xiàng)目是類似的,都是一個(gè)基本功能本地儲(chǔ)存密鑰,僅此而已。公網(wǎng)上線后,一定要將存有密鑰的加密,并且將文件單獨(dú)備份好。字面意思是賬戶,但我覺(jué)得有個(gè)概念更適合法人。代幣就是由持有的。對(duì)于權(quán)限,則需要列表里至少兩個(gè)賬戶的授權(quán)才能行使。 如果你曾經(jīng)嘗試在本地運(yùn)行 EOS 測(cè)試節(jié)點(diǎn),會(huì)發(fā)現(xiàn)編譯、運(yùn)行并不是特別復(fù)雜,但官方教程里兩個(gè)概念很容易把人搞暈: Account(賬戶) 和 Wal...
摘要:構(gòu)造函數(shù)為空,參數(shù)為智能合約賬戶名。每個(gè)智能合約類都要繼承類類構(gòu)造函數(shù)創(chuàng)建代幣函數(shù)聲明函數(shù),這個(gè)函數(shù)用來(lái)新建一種代幣,并輸入代幣的各種屬性,同時(shí)函數(shù)也是一個(gè)。 詳解 EOS 智能合約的 hpp 文件 為了幫助大家熟悉 EOS 智能合約,EOS 官方提供了一個(gè)代幣(資產(chǎn))智能合約 Demo —— eosio.token。eosio.token 智能合約目前還不是特別完善,個(gè)別功能還沒(méi)有完...
摘要:相關(guān)文章和視頻推薦許曉笛智能合約案例解析許曉笛智能合約案例解析圓方圓學(xué)院匯集大批區(qū)塊鏈名師,打造精品的區(qū)塊鏈技術(shù)課程。 詳解 EOS 智能合約的 cpp 文件 之前的文章介紹了 eosio.token 智能合約的 hpp 文件,這次向大家介紹 eosio.token.cpp 文件,cpp 文件即 C++ 代碼文件,智能合約所有的業(yè)務(wù)邏輯內(nèi)容都是在 cpp 文件中實(shí)現(xiàn)的。 eosio.t...
閱讀 3416·2023-04-26 02:41
閱讀 2476·2023-04-26 00:14
閱讀 2909·2021-08-11 10:22
閱讀 1298·2019-12-27 11:38
閱讀 3586·2019-08-29 18:34
閱讀 2392·2019-08-29 12:13
閱讀 2967·2019-08-26 18:26
閱讀 1881·2019-08-26 16:49