【13】智能合约进阶

13-1 SDK应用集成

13-1-1 蚂蚁链应用集成概述

蚂蚁区块链介绍

蚂蚁区块链通过引入P2P网络、共识算法、虚拟机、智能合约、密码学、数据存储等技术特性,构建一个稳定、高效、安全的图灵完备智能合约执行环境,提供账户的基本操作以及面向智能合约的功能调用。基于蚂蚁区块链提供的能力和功能特性,应用开发者能够完成账户创建、合约调用、结果查询、事件监听等。

蚂蚁区块链应用开发流程

在使用蚂蚁链进行区块链应用开发过程中需要开发智能合约和应用两部分内容,系统描述区块链应用开发的基本业务流

区块链应用架构模式

应用开发场景主要有以下3种方式,可以根据具体应用场景进行选择

  1. 前端(浏览器、移动端App或命令行工具)使用直连方式直接链接区块链节点。该方式去掉了中间的后端服务,更加透明,比较适合轻量级的合约调用、查询等操作。
  2. 前端(浏览器、移动端App或命令行工具)访问中间件服务(蚂蚁链交易网关Rest、Infura、Alchemy),通过中间件服务间接访问区块链节点
  3. 与传统web应用开发相似,访问后端服务(Service),后端服务集成SDK(Java/JS/C++)和蚂蚁区块链节点交互。该方式适合与传统的业务系统结合,在后端服务层实现一些比较重要的业务逻辑和计算任务

蚂蚁区块链应用开发核心

链上智能合约开发和链下应用开发

蚂蚁区块链应用开发智能合约合约类型Solidity合约
wasm合约
开发工具Cloud IDE
Chain Stack
链下应用集成SDK集成Java集成
C++集成
JavaScript集成
Rest API集成

蚂蚁区块链SDK核心逻辑

SDK客户端使用TLS双向认证,确保接入安全

比特币、以太坊吧共识和交易执行混合在一起。蚂蚁链先执行共识,节点共识是基于列表和顺序,共识后各节点再执行交易。

蚂蚁链应用的开发SDK类型

为适应不同的开发环境,蚂蚁链提供三种语言SDK支持

SDK类型功能特性说明
Java功能最丰富,覆盖蚂蚁链的所有功能适合应用于后端服务层
C++功能丰富,与 Java SDK类似比较适合与传统C++服务相结合
JavaScript覆盖基本的常用的API,支持Node.js和浏览器环境运行,不支持国密算法适合客户端web应用集成

13-1-2 蚂蚁链SDK快速集成

蚂蚁区块链Java SDK介绍

蚂蚁区块链合约平台Java SDK是通过服务(Service)的形式对外提供功能,SDK提供以同步或异步方式发送交易、查询交易、订阅事件等接口

蚂蚁区块链Java SDK开发环境准备

Java SDK依赖JDK、Maven、Netty特定版本

JDK 7及以上版本:在终端运行 Java-version 查看当前Java版本

Maven 3.5.4及以上版本:在终端运行 mvn-v 查看当前Maven版本

SDK的jar包依赖Netty,不同的运行系统需要选择不同的Netty依赖包配置到Maven文件

Maven文件中引入SDK包

安装下载的jar包到项目目录

命令终端进入到项目目录,执行下图命令

准备SSL连接文件和账本私钥文件

与BaaS平台建立SSL连接,需准备三个证书文件:CA机构的根证书(trustCA)、客户端的证书文件(client.crt)和客户端的私钥文件(client.key)

提交交易还需要账户的私钥文件(user.key)

文件名称文件说明文件来源
client.crt客户端的证书文件通过前往BaaS控制台,创建证书后,返回对应下载地址。
client.key客户端的私钥文件通过前往BaaS控制台,创建证书后,返回对应下载地址。
trustCA存储CA证书的trustStore通过前往BaaS控制台,创建证书后,返回对应下载地址。
user.key账户私钥文件通过前往BaaS控制台,创建证书后,返回对应下载地址。需保存好文件,遗失无法恢复!

