开发合约前,我们先选择下将要用的编辑工具

我常用的有 clion 和vscode,电脑os为mac,不过其他系统差别不大,如果你习惯用于Windows,那建议选择 Windows Subsystem for Linux,不建议用其他三方封装的工具,以免更新不及时,或者不兼容,导致生产上出问题.

下面我们讲用以vscode 做演示.

配置智能合约项目

先用vscode打开eosio.cdt项目代码目录,按提示安装相应的扩展插件.一般只需要安装个 c/c++

等vscode加载索引完,会根据eosio.cdt项目下的cmakelists.txt 配置好开发环境及其include路径.

所以我一般习惯是直接将自己的智能合约项目直接clone 在 eosio.cdt/examples目录下,省的自己做相关依赖配置.

我们先假定一个智能合约项目,项目名为bcskill.game (项目名与合约名一致,省的后面弄混)

新建bcskill.game目录(目录名也要与合约名一致,方便后面部署),路径为eosio.cdt/examples/bcskill.game

目录结构如下

eosio.cdt/examples/bcskill.game

eosio.cdt/examples/bcskill.game/common //存放一些公用的源码文件

eosio.cdt/examples/bcskill.game/bcskill.game.hpp //智能合约头文件

eosio.cdt/examples/bcskill.game/bcskill.game.cpp // 智能合约源文件

eosio.cdt/examples/bcskill.game/README.md // 帮助文档

习惯的代码结构

bcskill.game.hpp

#pragma once

//一些常用的头文件依赖 根据实际所需添加

#include

#include

#include

#include

#include

namespace bcskillgame // 为自己的项目创建单独的命名空间

{

// 一些用到的命名空间 根据实际需要添加

using eosio::time_point;

using eosio::microseconds;

using eosio::name;

using namespace std;

// 定义下一些用到的宏,比如系统EOS代币符号

#define EOS_SYMBOL symbol(symbol_code("EOS"),4)

一些内部会用到的结构体

struct play_hero_info{

uint8_t hero_id;

uint8_t hero_grade;

uint8_t count;

};

...

// 定义所需的table表

struct [[eosio::table("system"), eosio::contract("bcskill.game")]] system{

uint64_t id;

bool upgrading; //升级或维护中,暂时停止合约内所有的业务

time_point zero_time;

auto primary_key() const { return id; }

};

// `eosio::table("system")`中的system为合约内table的名字,后面可以用 get table 这个名字查看链上此table数据

// eosio::contract("bcskill.game")]] 中的 "bcskill.game" 为合约的名字,也就是我们之前定好的,也就是说这个表属于"bcskill.game" 合约

...

// 为上面定义好的table 创建实例化对象

typedef eosio::multi_index system_tables;

// multi_index

//下面开始创建合约类

class [[eosio::contract("bcskill.game")]] bcskill_contract : public eosio::contract // 从系统合约对象继承下

{

public:

using eosio::contract::contract; // 引入父命名空间

// 创建合约action接口 后面可以用push action调用

ACTION upgrading(bool upgrading);

...

private:

// 添加一些私有的数据类型

// 一些整数类型可以用 enum 枚举

enum GAME_STATUS_TYPE{

GAME_STATUS_PADDING = 1,

GAME_STATUS_RUNNING,

GAME_STATUS_FINISHED

};

// 如果是小数,可以用class

class RACE_PWOER_TYPE{

public:

static constexpr auto RACE_PWOER_ORC_HUM_TA = 0.3;

static constexpr auto RACE_PWOER_UD_VS_HUM_ORC_TA = 0.3;

static constexpr auto RACE_PWOER_HUM_ORC_TA_VS_NE = 0.3;

static constexpr auto RACE_PWOER_NE_VS_UD = 1.3;

};

// 合约内不建议使用小数操作,一些场景可以先统一增大倍数,转为整数

class UPDATE_RATE_TYPE{

public:

static constexpr auto PROBABILITY_ACCURACY = 100;

static constexpr auto UPDATE_RATE_1_SUCCESS = 0.7 * PROBABILITY_ACCURACY;

...

};

// 定义写私有的方法,合约内部使用,这里的方法不会被 push action调用到

bool is_upgrading();

};

}

bcskill.game.cpp

#include "bcskill.game.hpp" //引入头文件

