昨天,筆者和幾個EOS開發先行者翻譯了官方的開發文檔。筆者承擔的翻譯任務中有《eosio代幣合約教程》一節,先分享在此,先睹為快。
原文:
https://github.com/EOSIO/eos/wiki/Tutorial-eosio-token-Contract
翻譯稿:
https://github.com/eostea/eos-wiki/blob/master/docs/Jacky_eosio_token_contract.md
(因格式原因,將markdown格式文本粘貼致辭閱讀體驗不佳,建議查看上面鏈接中的翻譯稿)
本節內容假設您已掌握《智能合約入門》一節,并以建立起了EOS測試節點。
現在,其實已經搭建起來的區塊鏈并不能做多少事情,所以,首先讓我們來部署一個代幣合約eosio.token。
這個合約能讓許多不同的代幣同時在一個智能合約上發行,但是卻能被不同用戶管理。
在發行一個代幣前,我們需要建立一個賬戶用來部署代幣合約。
cleos create account eosio eosio.token 公鑰1 公鑰2
以上命令創建了一個名為eosio.token的賬戶。
然后,將位于${EOS根目錄}/build/contracts/eosio.token的文件部署到eosio.token賬戶。
cleos set contract eosio.token build/contracts/eosio.token -p eosio.token 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"...
創建一個代幣
以下是代幣發型合約eosio.token的標準接口,文件位于 contracts/eosio.token/eosio.token.hpp:
void create( account_name issuer,
asset maximum_supply,
uint8_t can_freeze,
uint8_t can_recall,
uint8_t can_whitelist );
void issue( account_name to, asset quantity, string memo );
void transfer( account_name from,
account_name to,
asset quantity,
string memo );
譯者注:開發過以太坊ERC20代幣的一定熟悉,ERC20規范了totalSupply(), balanceOf(), transfer(), transferFrom()等六個方法。eosio.token也做了類似規范,只要是create(),issue(),transfer()三個方法構造的代碼,就是一個發幣智能合約。
如果需要創建一個代幣,首先需要執行create(...)方法,在這個方法中,maximum_supply代表需要發行的資產,用字符串表示,比如發行10億個BOS,則為"1000000000.0000 BOS"。發行方issuer必須是經過授權的能夠執行發行資產issue、凍結資產freezing、召回資產recall、設置白名單whitelist等操作。
下面用cleos命令來創建一個名為BOS的代幣,發行量為10億,精度為小數點后4位:
$ cleos push action eosio.token create '[ "eosio", "1000000000.0000 EOS", 0, 0, 0]' -p eosio.token
執行結果:
executed transaction: 0e49a421f6e75f4c5e09dd738a02d3f51bd18a0cf31894f68d335cd70d9c0e12 260 bytes 1000 cycles
# eosio.token <= eosio.token::create {"issuer":"eosio","maximum_supply":"1000000000.0000 EOS","can_freeze":0,"can_recall":0,"can_whitelis...
另外,還有一種較為復雜的方式,使用JSON格式的參數:
$ cleos push action eosio.token create '{"issuer":"eosio", "maximum_supply":"1000000000.0000 EOS", "can_freeze":0, "can_recall":0, "can_whitelist":0}' -p eosio.token
執行結果
executed transaction: 0e49a421f6e75f4c5e09dd738a02d3f51bd18a0cf31894f68d335cd70d9c0e12 260 bytes 1000 cycles
# eosio.token <= eosio.token::create {"issuer":"eosio","maximum_supply":"1000000000.0000 EOS","can_freeze":0,"can_recall":0,"can_whitelis...
由于創建的代幣需要“擁有”這個代幣的命名空間(如EOS),因而獲得eosio.token智能合約的權限,所以在以上命令中,有一個參數 -p eosio.token。
讓賬戶user發行代幣
現在,我們來創建一個代幣,代幣的發行方為賬戶user。 可以使用如下命令:
$ cleos push action eosio.token issue '[ "user", "100.0000 EOS", "memo" ]' -p eosio
執行結果:
executed transaction: 822a607a9196112831ecc2dc14ffb1722634f1749f3ac18b73ffacd41160b019 268 bytes 1000 cycles
# eosio.token <= eosio.token::issue {"to":"user","quantity":"100.0000 EOS","memo":"memo"}
>> issue
# eosio.token <= eosio.token::transfer {"from":"eosio","to":"user","quantity":"100.0000 EOS","memo":"memo"}
>> transfer
# eosio <= eosio.token::transfer {"from":"eosio","to":"user","quantity":"100.0000 EOS","memo":"memo"}
# user <= eosio.token::transfer {"from":"eosio","to":"user","quantity":"100.0000 EOS","memo":"memo"}
這次操作,輸出的信息中出現了一個issue和三個transfer。但是,我們只簽名了一個操作issue,怎么會出現三個transfer呢?這是因為這個issue操作帶動了inline transfer(內聯交易操作),并且這個內聯交易操作通知了發送方和接收方的帳號。以上三個transfer顯示了所有的操作細節,包括操作命令、順序等等。
如果需要查看被廣播的實際交易,可以使用-d -j選項來指示:不要廣播,以JSON形式返回交易內容,如下:
$ cleos push action eosio.token issue '["user", "100.0000 EOS", "memo"]' -p eosio -d -j
結果如下:
{
"expiration": "2018-04-01T15:20:44",
"region": 0,
"ref_block_num": 42580,
"ref_block_prefix": 3987474256,
"net_usage_words": 21,
"kcpu_usage": 1000,
"delay_sec": 0,
"context_free_actions": [],
"actions": [{
"account": "eosio.token",
"name": "issue",
"authorization": [{
"actor": "eosio",
"permission": "active"
}
],
"data": "00000000007015d640420f000000000004454f5300000000046d656d6f"
}
],
"signatures": [
"EOSJzPywCKsgBitRh9kxFNeMJc8BeD6QZLagtXzmdS2ib5gKTeELiVxXvcnrdRUiY3ExP9saVkdkzvUNyRZSXj2CLJnj7U42H"
],
"context_free_data": []
}
將代幣轉到賬戶tester
經過上一步操作,賬戶user已經擁有了代幣,現在我們將25個EOS轉給賬戶tester。我們使用選項 -p user來授權這個操作。
$ cleos push action eosio.token transfer '[ "user", "tester", "25.0000 EOS", "m" ]' -p user
執行結果:
executed transaction: 06d0a99652c11637230d08a207520bf38066b8817ef7cafaab2f0344aafd7018 268 bytes 1000 cycles
# eosio.token <= eosio.token::transfer {"from":"user","to":"tester","quantity":"25.0000 EOS","memo":"m"}
>> transfer
# user <= eosio.token::transfer {"from":"user","to":"tester","quantity":"25.0000 EOS","memo":"m"}
# tester <= eosio.token::transfer {"from":"user","to":"tester","quantity":"25.0000 EOS","memo":"m"}
部署交易所合約
與上述例子類似,我們也可以部署交易所exchange合約。exchange合約提供了創建與交易代幣的功能。這個部署需要在EOSIO的根目錄進行。 第一步:創建exchange帳號
$ cleos create account eosio exchange 公鑰1 公鑰2
執行結果:
executed transaction: 4d38de16631a2dc698f1d433f7eb30982d855219e7c7314a888efbbba04e571c 364 bytes 1000 cycles
# eosio <= eosio::newaccount {"creator":"eosio","name":"exchange","owner":{"threshold":1,"keys":[{"key":"EOS7ijWCBmoXBi3CgtK7DJxe...
第二步:創建exchange智能合約
$ cleos set contract exchange build/contracts/exchange -p exchange
執行結果:
Reading WAST...
Assembling WASM...
Publishing contract...
executed transaction: 5a63b4de8a1da415590778f163c5ed26dc164c960185b20fd834c297cf7fa8f4 35172 bytes 10000 cycles
# eosio <= eosio::setcode {"account":"exchange","vmtype":0,"vmversion":0,"code":"0061736d0100000001f0023460067f7e7f7f7f7f00600...
# eosio <= eosio::setabi {"account":"exchange","abi":{"types":[{"new_type_name":"account_name","type":"name"}],"structs":[{"n...
部署Eosio.msig多人簽名合約
eosio.msig合約用來允許多方共同對一個交易進行異步簽名。 EOSIO已經在基礎層上支持多方簽名,但是需要一個異步通道來傳遞交易并簽名。eosio.msg 是一個非常友好的異步提議、確認、最終發布交易的方式。 下面是部署eosio.msig合約的步驟。 第一步:創建eosio.msig賬戶:
$ cleos create account eosio eosio.msig 公鑰1 公鑰2
執行結果:
# eosio <= eosio::newaccount {"creator":"eosio","name":"eosio.msig","owner":{"threshold":1,"keys":[{"key":"EOS7ijWCBmoXBi3CgtK7DJ...
第二步:部署eosio.msig合約:
$ cleos set contract eosio.msig build/contracts/eosio.msig -p eosio.msig
執行結果:
Reading WAST...
Assembling WASM...
Publishing contract...
executed transaction: a113a7db8c878dfd894671792770b59a04efb3aa8295f5b3d585daf89c314ec9 8964 bytes 10000 cycles
# eosio <= eosio::setcode {"account":"eosio.msig","vmtype":0,"vmversion":0,"code":"0061736d0100000001bd011b60047f7e7e7f0060047...
# eosio <= eosio::setabi {"account":"eosio.msig","abi":{"types":[{"new_type_name":"account_name","type":"name"},{"new_type_na...