蚂蚁区块链证书申请

以蚂蚁区块链合约体验链为例申请证书

  1. 产品与服务 > 区块链 > BaaS平台 进入BaaS平台,单击页面上方 区块链实验室,进入BaaS区块链实验室 引导页
  2. 创建客户端证书
  3. 下载SDK、根证书、客户端签名证书

蚂蚁区块链创建账户

以蚂蚁区块链合约体验链为例申请证书

  1. BaaS平台提供 自动生成密钥和证书 和 手动生成密钥和证书 两种方式创建账户。推荐使用安全、便捷的自动生成方式
  2. 选择自动生成密钥和证书的生成方式后,根据页面提示填写相关信息创建账户
  3. 下载私钥、公钥对及恢复私钥、公钥对。私钥只有一次下载机会,务必妥善保存

SDK应用集成编写

Idea开发环境创建蚂蚁链项目
  1. 创建Maven项目
  2. 导入客户端证书和账户密钥文件到resource目录
  3. Pom.xml添加蚂蚁链jar包依赖
配置接入环境,初始化SDK
  1. 配置客户端SSL密码、接入账户密码、合约链IP、端口
  2. 初始化蚂蚁链接入、STL双向认证授权
  3. 初始化SDK环境,日志出现Hand shake success表示区块链平台连接成功
通过SDK部署合约到蚂蚁区块链平台
  1. 准备合约字节码
  2. 部署合约到蚂蚁区块链
  3. result.getData().getTransactionReceipt().getResult()为0,代表交易执行成功,反之代表交易执行失败,可以通过result的值从MychainErrorCodeEnum中查找错误原因

部署合约、调用合约方法
  1. 查看合约ABI文件,了解合约函数调用参数信息
  2. 编写调用合约Issue方法的函数
  3. 编写调用合约Query方法的函数,查询某人积分

SDK应用执行流程

编译应用,执行应用,链上查询

  1. 初始化STL授权,SDK执行环境
  2. 部署合约
  3. 调用合约方法
  4. 关闭SDK

SDK应用底层密码学套件

合约链的链环境可能使用以下两种密码学套件

classic使用国际商用密码算法,包括SHA256摘要、ECC公钥算法、AES对称加密等,标准合约链默认为此套件配置。
China-sm使用中国国家商用密码算法,包括SM3摘要、SM2公钥算法、SM4对称加密等,国密算法合约链默认为此套件配置。

SDK与合约平台之间的SSL通信不受密码学套件影响,由颁发证书的PKI机构决定

13-1-3 蚂蚁链SDK接口详解

账户接口

账户模型是Mychain中的重要概念,账户地址、余额、账户权重等信息都存储在账户模型中,使用账户接口可以同步或异步的方式创建、更新账户信息。

账户模型

参数类型说明
idIdentity账户的业务ID
balancelong余额
authMapAuthMap账户或者合约的公钥和权重值
recoverKeyPublicKey恢复公钥,用于账户私钥丢失的情况
recoverTimestamplong上次成功恢复的时间
statusObjectStatus

状态,

0:Normal(正常);

1:Freeze(冻结);

2:Recovering(恢复中)

encryptionKeyString加密公钥,用来加密智能合约中的交易金额
同步创建账户createAccount

异步创建账户asyncCreateAccount

合约接口

使用合约接口可以同步、异步完成合约部署、升级、调用、冻结等操作

合约模型

参数类型说明
idIdentity账户的业务ID
balancelong余额
authMapAuthMap账户或者合约的公钥和权重值
recoverKeyPublicKey恢复公钥,用于账户私钥丢失的情况
recoverTimestamplong上次成功恢复的时间
statusObjectStatus

状态,

0:Normal(正常);

1:Freeze(冻结);

2:Recovering(恢复中)

encryptionKeyString加密公钥,用来加密智能合约中的交易金额
storageRootIdentity世界状态的默克尔哈希根
codeHashIdentity合约代码哈希
codebyte[]合约代码
合约部署

同步部署合约 deployContract

