【12】智能合约开发入门
-
12-1 在线合约开发
Cloud IDE简介
基本框架
Cloud IDE是BaaS合约平台提供的在线合约开发工具
IDE是一个去中心化应用(Dapp),通过JavaScript SDK直接与区块链平台通信,进行合约部署和调用

核心功能
合约工程管理
合约编辑与编译
合约部署和调用
自动编解码
合约单步调试
合约分析
Cloud IDE入口一
BaaS平台的合约工程页面

Cloud IDE入口二
BaaS平台新手引导中的合约体验链卡片

合约工程管理
合约工程管理是左侧导航栏中第一个功能模块,提供如下功能:
- 添加文件夹
- 添加文件
- 拖拽、移动文件或文件夹
- 删除文件或文件夹

下载源代码
Cloud IDE提供“下载源代码”按钮
所有工程的源代码下载打包成contract.zip文件
本地编辑开发,备份

合约部署和调用
使用Cloud IDE开发合约的过程分为以下5步:
- 选择目标合约链
- 编译合约
- 部署合约
- 调用合约
- 调试合约
选择目标合约链
- 选择“合约体验链”,该体验链配置默认测试账户。也可以使用通过SDK创建的账户,需要填入账户名和私钥(解密后的16进制字符串,长度32 byte)

- 选择“自定义”,需要配置目标链环境的一个节点(host和端口),目前Cloud IDE仅支持通过http协议和链通信,同时填写一个部署、调用合约的账户信息,此账户必须已在目标合约链上创建完成。

编译合约
- 字节码
- 合约代码的编译结果,通过SDK可以将字节码部署到目标生产链
- 合约接口说明(ABI)
- 应用程序二进制接口(Application Binary Interface,ABI)可以理解为合约的接口说明
| 参数 | 说明 |
|---|---|
| name | 函数名称 |
| type | 方法类型,包括function、constructor、fallback(缺省方法),默认为function |
| constant | 布尔值,如果为true,则表示方法不会修改合约字段的状态变量 |
| payable | 布尔值,表示方法是否可以接收系统转账 |
| stateMutability | 状态类型,包括pure(不读取区块链状态)、view(和constant类型一样,只能查看,不会修改合约字段)、nonpayable(和payable含义一样)、payable(和payable含义一样) |
| inputs | 数组,描述参数的名称和类型。 |
| name | 参数名称 |
| type | 参数类型 |
| outputs | 和inputs一样,如果没有返回值,缺省是一个空数组 |
部署合约
- 单击“部署合约”将合约部署到目标链
- 如果合约定义了constructor方法,需要给定constructor方法的参数
- 部署成功后,可以看到合约的方法列表
调用合约
单击目标方法右侧的“调用合约”进行调用
状态变量的调用返回状态变量的值
合约方法返回如下字段:
| 参数 | 说明 |
|---|---|
| Input | 合约方法的输入数据,通常为合约方法的参数。 |
| Output | 合约方法的返回值,可能是多个值,根据返回值具体类型转码显示 |
| log | 如果在合约中使用了Event事件,并且事件被触发,则会在log中展示 |
日志调试合约
通过Event事件触发日志对合约内部逻辑进行调试

合约单步调试
合约调试模块可以通过一个内置的EVM虚拟机模拟器来模拟执行Solidity合约,并给出执行结果,以此达到调试合约的目的。
调试过程如下:
- 编译/部署
- 调用目标合约生成执行的交易hash
- 调试详情单击“调试”
- 单步调试
合约安全检测
合约安全检测平台通过Cloud IDE的插件方式集成到IDE功能中
- 创建任务
- 查看检测报告
- 合约统计信息
- 安全问题
开发C++合约
蚂蚁区块链平台在支持Solidity的同时,也支持C++合约语言
不同合约语言运行的虚拟机环境不同
Cloud IDE环境下solidity和C++的功能对比:

