心心念念的 Lover Wall 3.0 版本来了
优质
小牛编辑
148浏览
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": []
}
代码执行演示
在发布合约之前讲一下我的合约书写步骤:
- 通过vscode书写合约,vscode的使用社区里面已经提供,这里不在多说。
- 通过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