异步部署合约 asyncdeployContrac

DeployContractRequest 请求参数

参数类型说明
accIdIdentity部署合约的账户ID
contractIdIdentity合约ID
codebyte[]合约代码
vmTypeEnumvmTypeEnum虚拟机类型,默认使用evm虚拟机,后续支持其他虚拟机类型
parametersparameters合约参数
valueBigInteger合约金额

DeployContractResponse 返回参数

参数类型说明
transactionReceipttransactionReceipt交易收据
blockNumberBigInteger区块号
使用合约接口完成合约部署实践

合约调用

同步调用合约方法 callContract

异步调用合约方法 asyncCallContract

CallContractRequest 请求参数

参数类型说明
accIdIdentity部署合约的账户ID
contractIdIdentity合约ID
vmTypeEnumvmTypeEnum虚拟机类型,默认使用evm虚拟机,后续支持其他虚拟机类型
parametersparameters合约参数
valueBigInteger合约金额

CallContractResponse 返回参数

参数类型说明
transactionReceipttransactionReceipt交易收据
blockNumberBigInteger区块号
使用合约接口完成合约调用实践

同步调用合约方法

异步调用合约方法

合约升级

同步合约升级 updateContract

异步合约升级 asyncUpdateContract

UpdateContractRequest 请求参数

参数类型说明
contractIdIdentity合约ID
vmTypeEnumvmTypeEnum虚拟机类型,默认使用evm虚拟机,后续支持其他虚拟机类型
codebyte[]目标合约的字节码,采用16进制表示,无需“0x”作为前缀

合约升级时,传入的bytecode字节码为runtime字节码,如果使用二进制solc编译工具,可直接获取 --bin-runtime参数,即正常 --bin参数编译的字节码的子集。runtime字节码可通过本地执行合约部署操作来获取

UpdateContractResponse 返回参数

参数类型说明
transactionReceipttransactionReceipt交易收据
blockNumberBigInteger区块号
使用合约接口完成合约升级实践
  1. 使用二进制solc编译工具,直接获取runtime字节码
  2. 同步合约升级
合约参数对象
EVM合约参数
EVMParameter

为合约部署、调用、升级传入的参数

函数名称参数类型参数说明
setMethodSignature()String添加函数选择器,即方法与参数列表构成的字符串
getEncodedData()
addInt()BigInteger添加静态的int类型的数据
addUInt()BigInteger添加静态的uint类型的数据
addBool()Boolean添加静态的bool类型的数据
addIdentity()Identity添加静态的identity类型的数据
addString()String添加动态的string类型的数据
addBytes()Byte[]添加动态的byte类型的数据
addBytesN()Byte[]添加静态的byte类型的数据
addIntArray()List<BigInteger>添加动态的int数组类型的数据
addUIntArray()List<BigInteger>添加动态的uint数组类型的数据
addBooleanArray()List<Boolean>添加动态的bool数组类型的数据
getMethodSignature()
addStruct()struct添加struct类型参数,类似于Java集合中的List
addArray()DynamicArray添加动态数组
addIdentityArray()List<byte[]>添加Identity的byte[]集合
addBytes32Array()List<byte[]>添加32位的byte[]集合
addByte32()byte[]添加32位的byte[],必须为32位

EVMOutput

解析交易收据的logData和output

函数名称参数类型参数说明
getInt()BigInteger获取静态的int类型的数据
getUInt()BigInteger获取静态的uint类型的数据
getIdentity()Identity获取identity类型的数据
getString()String获取String类型的数据
getBytes()byte[]获取bytes类型的数据
getBytesN()byte[]获取bytes类型的数据

EVM合约编码
编码说明

EVM的参数和返回值编码规则一致,对于静态类型的变量,直接编码为32字节按顺序拼接。对应动态数据类型,则用一个32字节偏移量占住位置,所有动态数据类型的真实数据按顺序以LV的格式放在后面。其中L表示数据的实际长度,L占用32字节;V为实际数据。

编码

解析

EVM合约编码解析

其他合约接口
冻结合约

