为互连智能合约Connected Contracts使用Axelar SDK

Hyperledger Fabric 智能合约开发及 fabric-sdk-go/fabric-gateway 使用示例 在上个实验 Hyperledger Fabric 多组织多排序节点部署在多个主机上 中,我们已经实现了多组织多排序节点部署在多个主机上,但到目前为止,我们所有的实验都只是研究了联盟链的网络配置方法(尽管这确实是重难点),而没有考虑具体的应用开发。本文将在前面实验的基础上,首先尝试使用 Go 语言开发了一个工作室联盟链的项目信息智能合约,并成功将其部署至联盟链上;然后依据官方示例,使用 fabric-gateway 模块实现了一个能够管理项目信息智能合约的客户端;之后对比了 fabric-gateway 模块 阅读详情

Axelar的通用消息传递(GMP)允许智能合约安全地跨链通信。这使开发者能够在Moonbeam上构建跨链互连应用,直接获取来自波卡、以太坊、Avalanche、Cosmos及以外的功能。本文将介绍Axelar打包的JavaScript SDK工具包,其中包括协助开发者实现跨链愿景的工具。

Axelar SDK允许开发者预估费用、追踪和恢复交易,以及轻松转账。我们将通过展示部署可以跨链铸造的NFT来介绍SDK所提供的工具。在开始之前,请先阅读近期发布的使用Axelar的跨链消息介绍。

Axelar合约概况

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

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

CrossChainNFT合约

我们将编写一个只能铸造NFT的简单合约,来查看是否收到指定跨链消息。

铸造NFT将需要用Token付款,即包装的DEV(Moonbase Alpha的原生Token)。像DEV这样的原生资产的包装Token将为发送给它的每个DEV铸造ERC-20 WDEV Token,并提供一个DEV替换一个WDEV的选项。需要使用WDEV而非原生DEV,因为Axelar要求发送的所有Token为ERC-20。

因此,要在跨链消息中铸造Token,需要收到至少0.05 WDEV。

我们把相同的合约放到两条链上,因此可以发送和接收消息。从更高层次来看,合约可以做以下两件事:

  1. 通过Axelar的网关向WDEV跨链发送编码的地址消息,可以选择在目标链上支付gas费
  2. 从Axelar接收编码的地址消息,并仅在其收到至少0.05 WDEV后执行

您将使用Hardhat项目来代替Remix,但是在设置之前,我们先来看一下合约的几个部分。

合约可以由Axelar网关执行,如此处我们可以使用IAxelarExecutable。此父合约有两个可以覆盖的函数_execute和_executeWithToken,允许开发者在合约从Axelar网关收到合约调用时更改逻辑。两个函数拥有相同的输入值,但_executeWithToken还包含Token的Symbol和数量,用于跨链传输。

最后一个是铸造函数,其中需要三个输入值:目标地址、目标链和要传送的WDEV数量。请注意此铸造函数由初始链(Moonbase Alpha)调用,并在不同的目标链铸造NFT。

逻辑本身有三个步骤。第一步,需要从调用者处获得WDEV。调用者将必须先批准NFT合约才能转移其WDEV。随后,NFT合约批准网关来转移从调用者处获得的WDEV,因为网关合约将尝试在最后一步的时候从NFT合约转移Token。

接下来,在目标链支付gas费,我们使用IAxelarGasService合约。此合约有很多不同的配置来支付gas费,比如支付执行费用与executeWithToken或使用ERC-20 token作为支付费用与使用原生资产。如果您计划后续编写自己的合约需要注意这一点。

在本示例中,因为初始链为Moonbase Alpha,则原生资产为DEV。我们可以使用原生DEV,根据Moonbase Alpha的原生资产和目标链上的原生资产的转化率在目标链上支付gas费用。因为我们正在传送的合约调用包含一个Token并计划用DEV在目标链支付gas费,我们将使用payNativeGasForContractCallWithToken函数。