开发TEE硬件隐私合约链
目标合约链选择TEE硬件隐私合约链
目前TEE硬件隐私合约链的加密交易仅支持solidity合约语言

对于TEE硬件隐私合约链,Cloud IDE会显示TEE加密配置
通过“TEE加密配置”可选择是否“启用TEE加密”
选择自定义AES密钥,或单击“生成密钥”随机生成密钥

如果一个合约是在“启用TEE加密”情况下部署,只有AES密钥才能成功调用此合约
进而只有AES密钥才能解密调用合约的结果

12-2 本地开发
12-2-1 本地开发环境搭建
申请区块链证书
连接到区块链平台,需要以下三个相关文件和一个密码
按照本节操作说明生成证书文件,引导过程中记录相关密码,并下载自动生成的文件。
| 文件 | 说明 | 来源 |
|---|---|---|
| ca.crt | 合约链的认证CA | BaaS平台下载 |
| client.key | RSA密钥 | 通过BaaS申请证书引导在线生成 |
| client.crt | RSA证书,与client.key是一对 | 通过BaaS申请证书引导在线生成 |
| 密码 | client.key文件的解密密码 | 证书生成过程中输入 |
可以为联盟内的链或合约体验链申请证书,本节以合约体验链为例讲解操作步骤。
首先登录BaaS平台控制台,如果目标是联盟链,选择目标联盟,左侧导航栏点击联盟内的链,右侧选择区块链
如果是合约体验链,进入区块链实验室,单击合约体验链上的 开发组件及证书 > 创建证书 按钮

生成证书和密钥。BaaS平台提供“自动生成密钥和证书(密钥非托管)”和“手动生成密钥和证书”两种方式。推荐使用安全、便捷的自动生成方式。

若选择 自动生成密钥和证书(密钥非托管),需完成以下步骤:

若选择 手动生成密钥和证书,需要上传证书请求文件(如何生成“证书请求文件”见第3节)

证书创建之后,进入区块链实验室界面可以下载证书和签名证书
不再有下载私钥client.key选项

创建账户
在合约链上提交交易,需要使用一个已经在链上存在的账户。账户可以通过BaaS平台申请创建
单击合约体验链上的 更多 > 创建账户 按钮

BaaS平台提供 自动生成密钥和证书 和手动生成密钥和证书 两种方式创建账户。推荐使用安全、便捷的自动生成方式。

若选择 自动生成密钥和证书(密钥非托管),需完成以下步骤:

若选择 手动生成密钥和证书,需要填写账户名称、公钥及恢复公钥(如何生成公钥见第3节)
单击 创建账户

账户私钥文件的三种使用场景:
| 区块链开发工具 | ||
|---|---|---|
| 场景一 | ChainStack Myfish | 直接使用user.key |
| 场景二 | JS SDK | user.pem |
| 场景三 | Cloud IDE 设置目标链,使用创建的账户和私钥 | 解密之后的HEX字符串,长度32字节 |
账户私钥文件user.key转换成user.pem需要执行以下openssl命令

账户私钥文件user.key为加密格式,不能用于Cloud IDE切换账户时的私钥,需要转换成32字节的解密私钥。解密方法可以使用openssl命令,或者采用蚂蚁区块链提供的JS SDK去解析user.pem

