关于智能合约:中移链合约常用开发介绍五合约项目编译

2次阅读

共计 6007 个字符,预计需要花费 16 分钟才能阅读完成。

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-

正文完
 0