最后,我们使用callContractWithToken来调用网关以传送我们的跨链消息。请注意我们发送的负载(通用数据可以在跨链调用中传送)仅仅只是调用者的地址。此数据将需要通过目标合约来编码。

现在,让我们来看一下目标链上发生了什么。

因为我们计划将Token作为铸造NFT的费用,因此我们将覆盖IAxelarExecutable中的_executeWithToken。

在_executeWithToken的实现中,我们首先要确保由Axelar提供的tokenSymbol是“WDEV”。然后,我们预计需要0.05 WDEV支付费用,如果其他Token或任何少于0.05 WDEV将自动归还。接下来,我们编码负载以获得初始链调用者的地址,从而我们能够将NFT铸造到此地址。这样就完成铸造了!

设置Repo

我们为此博客专门设置了一个Github repository。请确保您已复制此Repo。

要设置所有的依赖项,您可以在复制的文件夹中运行以下命令:

“`

npm install

“`

显而易见,我们已经安装了Hardhat、OpenZeppelin合约、一些Axelar合约和Axelar SDK。

Repo包含了两个Solidity文件,第一个文件是CrossChainNFT,第二个是Axelar库StringAddressUtils.sol,此文件尚未安装npm包,但仍需要Hardhat实现。

Repo脚本文件中还包含4个Hardhat脚本。

  • axelarStatus.js:一个Hardhat任务,允许您查阅Axelar交易相关信息
  • deploy.js:将CrossChainNFT部署至Hardhat提供的网络
  • gatewayGasReceiver.js:为Axelar网关返回硬编码的值和gas服务合约
  • mint.js:铸造CrossChainNFT(只在Moonbase Alpha上运行)

在我们开始主要部分之前,您将需要准备一个拥有私钥和一定数量DEV的账户来部署合约和签署未来所有的交易。将其放在Repo主目录下的secrets.json文件内。格式应如下所示:

“`

{

“privateKey”: “YOUR_PRIVATE_KEY”

}

“`

如果一切无误,您将能够正确地编译:

“`

npx hardhat compile

“`

在Moonbeam上部署跨链合约

此demo主要是使用脚本,因此最好能够查看这些脚本,您可以从deploy.js开始使用,这与Ethers.js部署合约示例类似。

gatewayGasReceiver.js在此Repo中存储了很多合约地址,这对部署非常有用。您可能不需要更改任何硬编码的地址。

尝试将您的合约部署至初始链:

“`

npx hardhat run scripts/deploy.js –network moonbase

“`

您应该看到地址已部署并显示在控制台。请确保复制此地址,这将用于下一个脚本交互。

您也需要将其部署至目标链。选择哪个目标链部署取决于您,但您需要其原生资产来部署。我在下方列举了一些可用的网络和获取其原生资产的Faucet:

同样也确保复制目标链的合约!

查看铸造脚本

铸造合约将需要Axelar的SDK。

在脚本上方,Ethers.js在Hardhat的脚本中进行初始化。Axelar SDK也同样会进行初始化。SDK中有多个Axelar API可以使用,但是在本示例中,我们将仅使用AxelarQueryAPI,因其包含了跨链gas费支付所需的所有gas预估功能。

之后还有一些常量供您更改。此操作过程使用Fantom作为目标链,但您可以使用任何您部署的链。请注意,即使您使用的是测试网环境,链的名称仍是其对应的主网名称,这就是为什么初始链显示的是“MOONBEAM”而非“MOONBASE”。

接下来,我们必须用包装的DEV来跨链传送。首先,我们必须包装我们的DEV并在目标链批准合约以获取一些WDEV。此步骤为必要步骤,因为初始链的合约必须发送一些WDEV以支付在目标链上铸造NFT的费用。

请注意,我们使用IAxelarGateway合约来查找地址,而非硬编码WDEV合约地址。我们也可以在智能合约本身中完成此步骤,但是我将在此处展示如何使用Ethers.js完成此步骤。

我们要签署两笔交易:第一笔是包装0.13 WDEV,然后批准CrossChainNFT合约传送WDEV。

