Eosio.token、Exchange 和 Eosio.msig 智能合約
本教程假定你已經(jīng)完成了EOS開發(fā)從智能合約開始(一)入挣。
在這個(gè)階段亿乳,區(qū)塊鏈沒有做太多的事情,現(xiàn)在我們來部署eosio.token
径筏。該合約允許創(chuàng)建許多不同的通證(token,也有叫令牌的风皿,以下直接用token),這些token都在同一個(gè)合約上運(yùn)行匠璧,但可能由不同的用戶管理。
在部署 token 合約之前咸这,我們必須創(chuàng)建一個(gè)用來部署它的帳戶夷恍,代碼如下:
$ cleos create account eosio eosio.token \
EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4 \
EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4
...
然后我們可以所部署合約中找到它:
${EOSIO_SOURCE}/build/contracts/eosio.token
然后:
$ cleos set contract eosio.token build/contracts/eosio.token -p eosio.token@active
Reading WAST...
Assembling WASM...
Publishing contract...
executed transaction: 528bdbce1181dc5fd72a24e4181e6587dace8ab43b2d7ac9b22b2017992a07ad 8708 bytes 10000 cycles
# eosio <= eosio::setcode {"account":"eosio.token","vmtype":0,"vmversion":0,"code":"0061736d0100000001ce011d60067f7e7f7f7f7f00...
# eosio <= eosio::setabi {"account":"eosio.token","abi":{"types":[],"structs":[{"name":"transfer","base":"","fields":[{"name"...
創(chuàng)建 Exchange 合約
你可以查看智能合約eosio.token
的定義,如contracts/eosio.token/eosio.token.hpp
:
void create( account_name issuer,
asset maximum_supply );
void issue( account_name to, asset quantity, string memo );
void transfer( account_name from,
account_name to,
asset quantity,
string memo );
要?jiǎng)?chuàng)建新的token,我們必須用適當(dāng)?shù)膮?shù)調(diào)用create(...)
酿雪。此命令將使用最大標(biāo)識(shí)符號(hào)來唯一地標(biāo)識(shí)(其實(shí)就是注冊(cè))tokens列表中這一個(gè)新建的token遏暴。創(chuàng)建者將有權(quán)發(fā)行,或執(zhí)行其他操作指黎,如凍結(jié)朋凉,召回,和列入所有者白名單醋安。
使用地址參數(shù)調(diào)用此方法的簡單辦法:
$ cleos push action eosio.token create '[ "eosio", "1000000000.0000 SYS"]' \
-p eosio.token@active
executed transaction: 0e49a421f6e75f4c5e09dd738a02d3f51bd18a0cf31894f68d335cd70d9c0e12 120 bytes 1000 cycles
# eosio.token <= eosio.token::create {"issuer":"eosio","maximum_supply":"1000000000.0000 SYS"}
或者杂彭,使用命名參數(shù)調(diào)用此方法:
$ cleos push action eosio.token create \
'{"issuer":"eosio", "maximum_supply":"1000000000.0000 SYS"}' \
-p eosio.token@active
executed transaction: 0e49a421f6e75f4c5e09dd738a02d3f51bd18a0cf31894f68d335cd70d9c0e12 120 bytes 1000 cycles
# eosio.token <= eosio.token::create {"issuer":"eosio","maximum_supply":"1000000000.0000 SYS"}
此命令創(chuàng)建了一個(gè)新的 token 名稱為 SYS
,其精度為4位小數(shù)吓揪,最大供應(yīng)量為 1000000000.0000 SYS亲怠。
為了創(chuàng)建這個(gè)token,我們需要eosio.token
合約的許可柠辞,因?yàn)?code>owns即它對(duì)代幣注冊(cè)表有所有權(quán)(例如SYS
)团秽。該合約的未來版本可以允許其他各方自動(dòng)購買這些各種名稱的代幣。出于這個(gè)原因叭首,我們必須通過-p eosio.token@active
來授權(quán)此調(diào)用习勤。
將代幣發(fā)送到“User”帳戶中
現(xiàn)在我們已經(jīng)創(chuàng)建了token,發(fā)行者可以向我們先前創(chuàng)建的帳戶用戶發(fā)出新的token焙格。如果你沒有創(chuàng)建一個(gè)名為“User”的帳戶图毕,請(qǐng)參閱這里的說明。
我們將使用參數(shù)調(diào)用約定(vs named args)间螟。
$ cleos push action eosio.token issue '[ "user", "100.0000 SYS", "memo" ]' \
-p eosio@active
executed transaction: 822a607a9196112831ecc2dc14ffb1722634f1749f3ac18b73ffacd41160b019 268 bytes 1000 cycles
# eosio.token <= eosio.token::issue {"to":"user","quantity":"100.0000 SYS","memo":"memo"}
>> issue
# eosio.token <= eosio.token::transfer {"from":"eosio","to":"user","quantity":"100.0000 SYS","memo":"memo"}
>> transfer
# eosio <= eosio.token::transfer {"from":"eosio","to":"user","quantity":"100.0000 SYS","memo":"memo"}
# user <= eosio.token::transfer {"from":"eosio","to":"user","quantity":"100.0000 SYS","memo":"memo"}
這次輸出吴旋,包含幾個(gè)不同的操作:一個(gè)發(fā)送和三個(gè)轉(zhuǎn)移。雖然我們簽署的唯一操作是發(fā)送厢破,但發(fā)送操作執(zhí)行了“內(nèi)聯(lián)轉(zhuǎn)移”荣瑟,“內(nèi)聯(lián)轉(zhuǎn)移”通知發(fā)送者和接收者賬戶。輸出指示被調(diào)用的所有操作處理程序摩泪,調(diào)用它們的順序笆焰,以及操作是否生成任何輸出。
從技術(shù)上講见坑,eosio.token
合約可以跳過“內(nèi)鏈轉(zhuǎn)移”嚷掠,并選擇直接修改余額。然而荞驴,在這種情況下不皆,eosio.token
遵循我們的token約定,該約定要求所有帳戶余額可由引用它們的轉(zhuǎn)移操作的總和來推導(dǎo)熊楼。還要求通知資金發(fā)送方和接收方霹娄,以便他們能夠自動(dòng)處理存款和取款。
如果你想查看發(fā)送的實(shí)際交易,可以使用-d
選項(xiàng)顯示“不發(fā)送”和“將交易返回為JSON格式”犬耻。
$ cleos push action eosio.token issue '["user", "100.0000 SYS", "memo"]' -p eosio@active -d -j
{
"expiration": "2018-05-25T19:02:58",
"ref_block_num": 18200,
"ref_block_prefix": 614206268,
"max_net_usage_words": 0,
"max_cpu_usage_ms": 0,
"delay_sec": 0,
"context_free_actions": [],
"actions": [{
"account": "eosio.token",
"name": "issue",
"authorization": [{
"actor": "eosio",
"permission": "active"
}
],
"data": "00000000007015d640420f00000000000453595300000000046d656d6f"
}
],
"transaction_extensions": [],
"signatures": [
"SIG_K1_Khyk1GsxWCx4axqYMF2AREDvaZtZdFaQifNPkR9DomR7toJ4sGua7pMBNq2osV5TY8rcGNcgNwn1eFe3noAXsoUA26HNDJ"
],
"context_free_data": []
}
將代幣發(fā)送到帳戶“tester”
現(xiàn)在該帳戶user
有token踩晶,我們會(huì)將一些代幣發(fā)送給帳戶tester
。 我們指定user
使用權(quán)限參數(shù)-p user@active
授權(quán)此操作枕磁。
$ cleos push action eosio.token transfer \
'[ "user", "tester", "25.0000 SYS", "m" ]' -p user@active
executed transaction: 06d0a99652c11637230d08a207520bf38066b8817ef7cafaab2f0344aafd7018 268 bytes 1000 cycles
# eosio.token <= eosio.token::transfer {"from":"user","to":"tester","quantity":"25.0000 SYS","memo":"m"}
>> transfer
# user <= eosio.token::transfer {"from":"user","to":"tester","quantity":"25.0000 SYS","memo":"m"}
# tester <= eosio.token::transfer {"from":"user","to":"tester","quantity":"25.0000 SYS","memo":"m"}
部署交易EXchange合約
與上面顯示的示例類似渡蜻,我們可以部署 Exchange 合約。Exchange 合約提供了創(chuàng)建和交易貨幣的能力计济。假設(shè)這是從EOSIO源代碼的根目錄運(yùn)行的茸苇。
$ cleos create account eosio exchange \
EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4 \
EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4
executed transaction: 4d38de16631a2dc698f1d433f7eb30982d855219e7c7314a888efbbba04e571c 364 bytes 1000 cycles
# eosio <= eosio::newaccount {"creator":"eosio","name":"exchange","owner":{"threshold":1,"keys":[{"key":"EOS7ijWCBmoXBi3CgtK7DJxe...
$ cleos set contract exchange build/contracts/exchange -p exchange@active
Reading WAST/WASM from build/contracts/exchange/exchange.wasm...
Using already assembled WASM...
Publishing contract...
executed transaction: 503dddec456ae301ef467c6a05bc6bf61e1ea21ab911ef6cc6e0750001b675c8 33888 bytes 5841 us
# eosio <= eosio::setcode {"account":"exchange","vmtype":0,"vmversion":0,"code":"0061736d0100000001bb022f60067f7e7f7f7f7f00600...
# eosio <= eosio::setabi {"account":"exchange","abi":"0e656f73696f3a3a6162692f312e30010c6163636f756e745f6e616d65046e616d650e0...
部署Eosio.msig合約
eosio.msig
合約允許多方異步簽署單個(gè)交易。EOSIO本身具有多重簽名(multisig)基礎(chǔ)支持峭咒,但它需要一個(gè)同步通道税弃,主要是進(jìn)行數(shù)據(jù)傳送和簽名。Eosio.msig
是一種對(duì)用戶更加友好方式凑队,可以在多方同意的情況下異步提議则果,批準(zhǔn)并最終發(fā)布交易。
以下步驟可用于部署eosio.msig
合約:
$ cleos create account eosio eosio.msig \
EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4 \
EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4
# eosio <= eosio::newaccount {"creator":"eosio","name":"eosio.msig","owner":{"threshold":1,"keys":[{"key":"EOS7ijWCBmoXBi3CgtK7DJ...
$ cleos set contract eosio.msig build/contracts/eosio.msig -p eosio.msig@active
Reading WAST/WASM from build/contracts/eosio.msig/eosio.msig.wasm...
Using already assembled WASM...
Publishing contract...
executed transaction: 3433c434bdef42ba2150d5df46c17e0258f20b7836a057911faa2daa66262338 8864 bytes 1319 us
# eosio <= eosio::setcode {"account":"eosio.msig","vmtype":0,"vmversion":0,"code":"0061736d010000000198011760017f0060047f7e7e7...
# eosio <= eosio::setabi {"account":"eosio.msig","abi":"0e656f73696f3a3a6162692f312e30030c6163636f756e745f6e616d65046e616d650...
另:《EOS智能合約與DApp開發(fā)入門》教程已經(jīng)上線漩氨,愛學(xué)習(xí)等不及的可以抓緊體驗(yàn)一下:
本教程幫助你快速入門EOS區(qū)塊鏈去中心化應(yīng)用的開發(fā)西壮,內(nèi)容涵蓋EOS工具鏈、賬戶與錢包叫惊、發(fā)行代幣款青、智能合約開發(fā)與部署、使用代碼與智能合約交互等核心知識(shí)點(diǎn)霍狰,最后綜合運(yùn)用React和EOS的各知識(shí)點(diǎn)完成一個(gè)便簽DApp的開發(fā)抡草。
如果你也在做以太坊開發(fā),那么可以看看這些教程:
- web3j教程蔗坯,主要是針對(duì)java和android程序員進(jìn)行區(qū)塊鏈以太坊開發(fā)的web3j詳解康震。
- 以太坊教程,主要介紹智能合約與dapp應(yīng)用開發(fā)宾濒,適合入門腿短。
- 以太坊開發(fā),主要是介紹使用node.js绘梦、mongodb橘忱、區(qū)塊鏈、ipfs實(shí)現(xiàn)去中心化電商DApp實(shí)戰(zhàn)卸奉,適合進(jìn)階钝诚。
- python以太坊,主要是針對(duì)python工程師使用web3.py進(jìn)行區(qū)塊鏈以太坊開發(fā)的詳解榄棵。
- php以太坊敲长,主要是介紹使用php進(jìn)行智能合約開發(fā)交互郎嫁,進(jìn)行賬號(hào)創(chuàng)建、交易祈噪、轉(zhuǎn)賬、代幣開發(fā)以及過濾器和事件等內(nèi)容尚辑。
博客原文在這里:EOS token 智能合約開發(fā)