freezeContract

asyncfreezeContract

解冻合约

unFreezeContract

asyncUnFreezeContract

链上查询接口

区块头查询

区块头查询三种方式

区块头

参数类型说明
hashString区块头的哈希
versionlong版本
numberBigInteger区块号
parentHashString上一区块哈希
transactionRootString区块体中的交易构成默克尔哈希根
receiptRootString区块体中的收据构成默克尔哈希根
stateRootString世界状态默克尔哈希根
gasUsedBigInteger交易执行的总消耗量
timestamplong时间戳
logBloomString日志布隆过滤器

数据结构

Block

参数类型说明
blockHeaderBlockHeader区块头
blockBodyblockBody区块体

blockBody

参数类型说明
transactionListlist交易列表
receiptListlist收据列表
consensusProofbyte[]共识证明
交易查询 queryTransaction

调用

Transaction包含一次交易所需要的完整的信息,但不同请求类型所需的参数可能会不一样

交易模型

参数类型说明
hashString交易的哈希,由signature字段以外的所有针对构成
typetransactionType交易的类型
timestamplong交易的时间戳
nonceFixed64BitUnsignedInteger防止重放攻击
periodlong单位为毫秒,事务开始或结束的时间,为未来扩展使用
fromString交易的发送者
toString交易的接收者
valueFixed64BitUnsignedInteger转账金额
gasFixed64BitUnsignedInteger交易执行的消耗费用
databyte[]交易数据的编码
signatureListList<byte[]>签名,使用一个或多个私钥对哈希加签
groupIdFixed32BitArray交易在一个群中执行
extensionList目前用于智能合约中的证明数据
versionshort版本
查询收据 queryTransactionReceipt

调用

只有查到一个交易的收据(Receipt)才能证明出块成功,交易被确认

收据模型

参数类型说明
resultlong交易结果
gasUsedBigInteger交易执行的消耗费用
logsList交易执行的日志集合
outputbyte[]合约的输出

需通过查询交易回执获取对应output信息后解析获得合约返回值内容

通过合约event事件的参数,获取合约事件内容

事件接口

事件日志模型

参数类型说明
fromString交易的发送者
toString交易的接收者
topicsList订阅的主题,topic字段是通过16进制编码
logDatabyte[]交易产生的日志
订阅账户

监控链上账户创建、冻结事件

订阅账户listenAccount

取消订阅账户unListenAccount

订阅合约

监控链上合约创建、冻结事件、查询

订阅合约 listenContract

取消订阅合约 unListenContract

订阅主题

监控链上主题Topic事件

订阅主题 listenTopics

取消订阅主题 unListenTopics

监控链上主题Topic事件实践

事件日志触发

链上Event

监听链上IssueEvent事件

编码

订阅区块

监控链上区块创建事件

订阅区块事件 listenBlock

取消订阅区块事件 unListenBlock

监听区块事件

链上Event

原生存证接口

为方便存证场景的开发,合约平台提供原生存证交易接口以实现存证目的

同步存证交易 depositData

异步存证交易 asyncDepositData

参数模型

DepositDataRequest

参数类型说明
senderIdIdentity发起交易者的identity
receiverIdidentity目标账户identity
amountBigInteger转账金额
depositDatabyte[]待存储数据,可自定义数据内容,然后序列化存证,存证后读取数据再反序列化

DespiteDataResponse

参数类型说明
transactionReceiptTransactionReceipt交易收据
blockNumberBigInteger区块号
同步存证

存证交易,同步方式调用

链上存证数据

异步存证

存证交易,异步方式调用

链上存证数据

其他接口

SDK还提供许多与平台监控和隐私保护等相关的接口

环境接口

init用于初始化环境配置

日志接口

支持SLF4j接口和JDK原生接口

监控指标接口

账户发生交易的统计指标

发送查询请求的统计指标

每秒事务处理量的统计指标

信封交易接口

将交易放入一个独立的组中执行从而起到隐私保护的目的。智能合约平台支持部署合约、调用合约、更新合约、查询合约的信封交易

