当前位置: 首页 > 文档资料 > EOS 开发者指南 >

心心念念的 Lover Wall 3.0 版本来了

优质
小牛编辑
128浏览
2023-12-01

比之 2.0、3.0 的代码还是做了很多的优化,代码很少,在这里不做过多说明,都在代码里,介绍在代码中间穿插。重点看代码演示。

.cpp 文件

.cpp代码如下:

/**
 *  @eosfans.io
 *  @author lome
 */

#include <lover/lover.hpp>


namespace eosio{

//定义函数
void love::say(account_name lover, string letter)
{
    //验证权限
    require_auth( _self );
    // 定义loves类型
    loves lovetable( _self, lover);
    //查询lover是否存在, 如果存在则assert
    auto exit = lovetable.find(lover);
    eosio_assert(exit == lovetable.end(), "You love has been said!");
    //构造loves
    lovetable.emplace( _self, [&]( auto& s ) {
        s.lover = lover;
        s.letter = letter;
    });

}
}
/// namespace eosio

代码逻辑非常的简单,就不在多加说明。

.hpp 文件

.hpp代码如下:

/**
 *  @eosfans.io
 *  @author lome
 */

#include <eosiolib/eosio.hpp>
#include <string>

namespace eosio {

   using std::string;
   //所有智能合约继承contract类
   class love : public contract {
      public:
         //love类构造函数
         love( account_name self ):contract(self){}
         // @abi action 成员函数声明
         void say(account_name lover, string letter);

      private:
         // @abi table 私有数据成员声明
         struct lovel {
            account_name    lover;
            string          letter;
            //私有函数成员
            account_name primary_key()const { return lover; }
         };
         //数据库类型定义
         typedef eosio::multi_index<N(love), lovel> loves;
   };

} /// namespace eosio
EOSIO_ABI( eosio::love, (say) )

.abi 文件

{
    "types": [],
    "structs": [{
        "name": "lovel",
        "base": "",
        "fields": [
            {"name": "lover", "type": "account_name"},
            {"name": "letter","type": "string"}
            ]
        },{
            "name": "say",
            "base": "",
            "fields": [
                {"name": "lover","type": "account_name"},
                {"name": "letter","type": "string"}
                ]
        }
        ],
    "actions": [
        {"name": "say","type": "say"}
        ],
    "tables": [{
        "name": "love",
        "type": "lovel",
        "index_type": "i64",
        "key_names" : ["lover"],
        "key_types" : ["uint64"]
    }
        ],
    "clauses": []
}

代码执行演示

在发布合约之前讲一下我的合约书写步骤:

  1. 通过vscode书写合约,vscode的使用社区里面已经提供,这里不在多说。
  2. 通过vscode来build项目,build完成以后build/contracts目录下会多一个lover合约。这个合约是直接可以使用的,合约目录如下所示:

发布合约

发布合约通过通常的发布合约命令即可,具体代码如下:

cleos set contract lome lover/

结果如下:

合约使用

本合约也是只定义了一个Action和一个table,后续如果有需求的话可以添加,合约使用代码如下:

cleos push action lome say '{"lover":"eostea","letter":"i love you"}' -p lome

结果如下:

如果你再执行一次,智能合约限制只能对同一个人执行一次say操作。会报错结果如下:

table 数据

执行一下命令,你讲看到你的数据:

cleos get table lome eostea love

结果如下:

测试环境

已将合约发布到party测试网络,有兴趣的同学可以去测试网络浏览器(party.eosmonitor.io)看看一下合约详情:

1.部署合约的账户lome