尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Sway 脚本(Script)程序类型:无需部署的链上可执行程序实战指南

Sway 脚本(Script)程序类型:无需部署的链上可执行程序实战指南 Sway 脚本Script程序类型无需部署的链上可执行程序实战指南【免费下载链接】sway Empowering everyone to build reliable and efficient smart contracts.项目地址: https://gitcode.com/GitHub_Trending/sw/sway脚本Script是 Sway 四种程序类型之一它是一段只在交易transaction期间存在、无需部署上链的可执行代码常被用来实现路由器router等本可通过合约实现的功能从而省去部署成本、避免增加区块链体积。阅读本文后你将掌握脚本的定义与三大核心特性、典型应用场景、最小可运行示例以及它与合约、谓词、库之间的边界并能在 Sway 项目中直接上手编写和编译脚本。脚本是什么根据 Sway 程序类型文档脚本是一个无需部署的可执行程序因为它只在一次交易期间存在。它不占据区块链上的持久空间也不会像合约那样拥有链上地址与可复用的接口交易一旦结束脚本的执行环境即随之消失。Sway 项目的所有源码文件都以.sw结尾且文件第一行必须声明程序类型。脚本项目的入口文件通常为main.sw第一行写作script;例如 simple_script 示例script; // All scripts require a main function. The return type is optional. fn main(amount: u64) - bool { true }script;关键字声明了该文件属于脚本程序类型。脚本以main()函数作为执行入口这一点在 Sway Program Types 总览 的 Entry Points 一节有明确说明合约暴露 ABI而脚本与谓词都通过main()函数作为入口。脚本的三大核心特性原文档明确列出了脚本的三个关键属性理解它们是区分脚本与其他程序类型的核心1. 不能被合约调用脚本不存在链上部署形态因此没有可供合约引用的 ABI 接口——合约无法调用一个脚本。反过来脚本可以在交易中调用一个或多个合约。这意味着脚本天然适合作为一次性调用方把复杂的跨合约交互组织在单次交易内完成。2. 无状态但可通过合约与存储交互脚本自身不持有任何存储状态stateless每次交易都是全新的执行。但它可以通过调用合约来间接读写合约的存储——存储始终归属于合约脚本只是交易的执行主体。因此无状态并不意味着无法操作数据只是数据必须以合约存储、UTXO 等形式存在链上而不是脚本自身维护。3. 可以调用多个合约单个脚本可以在一次交易中串行或按逻辑调用多个合约这正是它被广泛用于路由、聚合等场景的根本原因。仓库中的 multi_contract_calls 示例 以及 wallet_contract_caller_script 示例 都属于典型的脚本项目由脚本作为调用者在交易中发起对合约的调用。典型应用场景Sway Program Types 总览 对脚本用途给出了更具象的描述用于复杂、多步的链上交互且交互结果不会持久化例如使用去中心化交易所创建杠杆头寸借贷 → 兑换 → 追加抵押物。具体而言脚本的典型场景包括路由器Router原文档明确指出脚本可用于复制合约的功能例如路由器而无需部署成本或增加区块链大小。用户通过脚本在一次交易内把资产路由到多个池子完成兑换路由逻辑随交易结束即释放不在链上留下部署痕迹。多步组合操作借贷、兑换、再抵押等多步骤操作可以编排在一个脚本中按顺序完成保证单笔交易内的原子性。临时性链上逻辑凡是不需要持久复用、只为某一笔交易服务的逻辑都适合写成脚本。与其他程序类型的边界把脚本放入 四种 Sway 程序类型 的坐标系中可以更清楚地看到它的定位程序类型是否部署上链入口核心用途合约contract部署持久的字节码ABI 接口协议或固定规则系统如质押、DEX 等脚本script不部署仅存在于交易中main()函数复杂多步链上交互、路由器等一次性逻辑谓词predicate不部署但根哈希在链上作为 UTXO 所有者main()函数必须返回trueUTXO 花费条件如多签谓词库library不部署代码被导入复用无入口点通用操作的复用代码与脚本最相似的是谓词谓词文档 指出谓词同样由单个main()函数构成同样存在于交易期间区别在于谓词的执行结果是交易的 UTXO 花费条件必须返回布尔值true交易才有效且谓词不能读写任何合约状态、不能使用合约指令而脚本没有这些限制。另外注意项目层面的约束一个项目可以包含多个库文件但至多只能包含一个合约、脚本或谓词且三者不能混用见 Sway Program Types 总览 的 Sway Project Types 一节。最小脚本示例解析原文档给出的最小示例对应仓库中的 simple_script 项目script; // All scripts require a main function. The return type is optional. fn main(amount: u64) - bool { true }逐行解读第 1 行script;声明程序类型为脚本这是脚本项目入口文件的强制要求。第 4 行fn main(amount: u64) - bool定义入口函数main。该函数接收一个u64类型的参数amount来自交易输入返回类型为bool。第 5 行true以隐式返回无分号的末行表达式方式返回布尔值true。注释特别说明所有脚本都必须有main函数但返回类型是可选的——如果不需要向外部返回数据main()可以不声明返回类型。与 函数返回值文档 中描述的规则一致脚本main()的返回类型必须与函数签名声明匹配可以使用return关键字的显式返回也可以使用省略分号的隐式返回。脚本项目的 Forc.toml脚本项目同样由forc管理其清单文件 simple_script/Forc.toml 结构如下[project] authors [Fuel Labs contactfuel.sh] entry main.sw license Apache-2.0 name simple_script [dependencies] std { path ../../../../../../../../sway-lib-std }与合约、谓词项目一样[project]表声明项目元数据name为项目名entry指向入口文件默认main.swauthors与license为作者与许可信息[dependencies]引入标准库std。脚本要使用std提供的基础设施时同样以依赖形式引入当前示例通过相对路径指向仓库内的 sway-lib-std 源码目录。脚本在源码层面的印证脚本作为一等程序类型在工具链的多个层面都有明确实现与大量真实用例程序类型枚举forc的命令行工具在 forc/src/utils/program_type.rs 中定义了ProgramType枚举包含Contract、Script、Predicate、Library四个变体其中Script对应字符串script用于识别与处理脚本类型的项目。大量脚本示例项目仓库 examples 目录下众多示例以script;开头编写例如 arrays 示例、hashing 示例、match_expressions 示例 等可作为编写脚本的实战参考。跨合约调用示例wallet_contract_caller_script 演示了脚本在交易中调用钱包合约的完整写法与本文所述脚本可调用多个合约的特性一一对应。如何构建与使用脚本脚本项目使用forc工具链进行管理核心构建命令为forc buildforc 的命令集详见 forc 项目 及其 README。构建完成后脚本的字节码作为交易的一部分被提交执行——脚本不部署到链上其存在周期与交易生命周期一致这也正是它零部署成本、不增加区块链大小的根本原因。需要注意的是脚本的执行依赖 Fuel 虚拟机在交易中的运行环境脚本逻辑应基于当前交易的输入如main()的参数驱动而非依赖跨交易的持久状态所有需要长期保存的数据都应通过调用合约的存储来间接实现。【免费下载链接】sway Empowering everyone to build reliable and efficient smart contracts.项目地址: https://gitcode.com/GitHub_Trending/sw/sway创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表