13-2 ChainStack开发框架

13-2-1 ChainStack开发框架特点及功能

ChainStack特点
ChainStack是什么

ChainStack经过对蚂蚁链内部业务的最佳实践进行挖掘、实践分享、组件沉淀探讨,提炼总结,从框架与服务出发,打造服务于区块链应用的框架。

ChainStack特点

一套智能合约框架,提供具备快速研发、组件复用、联动集成设施的智能合约框架,使得基于ChainStack特点的智能合约具备全面的生产化要素

一套可复用的应用组件,提供一站式集成区块链、智能合约、中间件的DApp应用研发框架,以及配套多种解决方案的区块链应用原型,支持业务快速搭建DApp应用。

一套完整的DApp应用工具链,涵盖开发环境自动配置、应用/合约代码自动生成、IDE适配等,覆盖DApp应用的整个生命周期

ChainStack功能

完整的DApp应用工具链

ChainStack合约框架

概览
  • 基于ChainStack框架的合约开发流程

  • 基于ChainStack框架的DApp应用开发流程

从以上两张图我们可以了解到,ChainStack框架的核心其实在于CDL合约画像,根据DCL画像中的约定,ChainStack工具可以自动生成合约代码脚手架、合约集成包,甚至是一个完整的后台服务。

  • 使用ChainStack开发智能合约的优点

复杂对象作为出入参时,免去json编解码的逻辑,直接使用框架生成的数值对象

免去做设计,直接使用框架的开发规范

免去打日志埋点,使用框架的日志对象

免去Java侧调用合约时,编写冗余的调用对象

CDL文件简介
什么是CDL?

全称为合约定义语言,Contract Definition Language

  • 合约接口画像
  • 开箱即用的合约组件
  • 链下链上联动

CDL有以下主要特性

极简合约接口定义

支持日志定义

支持自定义结构扩展

CDL文件详解

编写YAML版文件
  • 合约基础信息
必须含义举例
合约名称每个合约都需要定义一个合约名称,CDL后续会使用该名称生成合约工程及BAL工程,合约名称必须为大驼峰格式。

contract_name:

MyFirstContract

合约类型合约的类型,此选项会影响后续生成合约工程及BAL工程

contract_type:

MYCHAIN_CPPWASM

合约接口编解码方式合约接口入参编解码规则定义,当入参为复杂结构体时,将使用声明的编码规则进行通信。目前暂仅支持JSONcodec:JSON
引入其他CDL定义当业务合约比较复杂时,通常会定义大量的结构体、接口及合约事件,因此CDL提供了导入其他CDL文件的能力,可以将大型CDL文件拆分,方便管理。

imports:

-‘cdl1.yaml’

结构体CDL支持这个业务中常用的特性。结构体将通过codec定义的接口通信协议传送至合约,并在合约处自动反序列化为原始结构体

types:

Struct1:

-field1:string

-field2:uint8

  • 接口定义

CDL支持合约接口的定义

接口名称必须为大驼峰,接口入参字段及返回值字段必须为小驼峰

如果需要生成入参/返回值为void的函数,params/returns字段留空即可

示例

interfaces:

CreateAccount:

params:

        -userName:string

returns:

        -isSuccess:bool

  • 合约事件

合约事件为合约在执行过程中打印的Log事件

这些Log事件会被持久化在交易回执中的Logs字段中

示例

logs:

TransferLog:

log_data:

-requestId:string

-sender:string

-amount:uint32

13-2-2 ChainStack开发框架

13-3 预言机合约开发

13-3-1 外部数据源服务概述

13-3-2 预言机合约开发详解

13-4 TEE隐私合约开发

13-4-1 Cloud IDE 通用隐私合约链开发

13-4-2 Java SDK 通用隐私合约链开发

13-4-3 通用隐私合约设计开发

13-5 ODATS跨链服务开发

13-5-1 跨链服务原理及使用流程

13-5-2 账本数据访问服务

13-5-3 合约消息推送服务

13-6 区块链中间件

