狗哥区块链与AI精品内容集@NonceGeek

2025年03月28日更新 75 人订阅
原价: ¥ 20 限时优惠
专栏简介 「造」最关键的是什么?| Hackathon 漫游指南(贰) Why Hackathon?| Hackathon 漫游指南(壹) 设计「众人维护」的 BuidlerBoard | BeWater.xyz Movement 白皮书中文版 Rebuidl RSS 生产因素与反生产因素 | 独立黑客创业手册(陆) 组织 | 独立黑客创业手册(伍) 生产 | 独立黑客创业手册(肆) 销售 | 独立黑客创业手册(叄) 最优先的能力 | 独立黑客创业手册(贰) 为什么从独立黑客开始 | 独立黑客创业手册(壹) Aptos Token Object V2 | Move dApp 极速入门(贰拾肆) 可編程交易塊 | Move dApp 極速入門(貳拾叁) Aptos 密鑰輪換 | Move dApp 極速入門(貳拾貳) Aptos 对象模型 | Move dApp 极速入门(贰拾壹) Aptos Moveflow SDK使用指南 | Move dApp 极速入门(贰拾) Sui 上简单 Swap 的实现 | Move dApp 极速入门(拾玖) 用 Elixir 交互 Aptos | Move dApp 极速入门(拾捌) Sui 链上数据查询 | Move dApp 极速入门(拾柒) SUI 合约测试攻略 | Move dApp 极速入门(拾陆) Sui 数据类型详解 | Move dApp 极速入门(拾伍) Airdropper Contract in Aptos | Move dApp 极速入门(拾肆) Sandwich合约源码解析 | Move dApp 极速入门(拾叁) Sui 极速上手 | Move dApp 极速入门(拾贰) scaffold-aptos 脚手架 | Move dApp 极速入门(拾壹) 对 DID Document 的思考 | Move dApp 极速入门(九) DID中地址聚合器的实现 | Move dApp 极速入门(八) 值的存取应用3.0 | Web3.0 dApp 开发(五) 合约数据类型综述 | Move dApp 极速入门(四) 操作资源 | Move dApp 极速入门(三) 第一个 Move dApp | Move dApp 极速入门(二) Hello Move | Move dApp极速入门(一) Staker | Web3.0 dApp 开发(九) Token 自动售卖机 | Web3.0 dApp 开发(七) SVG NFT 全面实践 | Web3.0 dApp 开发(六) 值的存取应用2.0 | Web3.0 dApp 开发(四) 值的存取应用1.0 | Web3.0 dApp开发(三) Scaffold-eth 快速上手 | Web3.0 dApp 开发(二) eth.build 快速上手 | Web3.0 dApp 开发(一) 1 小时理解比特币系统 【NonceGeek Workshop 0x01总结】基于链上数据生成游戏地图 Remix 完全本地化部署 NFT:实体与虚拟载体的主与辅 | 狗哥的元宇宙思辨(一) Web3Camp 内容大全@NonceGeek 用 Python 创建一条 Pow 区块链(上) 区块链与共识机制演变史 基于 Etherscan 实现 Blockchain Syncer 【论文分享】去中心化社会:寻找 Web3 的灵魂(上) 【论文分享】去中心化社会:寻找 Web3 的灵魂(下) Ted Yin | 2021 年的区块链基础设施将是什么? 0. 公链、联盟链与分布式未来(全文) 基于 Infura 与 Web3py 部署调用 Hello 合约全过程 | 以太坊开发极速入门 太上中的基因设计与Binary | 函数式与区块链(一) 理解以太坊合约数据读取过程 | 函数式与区块链(二) Hello, Ink! | 用 Rust 写智能合约(一) Mapping 数据结构 | 用 Rust 写智能合约(二) 用 Rust 程序和 Webase 交互 | Rust 学习笔记(四) 用 Sqlite 存储 WeId | Rust 学习笔记(五) 链上注册WeId与错误处理 | Rust 学习笔记(六) WeId 链上创建与本地存储的完整闭环 | Rust 学习笔记(七) 以太坊上的核心开发者 Austin | 以太坊上的最佳开发实践 1. FISCO BCOS 开发环境节点搭建全攻略 伪代码简述 ECDSA 签名过程 | 联盟链开发 WeIdentity 源码分析 | 狗哥解码 WeIdentity 源码分析 | 狗哥解码 FISCO BCOS 介绍 | 联盟链开发 给Remix升个级 | 联盟链开发 2. 控制台的安装与使用 3. 【实验】补全一个区块链应用 4. 控制台的Web化 5. Web化控制台2.0:打造团队共用区块链学习平台 6. 使用脚手架快速搭建 Java DApp 【视频+文字】分布式思维 Rebuidl RSS (EN)