本地生成证书请求和公私钥对
“证书请求文件”生成方法一:使用OpenSSL
- 前往OpenSSL下载页面,找到1.0.2o版本并下载安装包
- 使用OpenSSL制作私钥和证书请求文件
- openssl req -newkey rsa:2048 -keyout client.key -out client.csr
在该命令执行过程中,系统会要求您填写如下信息:
- Country Name(2 letter code):使用国际标准组织(ISO)国码格式,填写2个字母的国家代号,如中国填写CN。
- State or Province Name(full name):省份,例如填写Zhejiang。
- Locality Name(eg,city):城市,例如填写Hangzhou。
- Organization Name(eg,company):组织单位,例如填写公司名的拼音。
- Organizational UnitName(eg,section):部门名称,例如填写IT Dept。
- Common Name(eg,your websites domain name):进行SSL加密的网站域名。
- Email Address:邮箱地址,选填。
- A Challenge password:选填。
- An optional company name:选填。
“证书请求文件”生成方法二:使用本地密钥服务
- 准备Java运行环境,1.7版本以上
- 下载密钥生成工具,https://baas-public.oss-cn-shanghai.aliyuncs.com/baas-crypto-tool-1.0.0.jar
- 运行命令启动密钥服务
- java -jar baas-crypto-tool-1.0.0.jar --server.port=8080
- 在浏览器中访问 http://localhost:8080/api/crypto/generateTlsKey?algo=rsa&isPkcs8=true&password=${password},生成tlskey.zip文件包
- 解压该zip包后得到client.key和client.csr(证书请求文件)
账户公钥、恢复公钥生成方法:使用本地密钥服务
- 同“证书请求文件”生成方法二,运行本地密钥服务
- 在浏览器中访问http://localhost:8080/api/crypto/generateUserKey?algo=ec&isPkcs8=true&password=${password},生成userkey.zip文件包
- 解压该.zip包后得到user.key和pub.txt。其中,user.key为账户私钥,pub.txt为账户公钥。
- 使用不同密码在浏览器中再次访问上述URL
- 解压新zip包后得到user.key和pub.txt。其中,user.key为账户恢复私钥,pub.txt为账户恢复公钥。
查看区块链节点信息
为了与合约链交互,需要获取节点的IP地址和端口号。
在BaaS平台,通过查看目标合约链详情,在区块浏览器中查看节点详情可获取链节点的IP地址和端口号。

12-2-2 本地开发
Solidity合约开发
蚂蚁链合约平台支持Solidity语言来实现合约的编写和编译
蚂蚁链提供在线工具Cloud IDE和本地solc-js编译工具
本地开发步骤:
- 下载/安装solc-js
- 合约开发
- 合约编译
合约编译工具
下载solc-js
从蚂蚁链网站获取合约编译工具solc-js安装包:alipay-solc-0.1.12.tgz
蚂蚁链对Solidity语言的支持和原生的Solidity不同,不能使用外部社区的solc-js编译工具
安装solc-js
下载并安装Node.js(推荐版本:v10.11.0)
全局安装solc-js。执行命令 npm i -g alipay-solc-0.1.12.tgz
使用solc-js
命令行语法:Usage:solcjs[options]<FILENAME>
| 命令选项 | 说明 | 类型 |
|---|---|---|
| --version | 显示版本号 | 布尔 |
| --optimize | 启用字节码优化器 | 布尔 |
| --bin | 十六进制合约的二进制 | 布尔 |
| --abi | 合约接口说明 | 布尔 |
| --standard-json | 打开标准JSON输入或输出模式 | 布尔 |
| --output-dir, -o | 合约输出的目录 | 字符串 |
| --help | 显示帮助信息 | 布尔 |
编译示例
- 创建名为hello.sol的solidity合约示例

- 运行以下命令行,编译hello.sol合约并得到编译字节码结果
- solcjs --bin hello.sol

- 运行以下命令行,编译hello.sol合约并得到合约接口说明(ABI)
- solcjs -- abi hello.sol

JS代码中编译合约
- 创建目录solcjs-test,执行npm init,将alipay-solc-0.1.12.tgz文件放到solc-test目录
- 运行以下命令行,在solc-test目录中安装solc-js
- npm i alipay-solc-0.1.12.tgz -save
- 代码中编译合约,创建index.js文件。内容如下:

示例

