当前位置: 首页 > news >正文

通过Moonbeam的Connected Contracts互连合约从Axelar转移Token至Centrifuge

将Moonbeam预编译智能合约功能与波卡指定技术交互,再结合Axelar通用消息传递(GMP),能够实现其他链无法完成的独特交互。阅读本文了解Connected Contracts互连合约如何通过只与单条链交互连接Axelar的EVM链发送Token至Centrifuge等DeFi平行链。

这篇文章相对更深奥,如果您尚未了解Axelar,请先阅读Axelar的概况文章和Moonbeam最近发布的关于Axelar SDK解释的文章。

Axelar合约概况

Axelar是一条连接不同区块链并传递安全跨链通信的区块链。每个Axelar网络的验证人在链上运行Axelar支持的轻节点。这个动态验证人通过监控每条链的Axelar网关合约来达成共识,以确认消息从一条链传送至另一条链。Axelar网关合约是我们在后续demo中交互的两个Axelar合约的其中一个。

图片来源于Axelar Network

另一个我们将使用的合约是Axelar Gas Receiver微服务。当您使用Axelar网关发送跨链交易时,IAxelarGasReceiver将允许您为目标链上的后续交易支付费用。虽然非必要,但这允许终端用户只发送一笔交易来自动更新目标链,并以他们所持有的源链Token来支付交易费用。

非波卡链与平行链间的转移

Axelar将帮助我们从非波卡链获取Token到Moonbeam。但是这些桥接的Token将如何从Moonbeam转移到其他平行链?

Moonbeam允许开发者创建称为可铸造的XC-20跨链(XCM)资产,可以通过波卡的XCM消息格式桥接至其他平行链。这些XCM资产如同Moonbeam网络上的普通ERC-20资产一样,可以通过智能合约进行铸造、销毁和转移。使用XTokens预编译的智能合约,开发者可以使用典型的Solidity智能合约将这些Token发送至其他链。

Axelar专为Moonbeam编写了一个智能合约,将其桥接的Token包装到可铸造的XC-20中,允许Axelar的Token通过Moonbeam能够触达波卡生态系统的其他部分。此合约尚未部署至主网,但可以作为一个示例,展示包装合约如何用于桥接资产。

如之前所提及的,Axelar是一个转接桥,允许用户在链之间传送Token。Axelar的通用消息传递允许开发者连接链之间的合约,即使不在同一条链上,用户也可以通过单个交易调用智能合约。最重要的是您可以在同时使用这两个功能。

在单笔交易中,您将从一条链发送Token至Moonbase Alpha,将其包装到一个可铸造XC-20,并最终使用XTokens预编译来进行跨链传送。在本示例中,您将要向Centrifuge处理的测试网传送资产。请注意,Centrifuge在本示例中仅用于示例。

互连合约Connected Contracts

互连合约需要两个角色:源链上的发送者和目标链上的接收者。很多dapp可能希望在链之间来回传送相同类型的消息,即无缝提供跨链可替代的流通性。这些dapp需要在相同的合约中有发送者和接收者组件。

在本示例中,只有一条链(Moonbase Alpha)拥有接收功能,因为其他Axelar连接的链都不是波卡平行链。因此,会有两个智能合约来分别处理发送和接收逻辑。

ReceiveCrossChainXToken

首先来看一下目标链(Moonbase)合约,因其规定希望接收的信息。

ReceiveCrossChainXToken继承自IAxelarExecutable,这允许其通过Axelar网关进行调用。该母合约有两个可覆盖的函数,_execute_executeWithToken,这将允许开发者在合约收到来自Axelar网关合约调用时更改逻辑。两个函数拥有相同的输入,但是_executeWithToken还将包含tokenSymbolamount来描述跨链传送的Token。智能合约希望可以接收Token,以便将其包装到XCM资产中,因此这将覆盖 _executeWithToken函数。

此函数收到很多信息,但在本示例中,只需考虑Axelar提供的两个部分:负载和接收的Token数量。

Axelar发送给接收者智能合约的负载是来自发送者合约的基本信息,序列化为动态字节对象。智能合约将负载解码为两个结构和一个uint64,这将之后的XTokens预编译中使用。

剩下的逻辑在不同的函数wrapAndSendxUSDC中。将逻辑分离到另一个函数并不是必要的,但是这允许用户在源链上包装和发送可铸造的XC-20。

您需要注意此合约仅需要aUSDC。更通用的合约可能需要使用Axelar提供给我们的额外参数。

现在您已经从跨链消息中整理出来初始信息,接下来让我们来看一下大部分逻辑。

首先,合约批准Axelar包装合约使用Axelar的aUSDC。然后,在记录一些事件的进程后,合约允许包装合约将aUSDC包装到xUSDC中。最后,在触发另一个事件并根据波卡的特殊性进行调整后,合约尝试使用xTokens预编译发送XCM消息,将xUSDC转移到另一条平行链。

波卡有一个系统要求像xUSDC这样的本地资产至少有一个“单位”的xUSDC来“保持账户活跃”。这就是为什么如果合约中xUSDC的数量等于或少于即将发送的数量,智能合约会保留1个“单位”的xUSDC。这个特殊性是因为波卡的安全功能,该功能源自于一个系统,确保用户不会意外丢失所有的资产,但是在本示例中是一个小阻碍。

这是接收端智能合约的完整分解。下一个合约会更直接明了。

SendCrossChainXToken

Moonbase合约要接收的内容已经确定,现在您需要编写合约来发送这部分数据。查看目标链合约。

在SendCrossChainXToken中只有一个相关函数,sendxUSDCToParachain,其将与AxelarGateway交互,从而发送带有Token的跨链消息。这也将使用IAxelarGasService合约,以便可以自动支付在目标链上的执行费用(gas)。

