中移链合约常用开发介绍(四)工程树目录

这篇具有很好参考价值的文章主要介绍了中移链合约常用开发介绍(四)工程树目录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

01

目的

本文档介绍了工程化开发智能合约项目的工程树目录,介绍了各个文件夹及文件的含义和用途。本文档将沿用之前文章中实现的地址簿合约内容,以初始化项目为例展开介绍,适合刚接触合约开发的开发人员用来了解智能合约项目,帮助其快速了解以及上手智能合约。

02

智能合约介绍

区块链作为一种分布式可信计算平台,去中心化是其最本质的特征。每笔交易的记录不可篡改地存储在区块链上。智能合约中定义可以在区块链上执行的动作action和交易transaction的代码。可以在区块链上执行,并将合约执行状态作为该区块链实例不可变历史的一部分。

因此,开发人员可以依赖该区块链作为可信计算环境,其中智能合约的输入、执行和结果都是独立的,不受外部影响。

03

术语解释

WebAssembly(WASM)

用于执行可移植二进制代码格式的虚拟机,托管在nodeos中。

应用程序二进制接口(ABI)

定义如何将数据编组进出WebAssembly虚拟机的接口。

CMake

CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。它能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,组态档取名为CMakeLists.txt。熟悉某个集成开发环境(IDE)的开发者可以通过CMake用标准的方式建构软件。

04

目录树详解

(一)综述

在中移链合约常用开发介绍(二)多索引表的使用一文中,介绍了如何在智能合约中编写代码使用多索引表,完成一个可以增删改查的地址簿合约。该合约通过一个addressbook.cpp文件完成了所有代码,并不符合工程化开发的要求。

在本文中,我们将以工程化开发的方式重写这一合约,方便介绍各目录的含义和用途。

首先依旧是使用eosio-init命令创建addressbook项目。


eosio-init --path=. --project=addressbook

初次被创建的项目结构如下:


├── CMakeLists.txt c++编译描述文件
├── README.txt 引导文件
├── include
│   └── addressbook.hpp 项目头文件,包含表结构定义和接口定义
├── ricardian
│   └── addressbook.contracts.md 李嘉图合约,合约的数字文档
└── src
    ├── CMakeLists.txt c++编译描述文件
    └── addressbook.cpp 项目源文件,包含接口实现

(二)头文件目录include

智能合约以C++程序呈现,文件夹也大多遵循C++项目的命名习惯。其中include文件夹用于存放头文件,即后缀为.hpp的文件,可称为头文件目录。

头文件中编写了合约动作(函数)的声明、表格(结构体)等。

在addressbook项目中,合约的构造函数、两个动作upsert和erase的声明、多索引表people,都应写在addressbook.hpp文件中并放置于头文件目录include.

addressbook.hpp内容如下:


#include <eosio/eosio.hpp>

using namespace eosio;

class [[eosio::contract("addressbook")]] addressbook : public eosio::contract {

public:

  addressbook(name receiver, name code,  datastream<const char*> ds): 
  contract(receiver, code, ds) {}


  ACTION upsert(name user, std::string first_name, std::string last_name, uint64_t age, std::string street, std::string city, std::string state);

  ACTION erase(name user);

private:
  TABLE person {
    name key;
    std::string first_name;
    std::string last_name;
    uint64_t age;
    std::string street;
    std::string city;
    std::string state;

    uint64_t primary_key() const { return key.value; }
    uint64_t get_secondary_1() const { return age; }

  };

  using address_index = eosio::multi_index<"people"_n, person, indexed_by<"byage"_n, const_mem_fun<person, uint64_t, &person::get_secondary_1>>>;

};

(三)源文件目录src

src是source的缩写,在目录中是源文件的意思。src文件夹用于存放源文件,即后缀为.cpp的文件,可称为源文件目录。

1、源文件

源文件中编写了合约动作(函数)的实现。

在addressbook项目中,合约的两个动作upsert和erase的实现,都写在addressbook.cpp文件中并放置于源文件目录src.

addressbook.cpp内容如下:


#include <addressbook.hpp>

ACTION addressbook::upsert(name user, std::string first_name, std::string last_name, uint64_t age, std::string street, std::string city, std::string state) {
   require_auth( user );
   address_index addresses(get_first_receiver(),get_first_receiver().value);
   auto iterator = addresses.find(user.value);
   if( iterator == addresses.end() )
   {
     addresses.emplace(user, [&]( auto& row ) {
      row.key = user;
      row.first_name = first_name;
      row.last_name = last_name;
      row.age = age;
      row.street = street;
      row.city = city;
      row.state = state;
     });
   }
   else {
     addresses.modify(iterator, user, [&]( auto& row ) {
       row.key = user;
       row.first_name = first_name;
       row.last_name = last_name;
       row.age = age;
       row.street = street;
       row.city = city;
       row.state = state;
     });
   }
}

ACTION addressbook::erase(name user) {
   require_auth(user);

   address_index addresses(get_self(), get_first_receiver().value);

   auto iterator = addresses.find(user.value);
   check(iterator != addresses.end(), "Record does not exist");
   addresses.erase(iterator);
}

2、CMakeLists.txt

CMake通过CMakeLists.txt配置项目的构建系统,配合使用cmake命令行工具生成构建系统并执行编译、测试,相比于手动编写构建系统要高效许多。

由eosio-init自动生成的CMakeLists.txt文件内容如下:


project(addressbook)

set(EOSIO_WASM_OLD_BEHAVIOR "Off")
find_package(eosio.cdt)

add_contract( addressbook addressbook addressbook.cpp )
target_include_directories( addressbook PUBLIC ${CMAKE_SOURCE_DIR}/../include )
target_ricardian_directory( addressbook ${CMAKE_SOURCE_DIR}/../ricardian )
  • project 项目名

  • add_contract 用于构建智能合约并生成ABI

  • 第一个参数是合约名称;

  • 第二个参数是cmake目标名称;

  • 其余是构建合约所需的CPP文件(如本例中的addressbook.cpp)。

  • target_include_directories用于将头文件所在的目录添加到特定的cmake目标,指向include文件夹

  • target_ricardian_directory用于将李嘉图合约所在的目录添加到特定的cmake目标,指向ricardian文件夹

(四)李嘉图合约目录ricardian

在基于EOSIO的区块链环境中,李嘉图合约是一个伴随智能合约的数字文档,定义了智能合约与其用户之间交互的条款和条件,以人类可读的文本编写,然后对其进行加密签署和验证。对于人和程序来说,它都很容易阅读,并有助于为智能合约和其用户之间的交互中可能出现的任何情况提供清晰的理解。

本例中存在upsert和erase两个动作,可以按如下编写addressbook.contracts.md文件:


<h1 class="contract">upsert</h1>
---
spec-version: 0.0.1
title: Upsert
summary: This action will either insert or update an entry in the address book. If an entry exists with the same name as the specified user parameter, the record is updated with the first_name, last_name, street, city, and state parameters. If a record does not exist, a new record is created. The data is stored in the multi index table. The ram costs are paid by the smart contract.
icon:

<h1 class="contract">erase</h1>
---
spec-version: 0.0.1
title: Erase
summary: This action will remove an entry from the address book if an entry in the multi index table exists with the specified name.
icon:

描述了每个动作的具体解释。

(五)CMakeLists.txt文件

根目录下自动生成的CMakeLists.txt文件内容如下:


include(ExternalProject)
# if no cdt root is given use default path
if(EOSIO_CDT_ROOT STREQUAL "" OR NOT EOSIO_CDT_ROOT)
   find_package(eosio.cdt)
endif()

ExternalProject_Add(
   addressbook_project
   SOURCE_DIR ${CMAKE_SOURCE_DIR}/src
   BINARY_DIR ${CMAKE_BINARY_DIR}/addressbook
   CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${EOSIO_CDT_ROOT}/lib/cmake/eosio.cdt/EosioWasmToolchain.cmake
   UPDATE_COMMAND ""
   PATCH_COMMAND ""
   TEST_COMMAND ""
   INSTALL_COMMAND ""
   BUILD_ALWAYS 1
)