合约部署、升级、调用
在JS代码中编译Solidity合约后,得到编译字节码和合约接口说明(ABI),进而可直接使用JS SDK来部署、调用合约
solc-js工具在JS代码中默认也使用 --bin 参数编译合约得到字节码,此字节码不能直接用于合约升级,但是通过一次“本地合约部署”之后即可得到 runtime 字节码,用于合约升级使用
二进制solc编译工具同时支持 --bin -runtime 和 --bin 参数,这两个参数在编译结果上的主要差异在于,--bin参数编译字节码除了包含--bin-runtime参数的编译字节码结果之外,还包含合约初始化方法constructor的相关字节码等内容
C++合约开发
蚂蚁区块链智能合约平台提供一套基于C99/C++14标准的C++语言子集作为合约语言。
通过编译工具(mychain.mycdt)将合约代码编译成wasm字节码,由合约平台区块链节点解释执行。
开发步骤:
- 准备环境
- 编写普通C++合约
- 编译合约
- 构建静态库
- 合约部署
- 合约调用
- 合约测试
准备环境
蚂蚁区块链平台提供C++编译工具mychain.mycdt
- mychain.mycdt将合约代码编译成wasm代码
- Linux平台,下载安装包MYCDT-2.24.2-Linux-x86_64.tar.gz
- 执行tar命令解压
- 修改PATH环境变量
- 执行my++ -version命令,验证是否安装成功
普通wasm合约
编辑hello.cpp,引入需要的头文件<mychainlib/contract.h>
编写简单测试合约

my++
执行命令 my++ -o hello.wasm hello.cpp
如果编译成功,可以得到以下三个文件
- hello.wasm:合约的wasm字节码文件
- hello.abi:合约的abi定义文件
- hello.wasc:合并字节码和ABI的文件

构建静态库
静态库会链接进目标文件
使用MYCDT提供的工具,将一组源文件编译打包成一个wasm静态库,供合约使用
如果编写两个C++源文件foo.cc和bar.cc,分别定义一些工具函数,函数接口统一声明在头文件foobar.h
用以下命令编译,打包成静态库foobar.a
- my++ -c foo.cc bar.cc
- llvm -ar rcs foobar.a foo.o bar.o
如果要使用该静态库,只需包含头文件foobar.h,然后编译时指定静态库即可
- my++ main.cc foobar.a -o contract.wasm
12-3 ChainStack框架开发
ChainStack简介
基于蚂蚁链的区块链应用技术图谱,ChainStack从框架与服务角度出发,打造服务于区块链应用的框架
特点
- 一套智能合约框架
- 一套可复用的应用组件
- 一套完整的DApp应用工具链
ChainStack环境申请
开发者体验链可以通过BaaS Rest交易网关进行访问
访问BaaS Rest有相应的权限验证机制
访问之前,需要在开发者实验室完成以下申请
- Access Key
- Access Secret
- 链上账户
步骤一
登录开发者实验室,进入 开发者实验室 -> 应用开发工具 页面

通过立即申请或重置可以获得Access-id和Access.key

步骤二
创建发送链上交易所需的区块链账户

填写账户名称、私钥密码和恢复私钥密码
创建完成后下载账户的公私钥对以及恢复公私钥对
可以通过再次点击“立刻申请”创建新的账户