// 引入一些其他的头文件,比如

#include "common/utils.hpp"

// 引入所需的命名空间

using namespace bcskillgame;

using namespace eosio;

// 为头文件中各个action添加实现方法

void bcskill_contract::upgrading(bool upgrading){

require_auth( _self.value );

system_tables system_table(_self, _self.value);

auto itr = system_table.begin();

if(itr == system_table.end()){

system_table.emplace( _self, [&]( auto& s ) {

s.id = system_table.available_primary_key();

s.upgrading = upgrading;

});

}else{

system_table.modify( itr, _self, [&]( auto& s ) {

s.upgrading = upgrading;

});

}

}

...

// 一些私有方法实现

bool bcskill_contract::is_upgrading(){

bool result = false;

system_tables system_table(_self, _self.value);

auto itr = system_table.begin();

if(itr != system_table.end()){

result = itr->upgrading;

}

return result;

}

....

// 为action 申明调用

extern "C" {

[[noreturn]] void apply(uint64_t receiver, uint64_t code, uint64_t action) {

if(code=="eosio.token"_n.value && action=="transfer"_n.value) {

execute_action( name(receiver), name(code), &bcskill_contract::transfer);

}

else if(code==receiver){

switch(action)

{

EOSIO_DISPATCH_HELPER( bcskill_contract, (upgrading) //只有添加后,action才能被外部 push action

default:

eosio_assert(false, "it is not my action"); // 为安全,防止被恶意调用,影响合约响应

break;

}

}

eosio_exit(0);

}

};

此时合约的基本代码结构已完成

编译合约

进入代码目录执行

eosio-cpp -o bcskill.game.wasm bcskill.game.cpp --abigen

执行完毕后,会生成

bcskill.game.abi 和 bcskill.game.wasm

我们可以简单的理解为 abi 为(.h)头文件,wasm 为dll或so 库.

我们想执行某个账号下的合约时,先会获取这个合约的abi信息,也就是先获取合约内所有的action接口,然后根据所指定的接口在发起交易,执行合约内对应的逻辑.

合约部署

cleos -u https://api.eoslaomao.com set contract bcskillsurou ../bcskill.game/ -p bcskillsurou

合约执行

cleos -u https://api.eoslaomao.com push action bcskillsurou upgrading '{"upgrading": 1}' -p bcskillsurou

查看链上table

cleos -u https://api.eoslaomao.com get table bcskillsurou bcskillsurou system

类似返回数据如下

{

"rows": [{

"id": 0,

"upgrading": 1,

"zero_time": "2019-03-30T16:00:00.000"

}

],

"more": false

}

建议

对于数据类型的选取,编写前,最好专门花时间确定下,避免不必要的RAM浪费或者后面数据溢出.

比如uint8_t 到 uint64_t的选取,如果小于255 就用 uint8_t节约内存

对于一些数据table的划分,最好能实现评估下,如果前端没有全局(_self)查找或排序要求,创建对应合适的scope下,降低find时的消耗.

尽量避免后面做数据迁移.迁移会存在一些人为的操作失误风险,以及期间可能需要暂停dapp,影响用户体验.

本文结束,全文演示了我目前习惯的合约目录及代码结构,以及基本的合约使用,后面有时间再补充,如果大家有什么更好的方法或者建议可以留言,一起学习~版权属于:Surou

欢迎添加区块链技术QQ群:791420381 <====> 社区提供付费服务:主链定制修改,环境搭建及日常运维,智能合约编写,技术架构设计,技术顾问等。收入主要用于社区服务器以及推广开支。详询加QQ652511569

c++ eos智能合约开发_EOS智能合约开发点滴记录-第二篇智能合约编写相关推荐

  1. 重磅!上汽智己IM AD将搭载速腾聚创第二代智能固态激光雷达

    传统车企面向汽车高端化和智能网联电动化发起全面进攻,竞争开始进入实质性阶段. 刚刚开幕的成都车展上,智己.极氪.极狐.岚图等几大新"二代"品牌纷纷到场同台炫技,其中上汽智己汽车就带 ...

  2. 智能网联(车联网)示范区发展现状分析—西南篇

    | 文章版权所有,未经授权请勿转载或使用 继微信公众号"5G行业应用"的<智能网联(车联网)示范区发展现状分析--华东篇(上)>.<智能网联(车联网)示范区发展现 ...

  3. c++ eos智能合约开发_EOS智能合约开发为何编译成WebAssembly?

    许多人正试图学习如何在EOS上开发智能合约.但是,这些智能合约是由C++编写的,并编译成WebAssembly,这对大多数非c++程序员来说似乎很奇怪.因此,在深入了解EOS之前,最好先学习一些关于W ...

  4. 以太坊智能合约开发第二篇:理解以太坊相关概念

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 很多人都说比特币是区块链1.0,以太坊是区块链2.0.在以太坊平台上,可以开发各种各样的去中心化应用,这些应用构成了以太 ...

  5. 手把手教你搭建智能合约测试环境、开发、编译、部署以及如何通过JS调用合约方法

    链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载. 学习目标 了解智能合约 简单环境搭建 能够利用solidity编写Hello World合约 合约部署 和合约互 ...

  6. 【区块链技术开发】剖析区块链Ganache模拟器工具及其智能合约部署区块链的查询方式

    专栏:[区块链技术开发] 前期文章: [区块链技术开发]基于Web3.js以太坊网络上的智能合约的交互及其应用 [区块链技术开发]OpenZeppelin智能合约库:提高智能合约的安全性和可靠性,加速 ...

  7. Solidity智能合约开发 — 1-以太坊开发工具和部署

    Solidity简介 solidity 是为实现智能合约而创建的一个高阶编程语言.也是以太坊虚拟机(EVM)智能合约的语言. Solidity开发工具remix remix是以太坊官方推荐的在线开发工 ...

  8. 怎么调用获取被创建的预制体_Uber 开源 Plato:扩展性极强的开发测试会话 AI 平台,可实现多智能体并行训练...

    雷锋网 AI 科技评论按:在过去的几十年中,智能会话系统已经发生了显著的变化,从关键字识别交互式语音应答(IVR)系统到跨平台智能个人助理,都在慢慢成为日常生活中不可或缺的一部分.在这样的背景环境下, ...

  9. 百度智能小程序正式开源,开发方案详解

    13日下午,2018百度·智能小程序学院首场线下公开课在北京举行,百度官方数据显示,自今年7月份百度AI开发者大会以来,百度智能小程序月活已经过了1.5亿,值得一提的是,智能小程序已经在GitHub上 ...

最新文章

  1. 电路过孔温度没有我们想象的那么高
  2. HDU 5908 Abelian Period 暴力
  3. jquery模糊查询
  4. 快速设置 Docker 的三种网络代理配置
  5. Modown v7.3无限制版+ Erphpdown12.3插件 + 工单系统
  6. Failed to parse XML
  7. 2的次方表(1~64次方)
  8. unity vr是加一个摄像机就行吗_梦工厂和皮克斯员工创办的Baobab谈互动叙事:传统动画与VR动画的探索...
  9. Android分享wifi给电脑,使用Android手机共享手机网络给PC上网
  10. jetson xavier nx安装ROS Melodic
  11. 遇到类似的问题,linux cp 参数过长问题---转载
  12. Git之删除本地仓库
  13. vector内存机制和性能分析
  14. 几种网络数据传输过程
  15. html、css、JavaScript杂乱知识汇总
  16. ANSYS Mechanical联合ANSYS nCode DesignLife 在疲劳中的应用
  17. Python函数引用
  18. 一键下载75款常用的jquery特效前端网页代码
  19. DAC配置—SPI的使用
  20. ipad怎么和mac分屏_Macbook在ipad上怎么投屏和分屏,推荐两个app

热门文章

  1. Zemax自学---1(基础知识)
  2. UDK 中的委托使用
  3. winformbutton边框怎么改_winform设置button的边框颜色,或取消边框颜色,不显示边框...
  4. 写给想玩淘宝返利的各位,淘宝返利模式.
  5. 关于字符串比较不能用“==”,用什么?
  6. uniapp微信小程序运行成功但是没调用微信开发者工具
  7. 基于MFC的通讯录管理系统设计与实现
  8. ubuntu安装Java教程
  9. JAVA定义银行账户类
  10. 【论文阅读】Exploring the Limitations of Behavior Cloning for Autonomous Driving