文件中包含对eosio.cdt的导入,以及项目源文件、资源文件目录的导航。

(六)README.txt文件


--- addressbook Project ---

 - How to Build -
   - cd to 'build' directory
   - run the command 'cmake ..'
   - run the command 'make'

 - After build -
   - The built smart contract is under the 'addressbook' directory in the 'build' directory
   - You can then do a 'set contract' action with 'cleos' and point in to the './build/addressbook' directory

 - Additions to CMake should be done to the CMakeLists.txt in the './src' directory and not in the top level CMakeLists.txt

该文档的初始化内容中描述了如何编译并部署合约项目,根据实际的开发情况,可以在README.txt文件中对项目的结构、主要功能、使用方法进行描述,供参与开发或使用项目代码的人参考。

05

开发中的操作

(一)编译部署

在终端中使用如下命令:


cd ~/biosboot/genesis/addressbook
cd build/
cmake ..
make

得到的最终结果后有如下提示,则为编译成功:


[100%] Linking CXX executable addressbook.wasm
[100%] Built target addressbook
[ 77%] No install step for 'addressbook_project'
[ 88%] No test step for 'addressbook_project'
[100%] Completed 'addressbook_project'
[100%] Built target addressbook_project

此时,bulid文件夹中已生成该合约的.wasm和.abi文件,使用cleos set contract部署合约:

cleos set contract addressbook /home/xxx/biosboot/genesis/addressbook/build/addressbook -p addressbook@active
Reading WASM from /home/xxx/biosboot/genesis/addressbook/build/addressbook/addressbook.wasm...
Skipping set abi because the new abi is the same as the existing abi
Publishing contract...
executed transaction: 19d0acfa59ba196c4d355c95c7fd420f0e2343967540cff6ef4c5aa73c25cc33  17672 bytes  3566 us
#         eosio <= eosio::setcode               {"account":"addressbook","vmtype":0,"vmversion":0,"code":"0061736d01000000019a022a60000060037f7f7f01...
<4>warn  2023-01-18T07:16:08.250 cleos     main.cpp:615                  print_rwarning: transaction executed locally, but may not be confirmed by the network yet

(二)添加源文件

如果项目中声明的方法增多,且隶属不同种类的功能,可能会用到多个源文件。将同类型或共同实现一类功能的方法实现编写在同一个源文件当中。

当项目有多个源文件时,应当按照如下方法进行添加:

  • 将.cpp文件放入src文件夹中

  • 修改src文件夹中的CMakeLists.txt文件,在add_contract后增加新的.cpp文件。

例如:


add_contract( addressbook addressbook addressbook.cpp xxx.cpp)

(三)添加头文件

如果项目中声明的方法增多,且隶属不同种类的功能,或者引入了单独的工具方法,可能会用到多个头文件。

当项目有多个头文件时,只需要将.hpp文件放入include文件夹中即可。src文件夹中的CMakeLists.txt中有如下语句:

target_include_directories( addressbook PUBLIC ${CMAKE_SOURCE_DIR}/../include )

该语句会将include文件夹中的所有文件作为头文件资源。

电脑访问DDC网络门户

ddc.bsnbase.com

-END-文章来源地址https://www.toymoban.com/news/detail-465288.html