安装依赖软件
JDK版本 >= 1.8,(下载地址:https://openjdk.java.net/install/)
Maven版本 >= 3.2.5 (下载地址:https://maven.apache.org/download.cgi)

安装cstack工具
cstack是智能合约研发命令行工具,通过该工具可以完成cstack工程的创建、编译、测试、三方包管理、标准组件导出等功能。
- 下载ChainStack安装包,解压安装包
- 进入安装包目录,执行bash install_nix.sh && source ~/.chainstack/env
- 执行成功后检查安装

一键创建简单wasm合约工程
执行命令 cstack quickinit Demo 创建名为Demo的合约项目

网络环境配置
打开project-setting.yaml,填入“环境申请”得到的账户信息和BaaS Rest访问信息

一键运行合约
运行测试用例
执行命令 cstack test 运行测试用例
编译合约
执行命令 cstack build,合约模块会编译出智能合约字节码
字节码需要部署到区块链上,通过交易触发才能执行

DApp工程结构
cstack quickinit 会生成一个DApp工程,包含两个模块
- 合约模块:contract目录为合约模块,含有一个智能合约
- Java集成测试模块:test/ittest目录为Java测试模块,这是一个标准Maven工程,里面自动生成一个测试用例

相关文章:
【12】智能合约开发入门
12-1 在线合约开发 Cloud IDE简介 基本框架 Cloud IDE是BaaS合约平台提供的在线合约开发工具 IDE是一个去中心化应用(Dapp),通过JavaScript SDK直接与区块链平台通信,进行合约部署和调用 核心功能 合约工程管理 合约编辑与编…...
web安全——分析应用程序
文章目录 一、确定用户输入入口点二、确定服务端技术三、解析受攻击面 一、确定用户输入入口点 在检查枚举应用程序功能时生成的HTTP请求的过程中,用户输入入口点包括: URL文件路径 通常,在查询字符?之前的URL部分并不视为用户输入入口&am…...
Wpf 之Generic.xaml
在 WPF 中,Generic.xaml 是一个特殊的资源文件,它会被自动加载,不需要显式添加。这是 WPF 的命名约定。当 WPF 初始化自定义控件时,它会专门查找这个名字的文件。 这个名字是硬编码在 WPF 框架中的,不能改变。 Generi…...
VidSketch:具有扩散控制的手绘草图驱动视频生成
浙大提出的VidSketch是第一个能够仅通过任意数量的手绘草图和简单的文本提示来生成高质量视频动画的应用程序。该方法训练是在单个 RTX4090 GPU 上进行的,针对每个动作类别使用一个小型、高质量的数据集。VidSketch方法使所有用户都能使用简洁的文本提示和直观的手绘…...
解锁C# XML编程:从新手到实战高手的蜕变之路
一、引言:XML 在 C# 中的关键地位 在 C# 开发的广袤领域中,XML(可扩展标记语言,eXtensible Markup Language)宛如一颗璀璨的明星,占据着举足轻重的地位。它以其独特的结构化和自描述特性,成为了…...
kafka-leader -1问题解决
一. 问题: 在 Kafka 中,leader -1 通常表示分区的领导者副本尚未被选举出来,或者在获取领导者信息时出现了问题。以下是可能导致出现 kafka leader -1 的一些常见原因及相关分析: 1. 副本同步问题: 在 Kafka 集群中&…...
超大规模分类(四):Partial FC
人脸识别任务里,通常利用全连接层,来做人脸的分类。会面临三个实际问题: 真实的人脸识别数据噪声严重真实的人脸识别数据存在严重的长尾分布问题,一些类别样本多,多数类别样本少人脸类别越来越多,全连接层…...
uniapp 小程序如何实现大模型流式交互?前端SSE技术完整实现解析
文章目录 一、背景概述二、核心流程图解三、代码模块详解1. UTF-8解码器(处理二进制流)2. 请求控制器(核心通信模块)3. 流式请求处理器(分块接收)4. 数据解析器(处理SSE格式)5. 回调…...
因子分析详解:从理论到MATLAB实战
内容摘要: 本文系统解析因子分析的核心原理与MATLAB实战,涵盖数学模型、载荷矩阵估计、因子旋转及得分计算。通过上市公司盈利能力、消费者偏好等案例,演示数据标准化、因子提取与解释的全流程,并提供完整代码实现。深入对比因子分…...
【组态PLC】基于三菱西门子S7-200PLC和组态王液料混合系统组态设计【含PLC组态源码 M016期】
控制要求 总体控制要求:如面板图所示,本装置为三种液体混合模拟装置,由液面传感器SL1、SL2、SL3,液体A、B、C阀门与混合液阀门由电磁阀YV1、YV2、YV3、YV4,搅匀电机M,加热器H,温度传感器T组成。…...
js:根据后端返回的数组取出每一个数组的keyword字段然后拼接成一个逗号分隔的字符串
问: 现在有一个el-select, 后端接口返回数据为keyword:xxx,referenceNum:1,tagId:132sf32fasdfaf组成的数组, 现在select是多选, 但是但我选择多个下拉框选项后,后端需要前端返回的数据tagIds字段需要时一个字符串…...
基于大模型的肺纤维化预测及临床方案研究报告
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与方法 二、大模型技术概述 2.1 大模型的基本原理 2.2 大模型在医疗领域的应用现状 三、肺纤维化相关知识 3.1 肺纤维化的病因与发病机制 3.2 肺纤维化的临床症状与诊断方法 3.3 肺纤维化的治疗现状与挑战 四、大模型…...
7. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--Ocelot 网关--路由
路由是API网关的核心功能,对系统性能和可靠性至关重要。路由通过定义规则,将客户端请求准确地转发到相应的后端服务,确保请求能够正确处理,简化了微服务架构中的服务调用逻辑。有效的路由配置能够提高系统的灵活性和可维护性。 一…...
【GESP】C++二级模拟 luogu-b3995, [GESP 二级模拟] 小洛的田字矩阵
GESP二级模拟题,多层循环、分支语句练习,难度★✮☆☆☆。 题目题解详见:https://www.coderli.com/gesp-2-luogu-b3995/ 【GESP】C二级模拟 luogu-b3995, [GESP 二级模拟] 小洛的田字矩阵 | OneCoderGESP二级模拟题,多层循环、分…...
监督学习——基于线性回归的波士顿房价预测:理论、实践与评估
基于线性回归的波士顿房价预测:理论、实践与评估 文章目录 基于线性回归的波士顿房价预测:理论、实践与评估一、引言二、线性回归基础理论2.1 线性回归原理2.2 线性回归在房价预测中的应用逻辑三、波士顿房价数据集介绍3.1 数据集概述3.2 特征说明3.3 目标变量四、波士顿房价…...
Selenium 调用模型接口实现功能测试
要使用 Selenium 调用模型接口实现功能测试,可按以下步骤进行: 1. 环境准备 安装 Selenium:使用 pip install selenium 安装 Selenium 库。安装浏览器驱动:根据使用的浏览器(如 Chrome、Firefox 等)下载对应的驱动,并将其添加到系统的环境变量中。例如,Chrome 浏览器需…...
回调函数的用法
回调函数的基本用法 回调函数是一种被作为参数传递给另一个函数的函数,接收回调函数作为参数的函数在合适的时候会调用这个回调函数。回调函数为代码提供了更高的灵活性和可扩展性,下面为你详细介绍回调函数的基本用法。 基本概念 回调函数的核心在于函…...
springboot实现文件上传到华为云的obs
一、前言 有时在项目中需要使用一些存储系统来存储文件,那么当项目要接入obs作为存储系统时,就会利用obs来进行文件的上传下载,具体实现如下。 二、如何通过obs实现文件的上传下载? 1.添加相关的obs的maven依赖。 <dependency…...
南京布局产业园剖析:成都树莓集团的战略逻辑
在数字产业飞速发展的当下,成都树莓集团在南京布局产业园,这一举措蕴含着深刻的战略考量,是基于对市场环境、产业趋势以及自身发展需求的综合研判。 一、政策利好与发展机遇 南京作为长三角地区的重要城市,在数字经济发展方面享有…...
C++ QT 6.6.1 QCustomPlot的导入及使用注意事项和示例 | 关于高版本QT使用QCustomPlot报错问题解决的办法
C QT 6.6.1 QCustomPlot的导入及使用注意事项和示例 | 关于高版本QT使用QCustomPlot报错问题解决的办法 记录一下 qmake .pro文件的配置 QT core gui printsupportgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compil…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
