天天看點

全面了解EOS——4.測試智能合約與EOS發币

以ERC20為标準的發币成為以太坊的剛需,就連EOS持續一年的衆籌也是通過以太坊的智能合約實作的。那麼在EOS中如何實作發币,能否像以太坊上一樣友善?每天聽着各種各樣的空投糖果,有沒有想過是如何實作的?一起簡單瞧瞧EOS的智能合約。

智能合約概述

智能合約,簡單了解就是放在區塊鍊上的一段代碼,當條件滿足或接收到消息後,執行指定的動作。

那緊接着抛出幾個問題,合約的這些代碼怎麼來的?在EOS上大家又是怎麼找到這段代碼?找到後誰來執行?執行結果給放到哪裡?

在EOS上,智能合約采用的是WebAssembly格式代碼,可由C++, Rust, Python等編寫編譯生成,但目前僅能使用C++(其他語言的支援還在開發中)。在使用C++編寫完成合約代碼後,通過EOSIO軟體中提供的eosiocpp 工具,将C++代碼編譯生成WASM(wasm的文本格式是字尾是wast)檔案和abi檔案,再利用cleos工具(前文全面了解EOS——3.cleos使用詳解 )将代碼部署到鍊上,也就是存到塊資料中。

智能合約名即賬号名,在上述部署合約(下面會介紹如何部署和測試)時就已經綁定了賬号。在滿足條件或被調用時,超級節點就會執行相關合約,并将執行結果的資料更新到記憶體資料庫中,同時也會更新到塊資料中。

除了編寫語言、編譯工具和執行智能合約的虛拟機這些明顯不同外,EOS智能合約與以太坊的相比還有不少理念的差别:

1.名稱不同

在EOS中具有賬号的概念,智能合約名也就是賬号名。而以太坊中的合約是一個個不同的位址。

2.更新方式不同

以太坊的合約不可更新,一旦部署之後,代碼不可修改。如果需要修改,隻能在一個新的位址上重新部署。而EOS的智能合約和賬号綁定後,賬号可直接更新智能合約的代碼,其實就相當于向鍊上重新上傳了代碼。

3.資源消耗不同

以太坊智能合約的執行需要消耗gas,也就是每個步驟都有手續費,手續費不夠就不會繼續執行,之前的操作也會被復原,而且手續費也不退。而EOS的智能合約不需要首先費,但是部署合約要消耗RAM,傳送資訊和執行合約需要消耗抵押而得的CPU和網絡帶寬。

接下來試試cleos部署及測試智能合約。

Hi, EOS智能合約

1.準備好環境

可參考 全面了解EOS——1.源碼編譯及運作和全面了解EOS——2.加入EOS主網和測試網 (記得編譯完成後要make install,不然編譯智能合約時會有問題)

2. 合約代碼

直接使用官方的hello智能合約代碼。建立hello目錄,建立hello.cpp代碼檔案,複制如下内容

#include <eosiolib/eosio.hpp>
#include <eosiolib/print.hpp>
using namespace eosio;

class hello : public eosio::contract {
  public:
      using contract::contract;

      /// @abi action 
      void hi( account_name user ) {
         print( "Hello, ", name{user} );
      }
};

EOSIO_ABI( hello, (hi) )
           

EOSIO_ABI中定義了對外可調用的函數hi方法,在hi方法中列印了Hello 調用者賬号名

3.編譯wast與abi檔案

生成wast檔案,是合約執行邏輯的代碼實作

生成abi檔案,是對外輸出的接口,也就是能直接調用該合約的方法

在測試網中部署合約。首先得在測試網有一個專門部署合約的賬号,同時執行下面的操作前,要解鎖包含該智能合約賬号私鑰的錢包(之前的文章都有說明步驟,使用的是JungleTestnet)。

調用智能合約

輸出

executed transaction: a59197b784633bb096107aa7ca1128445c8aef08383f95d752aef034b0   bytes   us
#  pscontract11 <= pscontract11::hi             {"user":"pscontract11"}
>> Hello, pscontract11
           

需要注意的是,你那可能無法看到輸出,需要在啟動nodeos時添加–contracts-console參數。如果是Jungle封裝的腳本,在start.sh中添加即可。

從編寫,編譯,部署到測試執行,一個基本的智能合約流程走完。鋪墊了這麼多,終于可以看看EOS上的發币了。

EOS發币

EOS中的代币其實就是一種智能合約,我們在主網使用的EOS币就是eosio.token負責發行和支援轉賬的。那麼我們的代币代碼隻要參照它來即可。

1.智能合約代碼

代碼可看EOSIO中的eosio.token源碼,也可以直接從https://github.com/EOSIO/eosio.token 上下載下傳。隻需要cpp檔案和hpp頭檔案即可,如果直接使用EOSIO源碼的build生成的eosio.token也沒問題,拷貝abi檔案的話,就不需要下面的修改。然後仿照前面的hello智能合約放置,編譯并部署到鍊上。

為了能夠使用get currency balance pstesttoken1 pstesttoken1 PST檢視餘額,

主要是注意增加/// @abi table相關資訊,該注解會在abi檔案中生成相關的表資訊。

修改部分代碼,請參照修改:

/// @abi table accounts i64
struct account {
   asset    balance;

   uint64_t primary_key()const { return balance.symbol.name(); }
};


/// @abi table stat i64
struct statt {
   asset          supply;
   asset          max_supply;
   account_name   issuer;

   uint64_t primary_key()const { return supply.symbol.name(); }
};

typedef eosio::multi_index<N(statt), statt> stats;
           

另外需要注意的是在自己賬号上deploy,必須要有足夠的記憶體,大約200K,好在測試網上都是免費的。部署完合約之後,就可以建立新币種,給自己和他人發币了。

2.建立新代币PST

如果對照eosio.token的代碼看,其實是調用智能合約提供的create函數,建立了PST代币,總量是1000000000。代币的建立這是pstesttoken1,後面的-p表示執行此Transaction的權限

3.發行新代币

$ ./cleos.sh push action pstesttoken1 issue '["pstesttoken1", " PST", "memo"]' -p [email protected]
           

4.轉賬

./cleos.sh push action pstesttoken1 transfer '[ "pstesttoken1", "pstest123451", " PST", "m" ]' -p [email protected]
           

從pstesttoken1将代币轉給pstest123451。

了解了智能合約,發币是不是非常簡單,分分鐘搞定。在此基礎上,參照EOSIO代碼和自己的需求慢慢添加各種功能吧。

空投

有了新的代币,是不是也想空投一把。

空投其實就是把你發行的代币,轉給其他賬号。一般是轉給創世快照的賬号(也就是早期在以太坊上購買EOS并完成映射的那些賬号),快照來源github上就有。另外也可以是某個時間點上符合條件的賬号。具體來說,可以是創世快照的賬号,且賬号餘額超過100EOS(需要使用工具過濾出符合條件的賬号)。然後就是一個個調用轉賬,從你的賬号轉賬給這些賬号。

看完是否有疑問呢?能否直接在eosio.token合約上建立新代币,或者在我已經部署的pstesttoken1上建立呢?能直接調用issue給自己發代币麼?看看代碼,檢查下權限就能知道。

空投的糖果,發行的各種代币,隻有進了交易所才能變成實實在在的錢。

轉載請注明出處:http://blog.csdn.net/w7849516230,

歡迎關注微信公衆号“程式設計陽光”

全面了解EOS——4.測試智能合約與EOS發币

參考文章:

The “Hello World” Contract

Introduction to the EOSIO Token Contract

繼續閱讀