您可能在想为什么我们要包装0.13 WDEV,而铸造的价格仅为0.05。截至本文撰写时,Axelar在网络之间转移Token时会收取少量费用(在本示例中为0.08 WDEV),具体费用可在网站上计算获得。这由网关自动完成,但在未来可能委托theIAxelarGasService合约来完成。

现在我们可以预估要发送给mintXCNFT函数的DEV数量,以支付目标链上的gas费。这便是Axelar SDK发挥作用的地方。

我们必须预估在目标链上所需的gas数量,因为很难预估一个只能由特定合约调用的函数。在本示例中,我们预估我们将花费不超过400,000的gas费。在真实的生产环境中,您可能希望对您要花费的gas数量进行基准测试。但是,如果您实际预估超出很多,将由Axelar的gas服务方进行退还。

由Axelar SDK提供的estimateGasFee函数将在初始链的原生资产和目标链的原生资产之间转换,以找到合适数量发送至目标链。

您可能在想为什么我们会使用“GLMR”而非“DEV”。这与Axelar使用主网名称来替代测试网名称类似,由于我们使用的是测试网环境,因此Axelar将用“GLMR”来代替“DEV”。

从SDK调用此函数将返回一串字符串,代表需要支付的DEV(以WEI为单位),如“241760932800000”。这不太容易理解,因此我们使用Ethers.js将其转换成可读性更高的版本并在之后显示在控制台。

最后,我们将调用mintXCNFT合约函。这里重要的一点是,我们发送的gasFee不是作为gas限制,而是作为价值。Ethers.js能够计算初始链发送的gas数量,但是要计算目标链支付的费用,我们必须用Axelar SDK计算并将其作为值发送至IAxelarGasReceiver合约。

这就是整个脚本。在我们运行脚本前,请再次检查确保脚本上方的4个常量(ORIGIN_CHAIN, DESTINATION_CHAIN, ORIGIN_CHAIN_ADDRESS, DESTINATION_CHAIN_ADDRESS)设置无误!

铸造NFT的命令如下所示:

“`

npx hardhat run scripts/mint.js –network moonbase

“`

控制台输出应如下所示:

“`

Wrap transaction hash: 0x3ddb9d8334444dffb3a16ca2ddd61f5f32b12ce0df5cdc916b7465f6b67f22b8

Approve transaction hash: 0x5b05e781aa8c4aafe12f62a61b5f99b010cf70caf0f6ce0912c640348bde11ad

Awaiting transaction confirmations…

Cross-Chain Gas Fee: 241760932800000 Wei / 0.0002417609328 Ether

Minting transaction hash: 0x148031bce691b0025928b5e5f911a82fd27f224d7d14cd3f428381553d2bb2c1

“`

此处最重要的数据是铸造交易,这可用于追踪您的交易状态,请确保您已记录此数据。如果您没有保留此数据,您可以在Axelar的测试网浏览器查看所有近期交易。

查看Axelar交易状态

Axelar有一个测试网浏览器,您刚刚完成交互的成功交易应如下所示:

但最好尝试使用SDK查看您的交易状态,因为它提供了有关交易和任何可能性错误的更多信息。为此,我编写了一个Hardhat任务以供大家使用。您可以在axelarStatus.js查看代码,我们也将在下方展示。

代码的主要内容在这5行中。首先,我们初始化我们将要使用的SDK模型AxelarGMPRecoveryAPI。不像我们在铸造脚本中所使用的AxelarQueryAPI,AxelarGMPRecoveryAPI将帮助追踪和恢复滞留的交易。

我们接下来要做的就是查询交易状态,SDK会为我们处理。

您可以在Axelar的文档网站获取更多关于AxelarGMPRecoveryAPI的信息。这包含防止交易出错的额外功能,尤其是没有足够gas费与跨链交易一同传送。

可以运行以下命令来运行脚本,其中“YOUR_TRANSACTION_HASH”是您发送跨链消息的初始链中的交易哈希:

“`

npx hardhat axelarStatus –tx YOUR_TRANSACTION_HASH

“`