13-6-1 BaaS REST

13-6-2 BaaS数据网关

13-6-3 BMS分布式治理中间件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/978671.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

cesium 解决加载带动画的glb不播放动画问题

glb加载参考&#xff1a;cesium 添加几何对象 entity primitive_cesium.js 添加几何体-CSDN博客 使用entity方式加载的glb&#xff0c;默认会开启动画&#xff0c;但使用primitive加载的glb&#xff0c;需要手动开启动画 let modelPosition Cesium.Cartesian3.fromDegrees(..…

进程间通信(中)

对于上篇的学习&#xff0c;由于内容太多&#xff0c;我们接着继续&#xff08;上篇可点击进入查看&#xff09;进程间通信&#xff08;上&#xff09;https://blog.csdn.net/Small_entreprene/article/details/145623853?fromshareblogdetail&sharetypeblogdetail&sh…

文心一言AI创意画

介绍 文心一言是百度推出的新一代知识增强大语言模型&#xff0c;属于文心大模型家族的新成员。‌它能够与人对话互动、回答问题、协助创作&#xff0c;高效便捷地帮助人们获取信息、知识和灵感。‌ 特点 文心一言基于数万亿数据和数千亿知识进行融合学习&#xff0c;采用预训…

【读书笔记·VLSI电路设计方法解密】问题57:逻辑合成过程中插入测试的目的是什么

如第3章第20题所述&#xff0c;可测试性设计&#xff08;Design for Testability, DFT&#xff09;是创建具有商业价值的产品时需要考虑的一个非常重要的问题。为了实现DFT功能&#xff0c;使设计能够检测制造缺陷&#xff0c;需要在设计中添加额外的测试电路&#xff0c;而这些…

正则表达式–断言

原文地址&#xff1a;正则表达式–断言 – 无敌牛 欢迎参观我的个人博客&#xff1a;正则表达式特殊字符 – 无敌牛 断言assertions 1、(?...)&#xff1a;正向预查&#xff08;positive lookahead&#xff09;&#xff0c;表示某个字符串后面应该跟着什么。但这个字符串本身…

AI数据分析:用DeepSeek做数据清洗

在当今数据驱动的时代&#xff0c;数据分析已成为企业和个人决策的重要工具。随着人工智能技术的快速发展&#xff0c;AI 驱动的数据分析工具正在改变我们处理和分析数据的方式。本文将着重介绍如何使用 DeepSeek 进行数据清洗。 数据清洗是数据分析的基础&#xff0c;其目的是…

自编码器——数据降维及特征提取

目录 一.定义 二.原理 1. 编码器 2. 解码器 三.代码实现 1.步骤&#xff1a; 代码实现&#xff1a; 代码解析&#xff1a; 2.进一步优化&#xff1a; 四.应用场景 一.定义 自编码器&#xff08;Autoencoder&#xff09;是一种无监督学习的神经网络模型&#xff0c;主要用于…

stm32四种方式精密控制步进电机

在搭建完clion的开发环境后&#xff0c;我决定重写之前的项目并优化完善&#xff0c;争取做出完全可落地的东西&#xff0c;也结合要写的论文内容一同学习下去。 因此&#xff0c;首当其冲的就是回到步进电机控制领域&#xff0c;把之前使用中断溢出进行步进电机控制的方案进行…

管理后台环境配置

1. 后端配置及启动 a. 软件安装 Java sdk 1.8 maven 3.6 intellij IDEA 2024 Visual C Redistributable mongodb mysql wsl &#xff08;管理员&#xff1a;wsl --install&#xff09; redis curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/shar…

Python学习第十八天之深度学习之Tensorboard

Tensorboard 1.TensorBoard详解2.安装3.使用4.图像数据格式的一些理解 后续会陆续在词博客上更新Tensorboard相关知识 1.TensorBoard详解 TensorBoard是一个可视化的模块&#xff0c;该模块功能强大&#xff0c;可用于深度学习网络模型训练查看模型结构和训练效果&#xff08;…