到了这里,关于中移链合约常用开发介绍(四)工程树目录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 中移链DDC-SDK技术对接全流程(三)

    id:BSN_2021 公众号:BSN 研习社 作者:中移信息 2021年10月,BSN 提出搭建 BSN-DDC 基础网络,区块链团队自主研发中移链(CMBaaS)DDC 并与 BSN 开展合作,面向存在 DDC 业务需求的各行业客户提供接入服务,使其可便捷管理 DDC 操作,从而灵活升级产品模式,助力客户业务创新。 本文

    2024年01月17日
    浏览(24)
  • 中移链与BSN分布式云管平台集成,共同构建专属协同体系

    01 中移链与BSN分布式云管平台集成, 融入BSN生态体系 中移链OPB(OPB即开放联盟链,Open Permissioned Blockchain)与BSN基于BSN分布式云管平台,打造了中移链专属门户、中移链专属运营、中移链专属运维功能模块,在BSN分布式云管平台中构建专属于中移链的协同运作体系,为BSN分布

    2024年02月16日
    浏览(30)
  • Vue基础入门(2)- Vue的生命周期、Vue的工程化开发和脚手架、Vue项目目录介绍和运行流程

    Vue生命周期:就是一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个阶段: ① 创建 ② 挂载 ③ 更新 ④ 销毁 1.创建阶段:创建响应式数据 2.挂载阶段:渲染模板 3.更新阶段:修改数据,更新视图 watch 是监听的数据修改就触发, updated 是整个组件的dom更新才触发 4.销毁

    2024年03月10日
    浏览(44)
  • HarmonyOS 工程目录介绍

    工程目录 AppScope:存放应用全局所需要的资源文件 base element:文件夹主要存放公共的字符串、布局文件等资源 media:存放全局公共的多媒体资源文件 app.json5:应用的全局的配置文件,用于存放应用公共的配置信息 entry:应用的主模块,存放HarmonyOS应用的代码、资源等 src oh

    2024年01月23日
    浏览(32)
  • 【区块链-智能合约工程师】第四篇:Truffle框架安装和介绍(Windows)

    参考文章: 以太坊开发框架——Truffle的基础使用 区块链(2)以太坊开发框架Truffle教程(Windows)(主要参考) 简单介绍 Truffle 是目前最流行的 以太坊 DApp 开发框架 ,(按照官网说法)是一个世 界级的开发环境和测试框架,也是所有使用了 EVM 的区块链的资产管理通道,它

    2024年02月02日
    浏览(37)
  • 安卓的工程目录文件夹简单介绍

    当创建了一个安卓工程之后,系统会生成很多文件夹,那么这些文件夹都存放的是什么东西呢? src:存放java代码,有包,有文件。相当于普通java程序的src文件夹。 gen:存放自动生成的文件。R.java存放的是程序的页面、按键、文本等的id。 Android 4.4和Android Private Libaries:安卓

    2024年02月05日
    浏览(39)
  • 以太坊–智能合约开发介绍及环境搭建

    目录 1. 智能合约的概念 2. 智能合约的优点  3. 智能合约开发 3.1 支持智能合约的区块链 3.2 以太坊智能合约开发工具 3.3 以太坊智能合约开发语言 4. 智能合约开发环境搭建 4.1 准备工作 4.2 Node 与 NPM 4.3 Truffle 框架 4.4 Ganache 4.5 Metamask 4.6 VS code 与 Solidity插件 智能合约 (

    2024年02月05日
    浏览(30)
  • linux常用命令介绍 06 篇——Linux查看目录层级结构以及创建不同情况的层级目录

    Linux命令01篇——Linux解压缩文件常用命令. Linux命令02篇——linux日常常用命令介绍. linux常用命令介绍 03 篇——常用的文本处理工具之grep和cut(以及部分正则使用). linux常用命令介绍 04 篇——uniq命令使用介绍(Linux重复数据的统计处理). linux常用命令介绍 05 篇——实际应用

    2024年02月12日
    浏览(33)
  • 最新版VScode添加tomcat服务器配置本地工程开发目录

    你会发现这个插件已经过期,然后点开按提示安装 Community Server Connectors扩展。

    2024年02月11日
    浏览(39)
  • C++/MFC工程[1]——创建新项目及常用类介绍

    1、选择“MFC应用”,点击“下一步” 2、 配置项目 默认项目名称如下,此处使用默认名。 点击“创建”,应用程序类型选择“单个文档”,项目样式选择“MFC standard”。 注: 本文以单文档为例   点击“完成”。 3、运行新项目 直接点击“本地调试器”,发现此时已经是一

    2024年02月04日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包