如果您运行Hardhat脚本,您将在您的控制台看到下方所示页面(因原图过大只截取部分)。您可能想要查看现在的状态,Axelar的文档网站上有一整个可能的列表供您查看。您正在寻找destination_executed以表明其已经正确接收和执行,但如果您仍在早期您将看到source_gateway_called或destination_gateway_approved。

您可以在Axelar的文档网站学习更多调试合约的细节,其中包含了特定的错误信息以及如何使用Tenderly等工具应付逻辑错误。

深入了解互连智能合约

您已经了解如何使用Axelar构建属于自己的互连智能合约了!了解Axelar的更多信息,请点击Axelar网站;阅读关于Moonbeam如何成为区块链互操作性的领导者,请点击Moonbeam的Connected Contracts页面。

如果您对Moonbeam感兴趣并想深入了解,请订阅我们的电子月报并关注我们的社交媒体账号。


关于Moonbeam

Moonbeam是一个智能合约平台,用于构建跨链互连应用程序,能够访问任何链上的用户、资产和服务。通过将来自以太坊、Cosmos、波卡等功能整合到一个平台中,Moonbeam解决了当今用户体验碎片化的问题,解锁了真正的互操作性,并为下一代应用程序奠定基础。Moonbeam平台使用集成的跨链信息传递,允许开发者创建访问多个远程区块链服务的智能合约。通过此方式结合Moonbeam的开发者友好型EVM平台、各类工具支持和Substrate架构,为构建互连应用程序提供理想化的开发环境。


更多 Moonbeam 信息 
官网: Moonbeam | Polkadot Smart Contract Platform
Twitter: https://twitter.com/MoonbeamNetwork
Telegram: https://t.me/moonbeam_CN
Discord: https://discord.gg/skPfXvJWG7
中文电报群助手:@MoonbeamSister

developerguides:与MakerDAO的智能合约,SDK,API,产品和合作伙伴集成的开发人员指南 开发人员指南和教程 开发人员可以使用Maker协议的一个或多个组件来构建各种体验。 此存储库包含指南和教程,以帮助您通过与智能合约,SDK,API和产品进行接口来理解与Maker Protocol集成的各种方法。 所有指南均按部分进行组织,并按每个部分的熟练程度进行组织。 戴 储蓄率(DSR) 金库 紧急关机 Maker协议/多抵押代号 多抵押Dai族的介绍和概述:MCD101 使用MCD-CLI在Kovan上创建和关闭文件库 使用Seth在Kovan上创建和关闭文件库 抵押拍卖整合指南 将新的抵押类型添加到Maker Protocol-Kovan 汇率机制简介 守护者 守护者指南回购 拍卖老板设置指南 简单套利守护者 做市商 开发者工具 测试链指南 塞思导论 使用DSProxy 如何构建Dai.js钱包插件 OasisDEX协议 OasisDEX协议简介 如何在OasisD 立即下载

相关推荐

YonSuite如何新增用户并分配角色角色授权图文教程

用友YonSuite产品基础教学

ct341688的博客 618

链客技术开发

调用sdk 执行智能合约时,query和invoke所需的证书或者权限一样吗?大家有知道的吗? 答:一样的,这个应当是没有分的要分的话得做特别处理了 Merkle树在区域体中作为存储结构真实存在吗?还是说只是一个计算过程用到的临时数据结构?一个区块体分两部分,第一部分存Merkle树,第二部分存一笔一笔的交易数据,不知这么理解是否正确? 答:.在block中笼统有两部分 BlockHeader b...

weixin_44172023的博客 326

Word论文插入带有方括号序号的参考文献——尾注+交叉引用

文章目录1. 尾注功能2. 为参考文献的序号添加方括号3. 调整参考文献前的序号大小4. 重复引用同一参考文献5. 将交叉引用的序号改为带有方括号的上标序号格式6. 删除参考文献前的尾注横线 1. 尾注功能 首先使用尾注功能顺序插入参考文献,暂时不考虑方括号问题,具体操作如下: ① 将光标放在需要插入参考文献角标的地方 ② 在word菜单栏,“引用-脚注部分右下角箭头”(用来设置尾注格式) ③如...