此函数采用与xTokens预编译相同的参数,因为调用者本质上是从不同的链上进行调用。

然后,合约将调用者的aUSDC从调用者转移至合约,以便Axelar的网关合约可以稍后从SendCrossChainXToken移除aUSDC。请注意,调用者必须在此工作之前批准合约,实际上可能只需要操作一次。

接下来,合约将负载编码到字节对象,以便后续在目标链中对其解码。编码与解码的顺序相同,请自行检查!

下面一个步骤,是在目标链上支付gas费用。我们计划是从目标链发送aUSDC和自定义数据(负载),因此合约必须支付同时发送Token的合约调用费用。在此次实施中,合约将用源链的原生Token为目标链的交易支付费用。

原生Token是用户用于支付gas费用的Token。举例来说,我用Fantom测试网作为源链,则原生Token为FTM。您可以根据目标链的原生Token和Moonbase Alpha的原生Token之间的转换率使用原生Token为目标链支付gas费用,转换率将基于其对应的主网(本示例中为Fantom转换到Moonbeam)。

综上所述,因为智能合约正在发送包含Token的智能调用并以DEV来支付目标链的gas费用,因此该合约将使用payNativeGasForContractCallWithToken函数。请注意合约使用的链名称为“Moonbeam”而非“Moonbase”,因为Axelar要求主网名称。

最后,合约允许网关合约从合约获取Token并发送跨链消息。

Deploying Axelar Connected Contracts

在设置代码库之前需要准备一些先决条件。您将需要访问一个拥有以下设置的solidity钱包:

  • 从Moonbase Alpha的faucet获取的DEV
  • 另一种Axelar支持的EVM链的原生Token(如下所示)
  • 从Axelar的Discord faucet获取的能够代替aUSDC的原生Token

以下表格列出了一些Axelar支持的EVM链,包含其测试网faucet的链接:

最后,您可能希望创建一个测试网Centrifuge钱包。因为您可以发送Token到任何预存在的钱包并监控由此产生的交易,建议您控制目标钱包以便后续您想要转回Token。Centrifuge提供了一个连接至Moonbase Alpha的测试网平行链,您可以在polkadot.js上与其交互。如果您还不知道如何在Centrifuge上创建钱包,您可以观看此教程视频学习如何使用polkadot.js扩展程序。

当您设置完账户后,您将需要获取其十六进制格式的地址。最简便的方式是复制缩短的地址(以kA开始),打开Shawn Tabrizi网站,并将缩短的地址复制到AccountId to Hex工具栏中。

如果您不想操作此过程,您可以直接使用以下账户:

“`

0x6a5a0c5de2400f2f0eccfaf65c765c40bd85af4e370e7da51f36942ed3546f24

“`

设置代码库

现在,您已经拥有了一个资金充足的钱包并选择了Axelar支持的EVM链来发送跨链消息。接下来您可以开始研究代码了!

复制以下代码库:

“`

git clone https://github.com/jboetticher/axelar-parachain-hop.git

“`

在您刚刚复制的代码库的文件夹中,您将根据以下格式使用您的钱包私钥创建一个secrets.json文件:

“`

{

“privateKey”: “YOUR_PRIVATE_KEY”

}

“`

现在,您已经完成了所有的设置,可以开始部署了!

使用脚本部署

要帮助合约部署,脚本文件夹中有两个脚本,destDeploy.jsoriginDeploy.js。这两个脚本与ethers.js部署非常相似,您如果您熟悉使用hardhat,您可能已经完成了部署。本文将不会讨论代码。

首先,通过在项目主目录中运行destDeploy.js脚本在Moonbase Alpha上部署目标链合约:

“`

npx hardhat run scripts/destDeploy.js –network moonbase

“`

您将看到如下方所示的内容。确保复制您要部署至的地址并将其粘贴至安全的地方,以便后续使用。

现在,您可以在您选择的Axelar连接的EVM上部署源链合约。代码库的hardhat.config.js文件有很多可用网络,各种faucet已在上述列出。以下命令将在测试网上部署并批准部署的100个测试网aUSDC合约。

“`

npx hardhat run scripts/originDeploy.js –network moonbase

“`

您应该在输出处看到如下所示内容。再次提醒,请确保复制您部署的地址。

平行链之间如何转移非波卡token

现在看看平行链之间的非波卡token转移方案。或者更确切地说是启动它的脚本。

相关脚本位于scripts文件夹中,名为axelarSend.js

第一步,配置。您将需要改变更改顶部的脚本以放入您的目标链地址(Moonbase Alpha的ReceiveCrossChainXToken)和您的源链地址(SendCrossChainXToken)。这就是为何在上一部分保存两个地址的原因!

您还需要以十六进制格式输入您的Centrifuge地址,这是您在部署时查找先决条件时获得的。

该脚本使用Axelar SDK来预计目标链gas fee。作为开发者,需预计在目标链上的支出的gas金额,因为很难预计只能由特定合约调用的函数。在本例中,gas高估在200,000。在真实生产环境中,您可能想对支出的gas金额进行基准测试。然而,如果最终您确实高估了很多,您将得到Axelar gas服务的退款。

由Axelar SDK提供的estimateGasFee函数将找到源链的本地token和目标链的本地token之间的转换,以找到发送到目标链的正确数量。

如果您查看以下案例截图,疑问为何使用辅助函数testnetToMainnetChainName,因为相比测试网名称(如Moonbase Alpha),Axelar更想要主网名称(Moonbeam)。

现在,查看发送到源链的交易:

粗略观察,这些输入看起来很奇怪,但理解这些输入,则需要对Substrate(工具链波卡平行链建立在其上)和 xTokens在Moonbase Alpha上如何预编译的工作原理进行简要解释。