6. 使用脚手架快速搭建 Java DApp

  • 李大狗
  • 发布于 2021-04-27 15:43
  • 阅读 6433

人生苦短,我用脚手架

注:本文对「如何快速构建区块链应用?这款脚手架支持一键生成」一文有所参考。

链接:https://mp.weixin.qq.com/s/WUZzFwTJUtgDD3mnIlPstQ

区块链应用开发有多种模式,分别适配于不同的项目。如:

  • 开启一个节点前置服务,区块链应用访问节点前置服务;
  • 使用针对该语言的SDK,如Java SDK、Python SDK 等;
  • 通过脚手架自动生成项目。

本文将介绍第三种方式——通过脚手架生成项目。

这种方式适用于:

  • 刚上手区块链开发,但是想快速实现区块链项目的同学
  • 想快速开展项目开发,不想在非业务层以外的代码上投入太多成本的同学

1 FISCO BCOS 应用开发脚手架简介

一个典型的区块链应用项目后端,可以分为三块。业务逻辑部分由用户自行定义;代码部分包含了智能合约访问的功能,例如函数入参的封装、交易的构造和推送、链的访问等;资源部分则包含了合约、ABI、BIN。如下图所示:

640wx_fmtpngtpwebpwxfrom5wx_lazy1wx_co1.png

应用开发脚手架组件允许用户在写好智能合约的基础上,将智能合约转换为一个SpringBoot项目,这个项目已经涵盖了上图中蓝色和绿色的部分,用户只需要补充自己的业务逻辑即可,不必再去关心区块链访问的细节,大大缩短了开发时间。

脚手架组件关键特性

一键生成

用户在开发完智能合约后,可以将智能合约直接拖入脚手架,只要轻量配置,就可以生成相关项目。并且,生成的项目已经包含了智能合约访问的必要逻辑。此外,该项目是SpringBoot项目,相关的配置、服务均已纳入到spring容器当中。

高度封装

脚手架在生成项目时,会对合约调用逻辑做高度的封装,用户可以像使用ORM框架操作数据库一样地操作智能合约。

在生成的项目中,每个合约都被单独封装到一个类中,每个函数对应合约的一个函数。其输入是java类型的输入,输出也是已解析的输出。此外,对于函数的输入参数,我们也已生成了相关的模型类,方便用户使用。

轻量配置

用户在将智能合约拖入脚手架后,只需做少量的涉及项目名称、组名、合约选择器等内容的配置即可。而且这些配置依据“契约优于配置”的原则设置了默认值,用户可根据自己的实际需要进行调整。

合约可选

在开发具有一定复杂度的智能合约时,出于易升级、松耦合的目的,开发者通常会采用一定的手段将合约功能解耦,拆散到不同的合约中去。所以,在一组智能合约中,真正供外部访问的合约只占少数,多数合约都仅作为功能性合约来支撑整体业务。

而且,在后续应用开发时,真正需要开发的服务类也占少数。为了让项目聚焦在所需要的合约上,开发者可配置合约选择器,即指定所需要处理的合约,继而脚手架只会为这些合约生成相应的代码,避免了冗余代码。

2 快速实践

2.1 从 Github 或者 Gitee 获得脚手架源码

git clone https://gitee.com/WeBankBlockchain/SmartDev-Scaffold.git # Gitee
# git clone https://gitee.com/WeBankBlockchain/SmartDev-Scaffold.git # Github
cd SmartDev-Scaffold

2.2 编译项目

确保环境适配:

依赖软件 说明 备注
Java >= JDK[1.8] 最好用JDK 1.8
Solidity 0.4.25
Git 下载安装包需要使用Git
Gradle 大于6 小于7 使用gradle7会报错

编译:

gradle build -x test

image-20210425144724949

2.3 通过脚手架生成项目

进入tools文件夹:

cd tools

2.3.1 合约配置

本示例中,使用默认的 HelloWorld 合约。实际使用过程中,可删除contracts 目录下的默认合约,并将自己的业务合约拷贝到该目录下。

2.3.2 项目配置

可以在config.ini中做项目配置,如下:

### 项目名称
artifact=demo
### 组名称
group=org.example
### 所支持的合约列表,通常为空即可
selector=

2.3.3 运行脚手架

chmod +x run.sh & bash run.sh

运行成功后,tools 目录下会出现demo文件夹,这是自动生成的 SpringBoot 项目。

image-20210425145544315

4 准备工作

假定我们的区块链节点已经启动了(搭链可见:[TODO])。

image-20210425150106835

在进行具体业务逻辑开发前,我们还需要做如下几项工作:

  • 部署合约
  • 证书拷贝
  • 补充配置文件

4.1 通过WebaseFront部署合约

(1)启动 WeBaseFront

此处我们通过 WeBaseFront 来进行部署。

简介:WeBASE-Front是和FISCO-BCOS节点配合使用的一个子系统。此分支支持FISCO-BCOS 2.0以上版本,集成web3sdk,对接口进行了封装,可通过HTTP请求和节点进行通信。另外,具备可视化控制台,可以在控制台上开发智能合约,部署合约和发送交易,并查看交易和区块详情。还可以管理私钥,对节点健康度进行监控和统计。

文档地址:https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-Front/README.html

通过如下命令启动:

bash start.sh

image-20210425150749701

然后访问:

http://localhost:5002/WeBASE-Front/#/contract

(2)创建测试账户

首先我们创建一个测试用户。

合约管理 > 测试用户 > 新增用户

image-20210425151514097

然后将其信息导出。

image-20210425151546294

将下载的内容打开,把私钥复制出来:

image-20210425151640658

(3)录入合约

打开「合约管理 > 合约 IDE」,将刚才复制出来的合约代码通过合约IDE添加进来:

image-20210425151901330

(4)保存、编译、部署

然后我们会得到合约地址(contractAddress),我们把它复制出来。

现在我们有了一个链上的HelloWorld合约,并拿到了一个账户私钥和一个合约地址。

4.2 复制证书文件到Conf目录下

conf目录位置:

/src/main/resources/conf

通过cp命令复制:

cp ~/fisco/nodes/127.0.0.1/sdk/* src/main/resources/conf/
# 此处按节点具体位置进行调整

4.3 补充配置文件

要修改的地方如下所示:

### Required
### (1)此处改为节点地址+端口
system.peers=127.0.0.1:20200
### Required
system.groupId=1
### Optional. Default will search conf,config,src/main/conf/src/main/config
system.certPath=conf,config,src/main/resources/conf,src/main/resources/config
### Optional. If don't specify a random private key will be used
### (2)此处改为 4.1 中拿到的私钥
system.hexPrivateKey=e5a34796608dcc9462af7de1d282dd7e4a1b0e421b81af7a904847e2f9f7f781
### Optional. Please fill this address if you want to use related service
### (2)此处改为 4.1 中的合约地址
system.contract.helloWorldAddress=0xf6035ce1d6b1b689e25bc2893179c00fbac2645a
### ### Springboot server config
server.port=8080
server.session.timeout=60
banner.charset=UTF-8
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8

4.4 编译与运行

gradle build -x test

进入dist目录运行程序:

cd dist
java -jar demo-exec.jar

运行成功会显示程序顺利启动:

image-20210425164817351

5 添加业务逻辑

src/main/java/org/example/demo/service目录下新建HelloController.java文件。

内容为:

package org.example.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import org.example.demo.service.HelloWorldService;
import org.example.demo.model.bo.HelloWorldSetInputBO;

@RestController
@RequestMapping("hello")
public class HelloController {

    @Autowired
    private HelloWorldService service;
    @GetMapping("set")
    public String set(@RequestParam("n") String n) throws Exception{
        HelloWorldSetInputBO input = new HelloWorldSetInputBO(n);
        return service.set(input).getTransactionReceipt().getTransactionHash();
    }

    @GetMapping("get")
    public String get() throws Exception{
        return service.get().getValues();
    }
}

这个文件的作用是创建两个url,一个是/hello/set,设置name的值,一个是/hello/get,拿到name的值。

我们重新编译项目:

gradle build -x test

然后我们重新运行项目:

cd dist
java -jar demo-exec.jar

再打开另一个终端(或直接打开浏览器),通过 curl 命令即可通过url与智能合约进行交互:

curl http://127.0.0.1:8080/hello/get
curl http://127.0.0.1:8080/hello/set\?n\=happy
curl http://127.0.0.1:8080/hello/get

image-20210425170022278

点赞 4
收藏 1
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论