Your_Raymond的博客 9万+

Hyperledger Fabric 智能合约实战 (5) sdk node软件安装

安装node 的fabric-ca-client和fabric-client npm install fabric-ca-client npm install client 安装 fabric-network npm install fabric-network 设置一个参数,否则会有错误"javascript heap of memory". export NODE_OPTIONS=–max_old_space_size=4096 node 升级到稳定版: n stable 安装需要插.

thefist的专栏 337

从零开始:QNX SDP 8.0开发环境搭建与实战入门

本文详细介绍了如何从零开始搭建QNX SDP 8.0开发环境并进行实战入门。内容涵盖许可证获取、环境安装、命令行与IDE工具使用、BSP构建、系统镜像生成,以及编写、编译和运行第一个QNX程序的全过程。旨在帮助嵌入式开发者,特别是汽车电子和工业控制领域的工程师,快速掌握这一实时操作系统(RTOS)的开发基础。

weixin_29163857的博客 641

深入Luckfox Pico的Web界面:从Angular前端到CGI后端的RV1106 IPCWeb全栈解析

本文深入解析了基于瑞芯微RV1106芯片的Luckfox Pico设备上,IPCWeb全栈解决方案的架构与部署。详细介绍了如何通过SDK编译配置,将现代Angular前端框架与高效的C++ CGI后端结合,并利用nginx和FastCGI在嵌入式环境中构建稳定、高性能的Web管理界面,为物联网设备开发提供了完整的实战参考。

3a9bq4r8t2y的博客 277

java契约_第三章 通过java SDK 实现个性化智能合约的部署与测试

1 packagecustomTest;23 importjavafx.concurrent.Service;4 importorg.fisco.bcos.Application;5 importorg.fisco.bcos.solidity.Asset;6 importorg.fisco.bcos.temp.HelloWorld;7 importorg.fisco.bcos.web3j.cryp...

weixin_34449520的博客 334

C/C++_五大常规算法_分治算法

分治法 一个装有 16 枚硬币的袋子,16 枚硬币中有一个是伪造的,伪造的硬币和普通硬币从表面上看不出有任何差别,但是那 个伪造的硬币比真的硬币要轻。现有给你一台天平,请你在尽可能最短的时间内找出那枚伪造的硬币。 常规思维: 每次从待比较的硬币中取两枚进行计较,如果天平平衡(相等)就继续取剩下的硬币进行比较 继续以上过程,直到找到硬币。 强者思维: 我们先将 16 枚硬币分为左右两个部分,各为 8 个硬币,分别称重,必然会有一半轻一半重,而我们要的就是轻的那组,重 的舍去。接下来我们继续对轻的进行五五分

weifc-wei 的博客 2725

Fabric(v2.0)官方文档-超级账本Fabric智能合约(链码)APIs & 应用SDKs

APIs Hyperledger Fabric提供了许多api来支持使用多种编程语言发智能契约(chaincode)。智能合约APIs可用于Go, Node.js和Java。 Go contract-api. Node.js contract APIandNode.js contract API documentation. Java contract APIandJava con...

pineappleli的博客 2362

手把手教你用ROS2 Humble给PX4无人机写个“画圆”程序:从C++代码到Gazebo仿真全流程

本文详细介绍了如何使用ROS2 Humble和PX4飞控实现无人机圆形轨迹控制,涵盖从环境配置、Gazebo仿真到C++代码实现的完整流程。通过实战教程,读者将掌握轨迹跟踪仿真的核心技术,包括ROS2与PX4的通信接口、圆形轨迹算法设计及Gazebo仿真调试技巧。

weixin_29056781的博客 257

ROS开发者的福音:用Anaconda虚拟环境解决Python包冲突(附完整配置流程)