Substrate允许开发者构建模块化的区块链,这就是波卡如何获得平行链的方式。这些在不同区块链上提供不同功能的模块中的每一个都称为pallet。在构建平行链时,每个pallet都有一个 ID:pallet ID。

波卡允许每一个平行链通过XCM技术互相之间交流。每个平行链都需要一个身份:平行链ID。

xTokens预编译,即ReceiveCrossChainXToken合约与之交互的预编译合约,不由任何solidity代码组成。它实际上被运用到平行链中,并直接与xTokens pallet交互。需要Substrate理解的数据才可以操作(如果你是Solidity开发者,这与你习惯的或许不同)。xTokens预编译管理的每个资产都有自己的资产ID。

总结来说,发送方合约使用Axelar的GMP将xTokens预编译所需的数据从EVM链发送到Moonbase Alpha。下一步将分析所发送的xTokens预编译的数据。

ReceiveCrossChainXToken中使用的xTokens预编译函数是transferMultiasset。它采用一个Multilocation结构来表示资产,一个uint256来表示您希望发送的金额,另一个Multilocation结构来表示我们将资金发送到哪里,一个uint64来表示权重。

构建Multilocation有点难以理解,所以Moonbeam的文档中提供了专门介绍。下面查看资产参数的第一个Multilocation结构:

“`

“`

0值表示该位置相对于当前的平行链。这是正确的,因为xUSDC是最初在Moonbase Alpha上注册的token,而不是其他平行链。

对于字节数组,每个条目的前4个字节(十六进制字符)表示如何解读其余部分的消息。

因此,第一个条目的0x04表示该条目是pallet ID。0x24等于36,因此该条目表示资产与Moonbase Alpha的第36个pallet相关,即xTokens pallet。

第二个条目的0x05表示通用索引,与xTokens pallet结合有意义。剩下的条目0xFD9D0BF45A2947A519A741C4B9E99EB6表示xUSDC的资产ID,所以是xUSDC的通用索引。

另一个参数相对简单。 30000 xUSDC等于30分。但您需要仔细查看目标链信息:

“`

“`

对比资产参数,数值1表示该位置不是相同的平行链。这是正确的,因为如果您只在本地发送xUSDC,这会破坏这个项目的目的。

字节数组的第一个条目的0x00表示条目是平行链ID。0x000007EF等于2031,即Centrifuge在Moonbase Alpha的测试中继链上的平行链ID。

第二个条目0x01表示32字节地址,就是Centrifuge使用的地址,因此CENTRIFUGE_ACCOUNT变量直接附加在后面。另外的0x00满足格式的要求。

权重参数与EVM链上gas相似,但有些细微差别,在此不做讨论。如您对此感兴趣,可以至波卡文档查阅。在这里使用1000000000即可。

后两个参数与xTokens预编译无关。您发送ReceiveCrossChainXToken的Moonbase Alpha地址,以便合约知道将消息定向到何处。最后,您通过交易发送的值将用于通过Axelar的gas接收器支付源链上的gas。

发送及监测交易

现在,您已经理解交易并已经正确配置脚本,请往下执行发送交易。

您可以使用两个浏览器监测交易。一个是Axelar测试网浏览器,该浏览器将提供您在Moonbase Alpha和源链上的相关活动的深入数据。另一个是polkadot.js,该浏览器将允许您查询在Centrifuge链状态的变化。

以下是交易的格式,NAME_OF_NETWORK是您选择的网络(在hardhat.config.js文件的网络配置中查看要使用的测试网网络的可能名称):

“`

npx hardhat run scripts/axelarSend.js –network NAME_OF_NETWORK

“`

发送交易之后,您应该能在控制台看到如下内容:

请复制交易哈希以监测您的交易情况。打开Axelar测试网浏览器,在右上角搜索栏粘贴交易哈希,即可检测交易状态。如果所有步骤顺利,交易最终完成。

打开polkadot.js上的Centrifuge测试网,连接至Moonbase Alpha。如果在Moonbase Alpha上执行消息之前执行此操作,您可能会捕获一个xcmpQueue event。

请确保所有操作正确的情况下检查,或者如果您没有看到xcmpQueue event,您可以检查chain state或者确保您已经收到token。

在Developer标签下找到Chain state。您可以使用ormlTokens pallet查询您的token余额,现在,xUSDC作为一个ID 2的ForeignAsset。请注意,该结果金额可能与您原始发送的金额(300000)并不匹配,因为还牵涉到平行链转移中的费用。

假设以上步骤皆顺利的情况下,您已经完成平行链间的转移!此模板对其他使用Axelar资产的平行链也可重复,并且为生态间的资产无缝转移打开了大门。

如您需要任何帮助,请在Mooonbeam Discord与团队进行联系。

深入了解跨链互连合约

虽然Centrifuge不会在他们的主网上使用XC-20包装的aUSDC,但随着波卡生态系统中对新资产的需求增加,这种技术可能会被更多地使用。

如果读者对自己写互连合约和Axelar的GMP感兴趣的话,可以积极尝试更多用例。

您可以在Axelar网站上了解更多信息。您也可以阅读了解互连合约是如何将Moonbeam定位为区块链互操作性的领导者。


