eosio.token 智慧合約介紹

BSN研习社發表於2024-02-04

一、目的

eosio.token系統合約定義了允許使用者為基於EOSIO的區塊鏈建立、發行和管理代幣的結構和操作,它演示了一種實現允許建立和管理代幣的智慧合約的方法。本文詳細介紹了eosio.token系統合約並在本地測試鏈上實際發行了代幣進行演示,適用於EOS智慧合約的初級開發人員,熟悉如何進行代幣的建立、發行和轉移。

二、概述

(一)合約資料結構簡介

eosio.token合約透過使用兩個內部多索引結構管理代幣、賬戶及其相應餘額的集合:accounts和 stats。accounts多索引表的每一行都包含account物件的例項,而account物件包含有關一個代幣餘額的資訊。accounts表的範圍是一個eosio帳戶,它根據代幣的符號對行進行索引。這意味著當一個人在 accounts多索引表中查詢一個賬戶名時,結果是該賬戶目前持有的所有代幣。

類似地,stats多索引表為每一行儲存currency_stats物件的例項,其中包含有關當前供應量、最大供應量和符號代幣的建立者帳戶的資訊。stats表的範圍是代幣符號。因此,當查詢stats表中的代幣符號時,如果查詢的符號代幣先前已建立,則結果是對應於查詢符號代幣的單個條目/行,否則為空。

(二)合約方法簡介

eosio.token 合約定義了create、issue、retire、transfer、open、close 共六個action供使用者建立和管理代幣。

三、環境準備

(一)一條正在執行且可訪問的區塊鏈

中移鏈(基於EOS)測試環境搭建

https://mp.weixin.qq.com/s?__biz=MzkwNjI1OTg1MA==&mid=2247489304&idx=2&sn=6d22be6194d821dbd04f6079c79930a3&scene=21#wechat_redirect

(二)確保本地錢包已開啟並解鎖

如何建立錢包:

https://developers.eos.io/manuals/eos/latest/cleos/how-to-guides/how-to-create-a-wallet圖片

四、合約方法

(一)create

Type: void

允許issuer帳戶在maximum_supply的供應中建立代幣。如果驗證成功,將在statstable中為代幣符號範圍建立一個新條目。

eosio.token 智慧合約介紹

(二)issue

Type: void

此 action 向 to 帳戶發放 quantity 代幣。

eosio.token 智慧合約介紹

(三)retire

Type: void

與create操作相反,如果所有驗證都成功,則會扣除statstable.supply金額。

eosio.token 智慧合約介紹

(四)transfer

Type: void

允許from賬戶將quantity代幣轉移到to賬戶。一個賬戶被記入借方,另一個賬戶被記入quantity代幣的貸方。

eosio.token 智慧合約介紹

(五)open

Type: void

允許ram_payer作為付款賬戶為代幣symbol建立一個餘額為零的帳戶 owner。

eosio.token 智慧合約介紹

可以在issue61、issue62閱讀更多資訊。

(六)close

Type: void此操作與open相反,它關閉代幣symbol的帳戶owner 。

eosio.token 智慧合約介紹

五、建立、發行和轉移代幣

(一)獲取合約

1、轉到contract目錄

    cd CONTRACTS_DIR

2、拉取合約原始碼

    git clone 

    cd eosio.contracts/contracts/eosio.token

(二)為合約建立賬戶

您可能需要先解鎖錢包

    cleos create account eosio eosio.token PUBLIC_KEY

(三)編譯合約

    eosio-cpp -I include -o eosio.token.wasm src/eosio.token.cpp --abigen

(四)部署代幣合約

    cleos set contract eosio.token CONTRACTS_DIR/eosio.contracts/contracts/eosio.token --abi eosio.token.abi -p eosio.token@active

結果應類似於以下內容:

        Reading WASM from ...
        Publishing contract...
        executed transaction:
    69c68b1bd5d61a0cc146b11e89e11f02527f24e4b240731c4003ad1dc0c87c2c  9696 bytes  6290 us
        #         eosio <= eosio::setcode               
    {"account":"eosio.token","vmtype":0,"vmversion":0,"code":"0061736d0100000001aa011c60037f7e7f0060047f...
        #         eosio <= eosio::setabi                
    {"account":"eosio.token","abi":"0e656f73696f3a3a6162692f312e30000605636c6f73650002056f776e6572046e61...
        warning: transaction executed locally, but may not be confirmed by the network yet         ]

(五)建立代幣

    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"}

另一種方法使用命名引數:

    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"}

該命令建立了一個新代幣 SYS,精度為 4 位小數,最大供應量為 1000000000.0000 SYS。建立此代幣需要eosio.token合約的授權。出於此原因, -p eosio.token@active 用來授權。

(六)發行代幣

在我們的例子中,發行人可以向發行人賬戶發行代幣。

	cleos push action eosio.token issue '[ "eosio", "100.0000 SYS", "memo" ]' -p eosio@active

結果應類似於以下內容:

    executed transaction: 
a26b29d66044ad95edf0fc04bad3073e99718bc26d27f3c006589adedb717936  128 bytes  337 us
    #   eosio.token <= eosio.token::issue   
        {"to":"eosio","quantity":"100.0000 SYS","memo":"memo"}
    warning: transaction executed locally, but may not be confirmed by the network yet         ]

(七)轉移代幣

現在帳戶eosio已發行代幣,將其中一些代幣轉移到帳戶bob 。

	cleos push action eosio.token transfer '[ "eosio", "bob", "25.0000 SYS", "m" ]' -p eosio@active

您需要先建立bob賬戶

結果應類似於以下內容:

    executed transaction:
60d334850151cb95c35fe31ce2e8b536b51441c5fd4c3f2fea98edcc6d69f39d  128 bytes  497 us
    #   eosio.token <=
eosio.token::transfer       
{"from":"eosio","to":"bob","quantity":"25.0000 SYS","memo":"m"}
    #         eosio <= 
eosio.token::transfer     
{"from":"eosio","to":"bob","quantity":"25.0000 SYS","memo":"m"}
    #           bob <=
eosio.token::transfer      
{"from":"eosio","to":"bob","quantity":"25.0000 SYS","memo":"m"}
    warning: transaction executed locally, but may not be confirmed by the network yet         ]

現在使用cleos get currency balance檢查“bob”是否獲得了代幣

    cleos get currency balance eosio.token bob SYS

結果:

25.00 SYS

檢查eosio的餘額,注意代幣已從帳戶中扣除:

    75.00 SYS


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70012206/viewspace-3006236/,如需轉載,請註明出處,否則將追究法律責任。

相關文章