中移链合约常用开发介绍(五)合约项目编译

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

01

目的

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

02

智能合约介绍

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

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

03

术语解释

WebAssembly(WASM)

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

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

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

04

Make介绍

make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是通过调用Makefile文件中用户指定的命令来进行编译和链接的。

它使得用户可以在不知道构建细节的情况下构建和安装,因为细节都记录在Makefile。

05

CMake介绍

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

EOS中通过命令行生成的初始化项目中就自带一个CMakeLists.txt文件。如果不需要做个性化改动,用户只需要使用cmake指令构建项目即可,不需要其余的修改。

语法介绍:

  • PROJECT关键字可以用来指定工程的名字和支持的语言,默认支持所有语言

  • PROJECT(HELLO)指定工程名字,支持所有语言

  • PROJECT(HELLO CXX)指定工程名字,支持C++

  • PROJECT(HELLO C CXX)指定工程名字,支持C和C++

  • SET关键字用来显示指定变量

  • SET(SRC_LIST main.cpp)SRC_LIST变量就包含了main.cpp

  • SET(SRC_LIST main.cpp t1.cpp t2.cpp)SRC_LIST变量包含多个cpp

  • MESSAGE关键字向终端输出用户自定义的信息

  • SEND_ERROR产生错误、生成过程被跳过

  • STATUS输出前缀为--的信息

  • FATAL_ERROR立即终止所有cmake过程

  • ADD_EXECUTABLE关键字生成可执行文件

  • ADD_EXECUTABLE(hello ${SRC_LIST})生成可执行文件名为hello,源文件读取变量为SRC_LIST

06

编译后目录树介绍

(一)综述

本文依旧以addressbook项目为例。

使用初始化eosio-init工具可以创建一个自定义项目名称的智能合约项目。在--path=后添加创建项目的路径,--project=后添加创建项目的名称。执行以下命令得到一个智能合约空项目addressbook:

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

项目中存在一个空的build文件夹,进入build目录下运行指令:

cmake ..

指令将根据根目录和src文件夹中的CMakeLists.txt文件生成构造。将会在build目录下生成所有的临时文件,不会对源文件有任何影响,也称为外部构建。

根目录下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有关的配置。

src中的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合约涉及的所有cpp文件

  • target_include_directories合约的头文件存放位置

  • target_ricardian_directory合约的李嘉图合约存放位置

运行cmake后,将在build文件夹中创建如下文件:

├── addressbook 空文件夹
├── addressbook_project-prefix 项目前缀文件夹
├── CMakeFiles CMake版本文件夹
├── cmake_install.cmake 安装文件
├── CMakeCache.txt Cache文件
└── Makefile CMake初始化文件

运行以下指令完成构建:

make

运行成功后,addressbook文件夹中会生成如下内容:

├── CMakeFiles CMake版本文件夹
├── addressbook.abi 应用程序二进制接口文件
├── addressbook.wasm WebAssembly文件
├── cmake_install.cmake 安装文件
├── CMakeCache.txt Cache文件
└── Makefile CMake初始化文件

(二)CMake文件集

CMakeFiles文件夹、cmake_install.cmake文件、 CMakeCache.txt文件、 Makefile文件都是由cmake指令产生的与CMake有关的文件。该文件集会重复的出现在自动构建的文件夹目录中,一般情况下不需要改动。

1、CMakeFiles文件夹

CMakeFiles文件夹中存放了与CMake版本和项目启动有关的各种文件。

2、cmake_install.cmake文件

cmake_install.cmake为项目目录安装脚本,安装配置名称和组件。

# Install script for directory: /home/xxx/biosboot/genesis/addressbook

# Set the install prefix
if(NOT DEFINED CMAKE_INSTALL_PREFIX)
  set(CMAKE_INSTALL_PREFIX "/usr/local")
endif()
string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")

# Set the install configuration name.
if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
  if(BUILD_TYPE)
    string(REGEX REPLACE "^[^A-Za-z0-9_]+" ""
           CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}")
  else()
    set(CMAKE_INSTALL_CONFIG_NAME "")
  endif()
  message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"")
endif()

# Set the component getting installed.
if(NOT CMAKE_INSTALL_COMPONENT)
  if(COMPONENT)
    message(STATUS "Install component: \"${COMPONENT}\"")
    set(CMAKE_INSTALL_COMPONENT "${COMPONENT}")
  else()
    set(CMAKE_INSTALL_COMPONENT)
  endif()
endif()

# Install shared libraries without execute permission?
if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)
  set(CMAKE_INSTALL_SO_NO_EXE "1")
endif()

# Is this installation the result of a crosscompile?
if(NOT DEFINED CMAKE_CROSSCOMPILING)
  set(CMAKE_CROSSCOMPILING "FALSE")
endif()

if(CMAKE_INSTALL_COMPONENT)
  set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt")
else()
  set(CMAKE_INSTALL_MANIFEST "install_manifest.txt")
endif()

string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT
       "${CMAKE_INSTALL_MANIFEST_FILES}")
file(WRITE "/home/ljy/biosboot/genesis/addressbook/addressbook/build/${CMAKE_INSTALL_MANIFEST}"
     "${CMAKE_INSTALL_MANIFEST_CONTENT}")

3、CMakeCache.txt文件

CMakeCache.txt文件中描述了CMake建立和使用的一些初始化数值,如果需要更改,可以编辑该文件并保存退出。

