全面理解EOS——4.测试智能合约与EOS发币

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/w7849516230/article/details/81108651

以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文件,是合约执行逻辑的代码实现

$ eosiocpp -o hello.wast hello.cpp

生成abi文件,是对外输出的接口,也就是能直接调用该合约的方法

$ eosiocpp -g hello.abi hello.cpp

在测试网中部署合约。首先得在测试网有一个专门部署合约的账号,同时执行下面的操作前,要解锁包含该智能合约账号私钥的钱包(之前的文章都有说明步骤,使用的是JungleTestnet)。

$ ./cleos.sh set contract pscontract11 ../hello -p pscontract11@active

调用智能合约

$ ./cleos.sh push action pscontract11 hi '["pscontract11"]' -p pscontract11@active

输出

executed transaction: 831029a59197b784633bb096107aa7ca1128445c8aef08383f95d752aef034b0  104 bytes  49311 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

./cleos.sh push action pstesttoken1 create '[ "pstesttoken1", "1000000000.0000 PST"]' -p pstesttoken1@active

如果对照eosio.token的代码看,其实是调用智能合约提供的create函数,创建了PST代币,总量是1000000000。代币的创建这是pstesttoken1,后面的-p表示执行此Transaction的权限
3.发行新代币

$ ./cleos.sh push action pstesttoken1 issue '["pstesttoken1", "100000000.0000 PST", "memo"]' -p pstesttoken1@active

4.转账

./cleos.sh push action pstesttoken1 transfer '[ "pstesttoken1", "pstest123451", "25.0000 PST", "m" ]' -p pstesttoken1@active

从pstesttoken1将代币转给pstest123451。
了解了智能合约,发币是不是非常简单,分分钟搞定。在此基础上,参照EOSIO代码和自己的需求慢慢添加各种功能吧。

空投

有了新的代币,是不是也想空投一把。
空投其实就是把你发行的代币,转给其他账号。一般是转给创世快照的账号(也就是早期在以太坊上购买EOS并完成映射的那些账号),快照来源github上就有。另外也可以是某个时间点上符合条件的账号。具体来说,可以是创世快照的账号,且账号余额超过100EOS(需要使用工具过滤出符合条件的账号)。然后就是一个个调用转账,从你的账号转账给这些账号。

看完是否有疑问呢?能否直接在eosio.token合约上创建新代币,或者在我已经部署的pstesttoken1上创建呢?能直接调用issue给自己发代币么?看看代码,检查下权限就能知道。

空投的糖果,发行的各种代币,只有进了交易所才能变成实实在在的钱。

转载请注明出处:http://blog.csdn.net/w7849516230
欢迎关注微信公众号“编程阳光”
这里写图片描述

参考文章:
The “Hello World” Contract
Introduction to the EOSIO Token Contract

阅读更多

扫码向博主提问

w7849516230

非学,无以致疑;非问,无以广识
去开通我的Chat快问

没有更多推荐了,返回首页