编译环境
在《EOS环境搭建》中已经编译并且安装了智能合约的编译工具链
合约调试
- nodeos配置
调试合约最好在本地搭建一个Nodeos测试节点,运行nodeos时,加入--contracts-console或者通过config.ini设置contracts-console = true。这样在nodeos日志中就会显示合约的详细信息。
- 合约中增加打印信息
合约支持的打印函数print.
举例:
Print(“hello”,name{user},”world”,count,”\n”)
第一个合约,Hello World
合约的编写需要学习官网文章:
https://developers.eos.io/eosio-home/docs/your-first-contract
需要c++ 11的经验
#include <eosio/eosio.hpp>
using namespace eosio; //需要使用eosio的命名空间
class [[eosio::contract]] hello : public contract {//基于eosio::contract 创建c++11标准的class public: using contract::contract;//引用基类 contract 的构造函数
[[eosio::action]] //c++11 风格的属性 void hi( name user ) { print( "Hello, ", user); } }; |
这是个简单的合约,hi为一个Action(就是外部能够调用的函数)。该action打印用户输入的用户名。如果函数不希望被外部调用就不要加“[[eosio::action]]”修饰。
- 编译合约
eosio-cpp -abigen -o hello.wasm hello.cpp
- 部署合约
Eos中每个账户只有一个有效合约,可以部署多个,但只有最后一个合约可用
对于hello合约,可用创建一个专用的用户名。
例如:
cleos create account eosio hello EOSpublickeyxxxxxxxx -p eosio@active
部署合约:
cleos set contract hello CONTRACTS_DIR/hello -p hello@active
测试
cleos push action hello hi '["bob"]' -p bob@active
- 合约改进(require_auth)
void hi( name user ) {
require_auth( user );
print( "Hello, ", name{user} );
}
require_auth函数对参数user进行判断,判断action的执行者是否有响应权限。
第二个合约
数据持久化通过multi_index实现
参考官网
https://developers.eos.io/eosio-home/docs/data-persistence
代码实例
#include <eosio/eosio.hpp>
using namespace eosio;
class [[eosio::contract("addressbook")]] addressbook : public eosio::contract {
public:
private: struct [[eosio::table]] person { //指定了struct的属性为table name key; std::string first_name; std::string last_name; std::string street; std::string city; std::string state;
uint64_t primary_key() const { return key.value;} //每个multi_index都需要设置主键 };
typedef eosio::multi_index<"people"_n, person> address_index; //定义一个名为“people”的表,_n 表示eosio::name }; |
在合约中实例化一个multi_index表
address_index addresses(get_self(), get_first_receiver().value);
第一个参数为code,第二个参数为scope。根据code和scope确定一张表。
以上实例中,get_self()返回合约名称,get_first_receiver().value返回合约的账户名
修改表结构
Multi_index的表结构不能修改,如果你需要修改表结构,那么保存的所有数据都将被删除。
查找表中的一条记录
使用Multi_index的find方法
向表中插入数据
Multi_index的emplace方法可用添加数据
修改表中数据
Multi_index的modify方法可修改表中数据
删除表中数据
使用Multi_index的erase方法
使用cleos工具查询表中数据:
cleos get table addressbook addressbook people --lower alice --limit 1
其中第一个addressbook为账户名
第二个addressbook为scope
People为表名称
具体程序请参考官网的
https://developers.eos.io/eosio-home/docs/data-persistence实例。