DeepSeek 大模型:带火算力,重塑 AI?

在全球人工智能蓬勃发展的当下&#xff0c;各类技术与模型持续迭代更新&#xff0c;深刻影响着各个行业的发展轨迹。DeepSeek 作为其中的重要参与者&#xff0c;快速崭露头角&#xff0c;在技术创新和市场拓展方面成果显著&#xff0c;对算力市场也产生了强大的带动效应。这引发…

(21)从strerror到strtok:解码C语言字符函数的“生存指南2”

❤个人主页&#xff1a;折枝寄北的博客 ❤专栏位置&#xff1a;简单入手C语言专栏 目录 前言1. 错误信息报告1.1 strerror 2. 字符操作2.1 字符分类函数2.2 字符转换函数 3. 内存操作函数3.1 memcpy3.2 memmove3.2memset3.3 memcmp 感谢您的阅读 前言 当你写下strcpy(dest, s…

wpf中如何让TextBox 显示字体的颜色为白色

在 WPF 中&#xff0c;要让 TextBox 的字体颜色显示为白色&#xff0c;可以通过以下方法实现&#xff1a; 方法 1&#xff1a;直接设置 Foreground 属性&#xff08;XAML&#xff09; 在 XAML 中直接为 TextBox 设置 Foreground 属性&#xff0c;使用 White 颜色&#xff1a; …

小白向-python实现插入排序算法

插入排序 一、插入排序的定义 插入排序&#xff08;Insertion Sort&#xff09;是一种稳定的排序算法&#xff0c;通过构建有序序列&#xff0c;逐步将新元素插入到正确位置&#xff0c;最终完成排序。 二、插入排序的发展历史 插入排序是一种古老且直观的排序算法&#xff…

python-leetcode-最长公共子序列

1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:m, n len(text1), len(text2)dp [[0] * (n 1) for _ in range(m 1)]for i in range(1, m 1):for j in range(1, n …

mac电脑中使用无线诊断.app查看连接的Wi-Fi带宽

问题 需要检查连接到的Wi-Fi的AP硬件支持的带宽。 步骤 1.按住 Option 键&#xff0c;然后点击屏幕顶部的Wi-Fi图标&#xff1b;2.从下拉菜单中选择 “打开无线诊断”&#xff08;Open Wireless Diagnostics&#xff09;&#xff1b;3.你可能会看到一个提示窗口&#xff0c;…

什么是模型量化和模型蒸馏?

文章目录 一、模型量化二、模型蒸馏三、二者有联系吗&#xff1f;四、示例场景五、总结 一、模型量化 模型量化&#xff08;Model Quantization&#xff09;是一种优化技术&#xff0c;通过将模型的参数和计算从高精度&#xff08;如 32 位浮点数&#xff0c;FP32&#xff09;…

Asp.Net Web API| React.js| EF框架 | SQLite|

asp.net web api EF SQLiteReact前端框架 设计一个首页面&#xff0c;包含三个按钮分别对应三类用户&#xff08;数据查看&#xff0c;设计人员&#xff0c;管理员&#xff09;&#xff0c;当点击管理员的时候弹出一个前端页面可以输入信息&#xff08;以学生数据为例&#…

英文论文查重,Turnitin和IThenticate两个系统哪个更合适?

Turnitin系统和IThenticate系统都是检测英文论文的查重系统&#xff0c;但是两者之间还是有一些不一样的。 下面针对这两个系统给大家具体分析一下。 一、Turnitin系统 Turnitin检测系统&#xff1a; https://truth-turnitin.similarity-check.com Turnitin是世界上主流的…

Unity Dedicated Server 控制台 输出日志LOg 中文 乱码

现象: 中文乱码 原因: Unity打包出来的.exe文件&#xff0c;语言一栏是英文&#xff0c;VS控制台出来不一样 解决方案: 新建.bat文件 &#xff0c;并使用命令chcp 65001&#xff0c;运行时启动.bat&#xff0c;而不是.exe, 改不了exe属性&#xff0c;虽然有点奇怪&#xff…