# This is the CMakeCache file.
# For build in directory: /home/xxx/biosboot/genesis/addressbook/build
# It was generated by CMake: /usr/bin/cmake
# You can edit this file to change values found and used by cmake.
# If you do not want to change any of the values, simply exit the editor.
# If you do want to change a value, simply edit, save, and exit the editor.
# The syntax for the file is as follows:
(文件的语法如下:)
# KEY:TYPE=VALUE
(键:类型=值)
# KEY is the name of a variable in the cache.
(KEY是缓存中变量的名称。)
# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!.
(TYPE是对GUI的VALUE类型的提示,请勿编辑TYPE!。)
# VALUE is the current value for the KEY.
(VALUE是KEY的当前值。)

4、Makefile文件

Makefile文件由Unix Makefiles生成器根据版本自动生成,请勿编辑。当没有要生成的参数时执行默认目标。

# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.16

# Default target executed when no arguments are given to make.
default_target: all

.PHONY : default_target

# Allow only one "make -f Makefile2" at a time, but pass parallelism.
.NOTPARALLEL:

(三)项目文件夹addressbook

完成构建后项目文件夹内除了CMake文件集以外,还有addressbook.abi和addressbook.wasm两个文件。

addressbook.abi是应用程序二进制接口文件ABI(Application Binary Interface)。描述了应用程序和操作系统之间,一个应用和它的库之间,或者应用的组成部分之间的低接口。

ABI涵盖了各种细节,如:

  • 数据类型的大小、布局和对齐;

  • 调用约定(控制着函数的参数如何传送以及如何接受返回值);

  • 哪个寄存器用于哪个函数参数;通过栈传递的第一个函数参数是最先push到栈上还是最后;

  • 系统调用的编码和一个应用如何向操作系统进行系统调用;

  • 在一个完整的操作系统ABI中,目标文件的二进制格式、程序库等。

.abi文件定义了数据如何编组进出WASM引擎。

addressbook.wasm是WebAssembly文件,是一个可移植、体积小、加载快并且兼容Web的全新格式。WebAssenbly 并不是一种编程语言,而是一种编译器的编译目标,可以把.wasm文件当成是.cpp文件通过编译以后生成的文件。.wasm文件是区块链中的 WebAssembly 引擎执行的二进制代码。WebAssembly 引擎托管在 nodeos 守护进程中并执行智能合约代码。

(四)项目前缀文件夹addressbook_project-prefix

cmake生成的临时文件夹,内部有src和tmp两个文件夹。存放的大多是空文件,或者与cmake有关的cmd指令。

电脑访问DDC网络门户

ddc.bsnbase.com

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

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

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

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

相关文章

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

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

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

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

    2024年02月16日
    浏览(33)
  • 嵌入式:ARM常用开发编译软件介绍

    ADS(ARM Developer Suite),是在1993年由Metrowerks公司开发是ARM处理器下最主要的开发工具。 他的前身是SDT,SDT是ARM公司几年前的开发环境软件,目前SDT早已经不再升级。ADS包括了四个模块分别是:SIMULATOR;C 编译器;实时调试器;应用函数库。ADS对汇编、C/C++、java支持的均很好,

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

    目录 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日
    浏览(32)
  • 从项目中移除CocoaPods

    打开项目文件Show in Finder: 删除本地文件(Podfile、Podfile.lock、Pods文件夹) 删除本地生成的xcworkspace文件 打开项目,在Frameworks文件夹下,删除Pods.xcconfig和libPods.a 进入项目Build Phases,删除Copy Pods Resources、Embed Pods Frameworks和Check Pods Manifest.lock 三项。 因为删除了CocoaPod管理的第三方

    2024年02月12日
    浏览(26)
  • 世界杯竞猜项目Dapp-第一章(合约开发)

    最近卡塔尔世界杯如火如荼,让我们一起来尝试利用 solidity 语言做一个世界杯竞猜的 Dapp 实战项目,本次实战学习主要参考:https://github.com/dukedaily/solidity-expert,我会针对原始项目做更详尽的注解,持续更新中… 参赛球队一经设定不可改变,整个活动结束后无法投票; 全⺠

    2024年02月10日
    浏览(26)
  • 中移物联车联网项目,在 TDengine 3.0 的应用

    小T导读:在中移物联网的智慧出行场景中,需要存储车联网设备的轨迹点,还要支持对车辆轨迹进行查询。为了更好地进行数据处理,他们在 2021 年上线了 TDengine 2.0 版本的 5 节点 3 副本集群。 3.0 发布后,它的众多特性吸引着中移物联网进行了大版本升级。本文详细分享了

    2024年02月13日
    浏览(33)
  • 10.本项目的简单介绍及所用工具

    本项目的层次架构适合初学者或者有一些基础的同学,项目整体简单明了,有着非常严谨的逻辑思维,并且在前面文章中也讲了一些项目中所需要的软件安装配置以及一些前置的在本项目中所需要的java基础知识。 股票量化交易项目 股票量化交易是一种利用计算机程序和数学

    2024年02月07日
    浏览(24)
  • 项目实例:H3C端口镜像 (镜像单目的端口 镜像多目的端口)

    一、项目实例 某局业务系统三级等保项目:配置只列出端口镜像部分,其他部分及设备(略) 1.1 边界部署两台防火墙做HA高可用 1.2 核心使用两台H3C交换机做堆叠,上联线路分别连接防火墙(主)、防火墙(备) 1.3 下联线路连接业务中心、安全监察中心 1.4 IDS入侵检测设备

    2023年04月22日
    浏览(20)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包