相关文章:

  • 77、TensoRF: Tensorial Radiance Fields
  • 基于Android的动漫之家系统的设计与实现
  • 【C++】深浅拷贝
  • Springboot整合Redis
  • 基于代理 Dao 实现 CRUD 操作
  • Java线程池(超详细)
  • ESP32设备驱动-8x8LED点阵驱动(基于Max7219+SPI)
  • Python-Flask-2023.1.24-Review
  • HTML学习
  • mysql之explain(性能分析)
  • C语言基础知识(38)
  • go 语言 string 类型思考
  • AxMath使用教程(持续更新中)
  • /proc/meminfo的理解vmtouch使用介绍内存碎片整理
  • 行为型模式-模板方法模式
  • WordPress整站源码安装说明(搬家换域名/服务器)的安装步骤
  • 最小化最大值+拓扑排序要点+概率
  • 十大经典排序算法(动态演示+代码)-选择排序与插入排序
  • 好客租房-12.ES接入java
  • 【Linux】Linux调试器——gdb使用
  • 5-5中央处理器-指令流水线
  • HTML基本常用标签
  • java+ssm网上书店图书销售评价系统
  • 【数据结构】详谈复杂度
  • Python函数(函数定义、函数调用)用法详解
  • Python基础学习 -- 常用模块
  • k8s安装nfs设置pv pvc并部署mysql
  • BERT模型结构可视化与模块维度转换剖析
  • 【LeetCode】计算右侧小于当前元素的个数 [H](归并排序)
  • 【每日一道智力题】三个火枪手(快来看人生哲理)
  • SaaS是什么,目前主流的国内SAAS平台提供商有哪些?
  • Opencv项目实战:19 手势控制鼠标
  • 2023 年第一弹, Flutter 3.7 发布啦,快来看看有什么新特性
  • 3.5动态规划--凸多边形的最优三角剖分
  • (python)selenium工具的安装及其使用
  • 对多线程中线程池的理解
  • 深度学习流行的框架有哪些?分别有什么特点
  • C++初阶--多态
  • Leetcode:46. 全排列、47. 全排列 II(C++)
  • LeetCode13罗马数字转整数
  • CE训练教程进阶,步骤 9: 注入++
  • 【21】C语言 | 几个经典数组练习题
  • VMWare 移动Linux CentOS 7虚拟机后连不上网怎么办
  • 【Ubuntu】Nacos 2.1 单机安装
  • LeetCode 2520. 统计能整除数字的位数
  • “深度学习”学习日记。与学习有关的技巧--Bacth Normalization
  • Ubuntu下为可执行文件和脚本文件(.sh)生成桌面快捷方式
  • 【c语言进阶】结构体最常用知识点大全
  • 30. PyQuery: 基于HTML的CSS选择器
  • 初出茅庐——索引和文档的基本操作
  • C++:类中const修饰的成员函数
  • AtCoder Beginner Contest 285 题解
  • 2023年springcloud面试之Eureka(第二部分)
  • 为 TDesignBlazor 添加暗黑模式
  • DFS(六) N皇后 II
  • Linux中的工具使用【vim的存活级】
  • JavaScript 所见所得文本编辑器 Froala Editor 4.0.17Crack
  • Allegro如何自动做差分对内等长操作指导
  • 洛谷-P2114 [NOI2014] 起床困难综合症
  • 【学习笔记】[AGC023E] Inversions
  • JDBC连接池多线程通过CountDownLatch实现线程并发执行
  • ISIS简介、NSAP与NET地址、Router-Id转换成NET地址
  • 【GIS】高分辨率遥感影像智能解译
  • C语言基础 — ( C语言库函数<stdio.h>——C标准的内容)
  • AI算法(三)plt基础
  • final的一个重要用途-宏变量和未初始化问题
  • C++空间命名
  • 快速排序的实现和优化~
  • macOS Ventura 13.2 (22D49) 正式版发布,ISO、IPSW、PKG 下载
  • MS Access数据库多数据源JDBC查询
  • 十大经典排序算法(动态演示+代码)-堆排序
  • Python3 round() 函数
  • 信息论复习—连续信源、信道及容量
  • RadSystems Studio 8.1.8 Crack
  • 【自然语言处理】情感分析(一):基于 NLTK 的 Naive Bayes 实现
  • 【MySQL】第十一部分 SELECT的执行过程
  • 【目标跟踪】------deepsort
  • 2023牛客寒假算法集训营3
  • 基于Springboot vue前后端分离在线培训考试系统源码
  • MyBatis基本使用及XML配置
  • Java数组
  • [数据结构基础]排序算法第一弹 -- 直接插入排序和希尔排序
  • 鱼雷的发射角设置
  • 深度学习数据标注_Lableme
  • JavaWeb语法八:网络原理初识
  • 基于STM32的FreeRTOS开发(1)----FreeRTOS简介
  • 搭建本地Maven仓库
  • 算法:树状数组详解(c++实现 求解动态数组区间和问题)
  • 《深入浅出计算机组成原理》学习笔记 Day10
  • day 19 暴力枚举
  • 尚医通-手机登录-判断用户登录状态-用户网关整合(三十)
  • 使用Vue 简化 用户查询/添加功能
  • emoji 符号大全,给各位程序员增加一些奇怪的知识点
  • Mysql入门技能树-数据类型
  • Eclipse导入python项目
  • 简明Java讲义 2:数据类型和运算符
  • 【JavaWeb】JavaScript基础语法(下)
  • 56. 合并区间 738.单调递增的数字
  • 数据库和SQL概述
  • 力扣刷题记录——645. 错误的集合、657. 机器人能否返回原点、674. 最长连续递增序列
  • AtCoder Regular Contest 149
  • 常用的负载均衡算法
  • 恶意代码分析实战 14 反虚拟机技术
  • Mine Goose Duck 0.2版本发布
  • 离线用户召回定时更新
  • MP-4可燃气体传感器介绍
  • 【设计模式】结构型模式·外观模式
  • C C++实现两矩阵相乘--模拟法
  • 服务器配置定时脚本 crontab + Python;centos6或centos 7或centos8 实现定时执行 python 脚本
  • git 操作整理
  • ESP32设备驱动-TSL2561亮度传感器驱动
  • SOLID原则总结
  • 机器学习笔记之深度玻尔兹曼机(二)深度玻尔兹曼机的预训练过程
  • [Android开发基础1] 五大常用界面布局
  • JavaEE day4 初识HTML+总结3
  • 【C#】WPF实现经典纸牌游戏,适合新手入门
  • LA@determinant@行列式@Vandermonde行列式
  • python爬虫学习笔记-mysql数据库介绍下载安装
  • Linux使用YUM源安装Docker
  • Prometheus学习整理-Prometheus-operator
  • Python(for和while)循环嵌套及用法
  • Elasticsearch:Elasticsearch percolate 查询
  • mysql之索引
  • 【Linux】文件权限
  • MySQL内外连接
  • 04_iic子系统
  • IPV4地址详解
  • 矩阵理论复习(六)
  • AX7A200教程(4): DDR3的读写fifo仿真
  • 2023牛寒2--Tokitsukaze and Three Integers
  • [ 华为云 ] 云计算中Region、VPC、AZ 是什么,他们又是什么关系,应该如何抉择
  • 【电动车】基于多目标优化遗传算法NSGAII的峰谷分时电价引导下的电动汽车充电负荷优化研究(Matlab代码实现)
  • 20230125英语学习
  • Linux常见命令 8 - 其他文件搜索命令 locate, which, whereis, grep
  • 前端艺术之毛玻璃-倾斜-日历
  • Java基础 Stream流方法引用异常文件
  • TCP/IP IP地址概念与应用
  • 手把手教你写一个极简版Netty
  • Tkinter的Checkbutton控件
  • 汇编语言学习 下
  • 二叉树基础oj练习
  • fpga实操训练(系统开发和硬件接口)
  • 审批工作流—ccflow
  • ThreadLocal详解
  • Java大数值与浮点数计算
  • cmake 05 使用库
  • 浏览器使用本地硬盘上的JS文档
  • Python基础学习七
  • Java IO流之字符流详解
  • 二叉树专题汇总
  • 多个盒子排列规则(视觉格式化模型) 多个盒子的排列 页面布局
  • Linux下动静态库的打包与使用C C++
  • ubuntu 22.04学习笔记
  • 2023年网络安全比赛--中间件渗透测试中职组(超详细)
  • Python初学者看过来啊,老油条来复习
  • 单绞机控制算法模型(Simulink仿真)
  • 十二、创建和管理表
  • MySQL HA(High Availability) 数据库高可用工具Orchestrator安装
  • 通信原理简明教程 | 基本概念
  • 【头歌】单链表的排序操作
  • Mysql入门技能树-使用数据库
  • Java线程池
  • 恶意代码分析实战 1 静态分析基础技术
  • 恶意代码分析实战 7 WinDbg
  • Vue-Router详解
  • PHP 实例 - AJAX 实时搜索
  • 【MySQL】存储引擎
  • 《MLB美职棒大联盟》:年度最佳教练奖·棒球1号位
  • 19、Javaweb案例-登录功能
  • 【Git :分布式版本控制工具】
  • jvm面试题汇总
  • 电商项目之同一笔单多次收款成功
  • 零基础学JavaWeb开发(二十二)之 springmvc入门到精通(2)
  • Issues with peer dependencies found
  • CSS 艺术之心形-彩虹-加载动画
  • Python---自动生成二维码
  • Java集合常见面试题(四)
  • input 实现回车失焦,考虑输入法的情况
  • 高等数学【合集2】
  • 雅睿生物在创业板IPO终止:安信证券为保荐人,曾计划募资7.5亿元
  • 【操作系统】—— Windows常用快捷键(带你快速了解)
  • 基于Andriod的智慧校园卡系统的设计与实现
  • (18)go-micro微服务ELK介绍
  • OSG三维渲染引擎编程学习之二十八:“第三章:OSG场景组织” 之 “3.10 Switch开关节点”
  • 动态站点地图提交百度收录
  • 【价格型需求响应】基于Logistic函数的负荷转移率模型需求响应研究(Matlab代码实现)
  • javascript中Math.random()产生随机数进行随机点名
  • Hyperbolic geometry (双曲几何简介)
  • 【Leetcode每日一题】34.在排序数组中查找元素的第一个和最后一个位置|二分求下标
  • 【JavaEE】如何开始基础的Servlet编程(基于Tomcat服务器)
  • 【SpringCloud20】SpringCloud Alibaba Seata处理分布式事务
  • MODBUS总线的学习笔记
  • OSG三维渲染引擎编程学习之二十七:“第三章:OSG场景组织” 之 “3.9 AutoTransform自动对齐节点”
  • 最实用的 Docker 知识(一)
  • Leetcode:78. 子集、90. 子集 II(C++)
  • 1月23日Linux c编程之Makefile
  • UPS BP650CH实现nas自动关机
  • MySQL —— 库操作
  • ❤️如何实现所谓的“关键字传参”--理论+易懂版⭐
  • 【JavaEE】认识线程Thread类及常用方法线程状态
  • Shell语法
  • MP-2平面烟雾气体传感器介绍
  • springboot中restful风格请求的使用
  • 【19】C语言 | 三子棋
  • 【每日一题Day97】LC1828统计一个圆中点的数目 | 模拟
  • 议论文书写总结
  • Day869.索引(下) -MySQL实战
  • 离线召回与排序介绍
  • 【Ajax】防抖和节流
  • CMAKE
  • 【面试克星】【公式少代码少话多】Vins-Mono预积分相关知识点总结与概述
  • C语言基础知识(36)
  • Python实现一个简易的CLI翻译程序
  • SQL学习
  • 【计组笔记01】计算机组成原理之冯诺依曼体系结构、计算机编码、定点数的表示、原码和补码的乘除法
  • 人世正道沧桑,她亦奋力向前 --读《李清照传》有感
  • Android 深入系统完全讲解(37)
  • 【QT5.9】与MFC对比学习笔记-感悟篇2【2023.01.23】
  • ARP渗透与攻防(五)之Ettercap劫持用户流量
  • C++初阶--继承
  • 学习率衰减、局部最优、Batch归一化、Softmax回归
  • 树状数组(代码模板和原理详解)
  • 我的第一次真实对国外某购物平台web漏洞挖掘
  • Intellij IDEA 丢失 Project Structure 问题
  • 分享139个ASP源码,总有一款适合您
  • Java | 解决并发修改异常问题【CurrentModificationException】
  • Mybatis遇到的脑残问题
  • 为了方便项目打包,我用Node写了个git-tag工具
  • RK3399平台开发系列讲解(内存篇)访问虚拟内存的物理内存过程
  • Essential C++第五章习题
  • JDK8 新特性之并行的Stream流
  • Cesium:Indexed 3D Scene Layers (I3S)加载
  • 【代码阅读】MSC-VO
  • Python基础学习六
  • 使用 AJAX+JSON 实现用户查询/添加功能
  • 在linux下安装docker
  • 【Hadoop】HDFS+Shell实践(定时上传数据至HDFS)
  • 《Rust权威指南》读书笔记9 - 泛型、特性、生命周期
  • 文本情感分类TextCNN原理+IMDB数据集实战
  • 【蓝桥杯】历届真题 作物杂交(省赛)Java
  • Tkinter的Listbox控件
  • 进阶C语言 第二章-------《进阶指针》 (指针数组、数组指针、函数指针、回调指针)知识点+基本练习题+深入细节+通俗易懂+完整思维导图+建议收藏
  • 梯度之上:Hessian 矩阵
  • Ubiquiti MAC Address Changer 3.0 Crack
  • 机器学习(五):机器学习算法分类
  • 路由处理及功能(实现了权限控制vue admin)
  • 【JavaSE专栏5】Java 基本数据类型和取值范围
  • 英语学习打卡day4
  • 【数据库概论】3.1 SQL简述、数据定义和索引
  • 【C语言进阶】一文带你学会C语言文件操作
  • 欧几里得与扩展欧几里得算法(含推导过程及代码)
  • 【My Electronic Notes系列——晶闸管】
  • 安装配置Ecplise插件PyDev 8.3.0
  • LeetCode刷题记录---贪心算法
  • 蓝桥杯-刷题-补基础
  • 多线程不安全函数的理解
  • 插入排序算法的实现和优化~
  • 协调中心性能大对比:zookeeper是如何解决负载均衡问题的
  • Email Signature Manager 9.3 Crack
  • CSS边框、边距、轮廓(边框宽度/颜色/各边/简写属性/圆角边框/内外边距/高度宽度/框模型/轮廓宽度/颜色/属性/偏移)——万字长文|一文搞懂
  • 2022——>2023
  • 【手写 Vue2.x 源码】第四十二篇 - 组件部分 - 组件挂载流程简述
  • 数据结构 最短路径课设(源码+实验报告+视频讲解)(用了自取)
  • 高等数学(第七版)同济大学 习题12-6 个人解答
  • Nacos集群搭建
  • JVM快速入门学习笔记(三)
  • 作为项目经理,如何做好项目进度管理
  • Linux进程信号
  • 我的1周年创作纪念日
  • 量子力学奇妙之旅-微扰论和变分法
  • CS61A 2022 fall HW 01: Functions, Control
  • MySQL主从复制、读写分离
  • NR PUSCH(七) 相干传输
  • 【Java|golang】1828. 统计一个圆中点的数目
  • Nginx与LUA(7)
  • 设计模式 - 六大设计原则之LoD(迪米特法则原则)
  • C++程序设计——动态内存管理
  • Leetcode:93. 复原 IP 地址(C++)
  • 《TPM原理及应用指南》学习 —— TPM实体4
  • 树,堆,二叉树的认识
  • OSG三维渲染引擎编程学习之二十五:“第三章:OSG场景组织” 之 “3.7 PositionAttitudeTransform位置姿态变换节点”
  • 几种觉排序优劣
  • 【C++】右值引用和移动语义 | 新的类功能 | 可变参数模板
  • 园区网典型组网架构及案例实践
  • 【学习Arduino单片机AD传感器采样的十大滤波算法】
  • PAT 1074 宇宙无敌加法器(C++解法)
  • Kubernetes:基于命令行终端UI的管理工具 K9s
  • 【JavaSE】一文看懂构造器/构造方法(Cunstructor)
  • 排序算法: 数据的离散化(排序+去重 C++例题实现)
  • 【每日一道智力题】之海盗分金币(上)
  • TypeScript
  • C++第七讲——Demon和Angela的魔法之旅
  • 美团出品 | YOLOv6 v3.0 is Coming(超越YOLOv7、v8)
  • CSS样式基础内容2
  • 【C++】类和对象(上)---什么是类?
  • 【头歌】单链表的基本操作
  • ConcurrentHashMap的死循环问题
  • C++6:STL-模拟实现string
  • 一文吃透python多线程(全面总结)
  • 计算机基础——无处不网络(2)
  • Docker安装教程(看这篇就够了)
  • 高性能 Java 框架。Solon v1.12.3 发布(春节前兮的最后更)
  • 内存函数及其模拟实现
  • Spring介绍
  • scala函数柯里化
  • C++基础回顾
  • 深度学习数据自动标注器开源 目标检测和图像分类(高精度高效率)
  • Redis脑裂为何会导致数据丢失?
  • Spring控制反转(IoC)和依赖注入(DI)
  • 客快物流大数据项目(一百零八):Spring Cloud 技术栈
  • CUDA编程笔记(5)
  • 【SpringCloud】Nacos注册中心、配置中心用法与原理(下)
  • Python 超强命令行解析工具 argparse !
  • 【C++】lambda 表达式 | 包装器
  • JQUERY案例
  • 第九层(1):初识STL
  • 【蓝桥云课】最大公约数与最小公倍数
  • Redis常用的数据类型
  • 抖音小黄车挂淘宝店相关问题记录
  • 【C语言进阶】指针进阶(干货)
  • 棋盘放麦子-蓝桥杯
  • 【Hadoop】HDFS高可用与高扩展原理分析(HA架构与Federation机制)
  • 23种设计模式(二十二)——访问者模式【行为变化】
  • 3.1 卷积神经网络的应用领域|卷积的作用|卷积特征值的计算方法|得到特征图表示|步长与卷积核大小对结果的影响|边缘填充方法
  • 安卓S开机动画流程
  • react源码:目录结构、调试源码
  • 车辆占用应急车道识别抓拍系统 opencv
  • 2022年“网络安全”赛项黑龙江省赛选拔赛 任务书
  • Webpack5 教程 (7) --- 减少代码
  • Elasticsearch7.8.0版本入门——JavaAPI操作(环境准备)
  • 常见递归模式
  • 偷偷理解Java和Scala中==和equals()的区别
  • 基于双层优化的微电网系统规划设计方法(Matlab代码实现)
  • STL - 常用算法
  • 基于Springboot+Vue+Sercurity实现的大学生健康管理平台
  • Linux内核驱动初探(二) TI声卡
  • 有关Java多线程的几个概念
  • JavaEE 突击 5 - Spring 更简单的读取和存储对象(2)
  • 约数个数及约数之和知识点(含公式)
  • 50个常用的 Numpy 函数详解
  • JavaEE5-Spring更简单的读取和存储对象
  • 过完2022,依然记得仰望星空
  • MyBatis 连接数据库与增删改查
  • Java标准输入输出流(in/out)
  • 【Python百日进阶-Web开发-Linux】Day236 - Win11安装Windows Subsystem for Android(WSA)
  • java8新特性
  • cmake 目录
  • C++进阶 哈希表封装unordered_map和unordered_set
  • Spring事务、事务隔离级别、事务传播机制
  • 【13】C语言 | “go_to“语句
  • Vue3悬浮返回主页按钮设计与实现
  • XILINX FPGA OV5640 摄像头驱动(一)
  • 合宙ESP32C3上手使用
  • 英语学习打卡day3
  • 2.4总线操作和定时
  • 8.Java循环高级综合练习-无限循环和跳转控制语句,逢七过,平方根,判断是否为质数,猜数字小游戏
  • 基于networkx聚类技术—复杂网络社团检测(附完整版代码)
  • avb校验相关与块校验原理
  • SpringBoot 统一功能处理
  • 基于PythonOpenCv的视频图像处理
  • 力扣sql简单篇练习(五)
  • Java---微服务---SpringCloud(2)
  • 【手写 Vue2.x 源码】第四十一篇 - 组件部分 - 生成组件的真实节点
  • 02 |「数据结构、逻辑结构、物理结构」基本概念简析
  • 06_平台总线匹配规则,自己搭建总线xbus
  • 什么是数据库连接池?Druid(德鲁伊)连接池的使用详细解读
  • 自己动手写一个操作系统——MBR(1)
  • Redis在秒杀场景的作用
  • await 返回了什么
  • pytorch零基础实现手写数学符号识别项目(三)——模型训练与预测
  • eBPF 入门开发实践指南五:在 eBPF 中使用 uprobe 捕获 bash 的 readline 函数调用
  • windows权限维持方法详解
  • 【LeetCode】二叉树的序列化与反序列化 [H](二叉树)
  • 【JavaSE专栏4】关键字、标识符和命名规范
  • 使用小程序+网页简易实现多客户端实时弹幕
  • 【JavaScript】多态(Symbol),迭代器接口,getter/setter
  • Java/JavaScript有哪些图形图像处理的框架?
  • Unity HurricaneVR 插件中的 VRIK 设置
  • Maplab 2.0发布:多传感器融合的SLAM框架,支持多机器人、语义回环检测功能
  • 汇报写作学习总结
  • Java中的hashCode,真的很容易弄懂
  • 域环境搭建
  • 单片机扫盲
  • C++:类的构造函数与析构函数
  • Canal实时同步发送JSON数据示例代码
  • 《TPM原理及应用指南》学习 —— TPM实体3
  • 面试官问我有没有分布式系统开发经验,我一脸懵圈…
  • 七、python-PySpark篇(黑马程序猿-python学习记录)
  • redis 数据库简介
  • 多线程(5)
  • mysql锁
  • 你对CSS权重真的足够了解吗?
  • E2PROM 蓝桥杯 stm32 AT24C02读写函数
  • 【SpringBoot】SpringBoot三层开发
  • Redis数据类型简介
  • 深度学习TensorFlow—GPU2.4.0版环境配置,一文简单易懂详细大全,CUDA11.0、cuDNN8.0
  • YOLOv5/v7 引入 YOLOv8 的 C2f 模块
  • 1月24日,30秒知全网,精选7个热点
  • MySQL(五):事务简介、事务的特性、事务的概念及状态、支持事务的引擎
  • 顺序表的具体使用方法.数据解构(二)
  • UE INI文件操作 INI File Operation [ Read / Write ] 插件说明
  • 【程序环境和程序预处理】万字详文,忘记了,看这篇就对了
  • 从零开始的python基础教程
  • STL分析(九 适配器)
  • MySQL间隙锁详细分析
  • 使用C++实现学委作业管理系统
  • 【IDEA】自动部署SpringBoot Jar包到远程服务器并通过脚本启动jar
  • 【My Electronic Notes系列——三极管】
  • 【操作系统】—— 如何安装双系统与多系统(带你快速了解)
  • OSG三维渲染引擎编程学习之八:“第一章:OSG介绍” 之 “1.8 基于QT的第三方库编译”
  • 三、利用迁移学习进行模型微调(Datawhale组队学习)
  • Kubernetes:分享一个很简洁的 k8s 管理工具 Skooner
  • <C++>哈希
  • Day09 - 子类父类多继承多层继承多态
  • Python---字典相关知识
  • fpga实操训练(一个典型的fpga系统)
  • 【剧前爆米花--爪哇岛寻宝】Java中有关异常类的详细讲解
  • Centos7 Docker安装APISIX
  • 06-jquery函数
  • C语言中不定参数 ... 的语法、函数封装
  • Cadence PCB仿真使用Allegro PCB SI生成振铃ringing仿真报告及报告导读图文教程
  • Kubernetes:通过 kubectl 插件 kubectl-tree 查看API对象层级关系
  • 博客系统项目的自动化测试
  • 深入剖析JVM垃圾收集器
  • 【并发编程十二】c++20线程同步——信号量(semaphore)
  • 深度估计算法原理与论文解读
  • 【Android】手机安装Termux运行nodejs学习Javascript编程入门
  • JAVA练习29
  • MySQL —— 数据库基础
  • 【HBase入门】2. 集群搭建
  • 【蓝桥杯】简单数论2——快速幂矩阵快速幂
  • 十二、网络基础2
  • 【数据结构】二叉搜索树的实现
  • 【文本分类实战练习】使用多个经典神经网络模型(词嵌入 词向量 LSTM CNN ),含问题记录及解决。
  • JDBC快速入门,如何使用JDBC操作数据库?
  • 20230123英语学习
  • 7个流行的强化学习算法及代码实现
  • Spring笔记上(基于XML配置)
  • 【目标检测论文解读复现NO.25】基于改进Yolov5的地铁隧道附属设施与衬砌表观病害检测方法
  • Go Data race and Vector clock
  • 前后端联调经验总结
  • Java多线程(二)—— ReentrantLock 源码分析
  • Springcloud 笔记
  • C++虚继承,虚基表 ,菱形继承以及解决方法
  • 我的硕士前半生
  • 【设计模式】我终于读懂了外观模式。。。
  • 【苹果家庭群发推】软件keychain中刚打开的证书下载的证书文件要决不会报错 UNTimeIntervalNotificationTrigge
  • 《Rust权威指南》读书笔记8 - Error handling 错误处理
  • CSS 特效之心形-彩虹-加载动画
  • 使用 Grafana 请求API接口
  • cmake 04 使用 python 管理 cmake 工程
  • POJ 1845 Sumdiv题解(C++ 整数惟一分解定理+分治法求等比数列之和+快速幂)
  • macm1使用Docker制作jar镜像并连接宿主机mysql
  • Vue TypeScript 使用eval函数的坑
  • CSDN原创图片链接失效分析
  • postgresql源码学习(52)—— vacuum①-准备工作与主要流程
  • 学习记录668@项目管理之项目沟通管理和干系人管理
  • Linux条件判断(全)
  • 【手写 Vue2.x 源码】第四十篇 - 组件部分 - 组件的生命周期
  • 01_kobject和ktype创建设备文件和设备目录
  • 大数据之HBase集群搭建
  • 我的创作纪念日——“永远相信美好的事情即将发生”
  • 期货交易原理(期货交易原理与实务)
  • C语言基础知识总结大全(五)
  • Linux——innode
  • 一本通-1033:计算线段长度
  • Python数模笔记-模拟退火算法(5)求解旅行商问题的联合算子模拟退火算法
  • 【青训营】Go语言的基本语法
  • HashMap1.7中的线程安全问题
  • 数学表达式的处理
  • casbin权限和配置文件的理解
  • 详解1247:河中跳房子(二分经典例题)
  • Yolo系列理论
  • 尚硅谷前端ES6-ES11
  • 08 |「双指针」算法分析
  • ROS2机器人编程简述humble-第三章-PERCEPTION AND ACTUATION MODELS .1
  • 高等数学【合集】
  • sbt编程语言scala的构建工具配置及项目构建(附带网盘下载)
  • 【蓝桥杯】历届真题 质数行者(决赛)Java
  • Java多线程(二)——ReentrantLock源码解析(补充2——可打断的锁)
  • 如何与他人交流
  • JavaScript 入门基础 - 对象(五)
  • 网关超详解
  • Multiple Dimension Input 处理多维特征的输入
  • React源码之render过程中发生了什么?
  • java spring IOC xml 方式 内部Bean注入
  • JavaScript 输出
  • 《啊哈算法第四章之bfs》(17张图解)
  • ArcGIS Pro脚本工具(17)——生成多分式标注
  • 【手写 Vue2.x 源码】第三十九篇 - 组件部分 - 创建组件虚拟节点
  • 【MySQL进阶】MySQL事务详解
  • Maplab:一个用于视觉惯性建图和定位研究的开源框架
  • 代码随想录--字符串习题总结
  • 【pytorch】.mul .add_ 和直接 + * 有什么区别
  • 2022年度总结:反思与回顾
  • 动态规划(基础)
  • 分享129个ASP源码,总有一款适合您
  • 第55章 SQL EXISTS 运算符教程
  • 【模拟CMOS集成电路】电路失调与CMRR—— 随机失调与系统失调分析(1)
  • 《MLB美职棒大联盟》:赛扬奖·棒球1号位