本文为ROS开发者提供了使用Anaconda虚拟环境解决Python包冲突的完整方案。通过分析冲突根源,详细介绍了Miniconda安装、专用环境创建以及核心桥梁包的配置流程,并阐述了“混合环境运行”与“纯虚拟环境构建”两种实战工作流,帮助开发者实现ROS核心与特定Python库的和谐共存,从而提升开发效率和项目可维护性。

weixin_28835789的博客 338

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

何通过只与单条链交互连接Axelar的EVM链发送Token至Centrifuge等DeFi平行链。

Moonbuilder的博客 2224

中科大大数据学院2023年保研夏令营机试题目【无offer,直接放题了~】(2023.07.22下午14:35-17:35考试)

给定一串数字,最后一个数是0表示结尾,表示数字串的终止,为无效数字。将该数字串存储在双向链表中,判断是否为回文串,若是,则输出Yes,否则输出No.

m0_51339444的博客 1922

以太坊学习笔记(二):通过SDK调用以太坊合约

环境准备 搭建以太坊链 详细可参考之前博客以太坊学习笔记(一) 1、创建创世块文件 { "config": { "chainId": 10001, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 }, "alloc" : {}, "coinbase" : "0x0000000000000000000000000000000000000000", "di

卢舍那 8713

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

从 NEAR Intents 事件看 NEAR 智能合约安全

2026年9月29日至10月1日,攻击者利用NEAR Intents存款退款处理中的校验缺陷,通过填充代币和恶意receiver合约触发超额退款请求,使回调失败后内部余额未被撤销,造成缺乏资产支持的可花费余额。攻击者据此从BNB Chain上的HOT Bridge金库七笔提现共转出3,865,021 USDT。项目方于10月2日部署修复、10月7日移除存款通知功能,并于同日宣布资金全额归还,后续事后报告确认受影响用户已获补偿。

BlockSec的博客 261

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

深入理解 Leaf-Spine:从网络拓扑到 AI 数据中心 Fabric

传统数据中心网络以树形三层架构为主,但随着东西向流量激增,其层级多、路径长、扩展难等问题凸显。为此,Leaf-Spine叶脊架构应运而生,通过全互联的扁平化设计,实现多路径转发、高带宽、低时延与灵活横向扩展。结合ECMP负载分担、Underlay/Overlay分离架构及VXLAN/EVPN技术,该架构有效支撑云计算、AI训练等高密度内部通信需求。其核心价值在于:网络设计需匹配业务流量模型,强调可预测性、可靠性与可扩展性。未来,叶脊架构将持续演进,成为高性能数据中心的基石。

一名热爱技术、专注实践的工程师,拥有一项实用新型专利及一项软件著作权。曾获国家级奖项7项、省级奖项30余项。专注网络技术与 AI Infra 领域,持续探索技术创新与工程实践,记录学习成长,分享技术经验,在探索中突破,在实践中精进。 275

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

期货保证金占用变多,怎样找出哪张合约增得最多?

盘中看了两次期货账户,第二次发现保证金占用多了。眼下占用最大的合约很显眼,但它不一定是这段时间增得最多的。如果复盘想知道“先查哪张”,要按前后差额排,不是按第二次的金额排。

weixin_49134609的博客 202

什么是加密货币凭证?

本文探讨了加密货币凭证对数字身份管理的变革性影响,强调了其核心优势,如增强的安全性和即时验证。它通过利用区块链的去中心化技术,解决了与凭证伪造、丢失和低效验证过程相关的问题。读者将了解到加密货币凭证如何在教育、专业认证和医疗等领域提供防篡改和全球可访问的解决方案。文章深入探讨了实际应用,展示了像麻省理工学院、项目管理协会和等组织为什么采用区块链凭证来简化流程并提升信任。

2301_77604523的博客 130

空圈容错・优快云 站点技术架构信任链诊断

本文为基于公开故障现象的黑箱架构推演报告,聚焦“监控健康但用户访问异常”共性问题。提出C/M/V/P四层可达性分析框架,强调V层需满足数据源、方法、环境三异才具仲裁能力。通过R1–R10探针识别架构风险,揭示同源校验、配置共担、降级粗放等隐患。诊断指出:进程存活≠链路通畅,200状态码≠内容正确。配套8问自测清单与∅_safe分级降级方案,推动从“全好/全崩”到“半坏可控”的可观测跃迁。所有推断假说需依赖图谱与压测验证,不构成线上定论。

Liaiyang66的博客 365

期货合约还有历史K线,就表示现在还能交易吗?

打开以前保存的期货研究资料,某个合约的K线仍能正常显示,过去的价格、成交量也都在。看着熟悉的图,容易顺势觉得:既然还能看,这个合约应该仍可作为当前交易对象。但图里保存的是过去发生过什么,当前合约状态回答的是它现在处于什么生命周期。历史K线仍在,与合约已经下市可以同时成立。对研究者来说,更有用的处理不是在“继续盯它”和“删掉旧图”之间二选一,而是把历史档案与当前关注对象分开。TqSdk提供的合约下市标志,可以帮助把这层区别标明白。

weixin_49134609的博客 182

FPGA 与加密行业:从算法加速到可信硬件的完整技术图谱

本文系统探讨FPGA与密码学的深度交叉,揭示其在加密加速、区块链基础设施、零知识证明及后量子密码中的关键作用。从底层硬件特性到工程实践,分析对称加密、公钥算法、零知识证明等负载的FPGA加速优势,强调其高能效、低延迟与灵活可重构的特性。结合当前密码学复杂度上升与硬件竞争加剧的趋势,指出FPGA是算法验证与高性能实现的理想载体,为安全计算提供高效硬件支撑。

weixin_49780322的博客 243

期货成交额变大,为什么成交手数反而少了?

比较同一期货合约两个交易日的成交情况,可能看到:成交额比前一天高,成交手数却少了。若把成交额大直接理解成“交易得更多”,这两项看起来就会互相打架。其实,金额和手数不是同一把尺子。手数描述成交数量,金额还包含成交价格及相应计量口径的影响。两者反向变化并不构成逻辑矛盾。用TqSdk整理这类观察,关键不是挑一个看起来更大的数,而是把原始量、额及各自口径留下来,回答不同的问题。

shinnyringo的博客 143

期货分钟线中间少了一段,怎么查是不是休市?

复盘一份已经保存的期货分钟线,10:14 后直接跳到 10:30,另一处却是 10:42 后跳到 10:44。屏幕上两处都没连起来,处理起来并不一样:如果当天确实在第一段休息,不用补;如果 10:43 落在交易时段里,则要回查原始记录和样本覆盖。

lisiccwss的博客 129

【量化实战】VeighNa 全图谱:从零到一,由浅入深打通多品种量化

本文系统梳理了VeighNa量化平台的四阶进阶路径:从接口与数据分离(第一阶段),到策略逻辑对齐(第二阶段),再到数据平替与自动化执行(第三阶段),最终拓展至多市场实战(第四阶段)。针对新手常见痛点,提供免费数据源(如AKShare、天勤)、交易规则避坑指南及参数配置建议,强调A股仅支持做多、乘数需匹配品种特性。最后给出可落地的行动路线图,助力用户由浅入深打通全市场量化体系。

qq_72758246的博客 280

美股行情API遇上冬令时:盘前盘后时间怎么对齐?

摘要:负责美股行情页和开盘提醒的产品经理,冬令时切换后需要一起核对交易时段、北京时间和交易日期。本文结合TickDB交易时段、交易日历的真实返回,解释盘前盘后怎样换算,为什么凌晨收盘仍属于美国前一个交易日,并提供时间对照表、可运行换算示例与页面检查清单,处理半日交易等容易遗漏的例外。

2511_94663557的博客 267
上一篇: DAM Finance获得来自Arrington和Moonbeam生态增长基金的战略投资
下一篇: Moonriver在Kusama的第1年
Web3 MoonBuilder
博客等级 码龄5年 568粉丝 381原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值