Module vs Script
前端与 Move 合约交互
前端与 Move 合约交互,调用模块中的方法还是调用脚本中的方法
在与 Move 语言编写的智能合约进行交互时,通常有两种方式来执行交易:调用模 块中的方法(也称为函数或过程),或者执行脚本。
-
调用模块中的方法:在 Move 语言中,模块包含类型定义、资源定义以及可以被账户调用的函数。当你想要执行与链上资源交互的操作时,比如转账代币或者更新某种状态,你会调用模块中定义的公共函数。这些函数通常会被设计为可以被外部账户直接调用,并且会包含一些逻辑来修改链上状态。
-
执行脚本:脚本是一种特殊类型的 Move 程序,它们被设计为一次性的交易。脚本通常用于执行不需要永久存储在链上的逻辑,比如初始化一些设置或者触发特定的链上操作。脚本可以调用模块中的函数,但是它们本身并不在链上永久存储。
在 Move 语言的早期版本中,交互通常是通过发送脚本来完成的,这些脚本包含了调用模块中函数的代码。然而,随着 Move 语言的发展,它引入了直接调用模块中函数的能力,这样就不再需要包装在脚本中了。
具体你应该使用哪种方式取决于你所使用的区块链平台和它的当前实现。例如,Diem(原 Libra)在其后期的测试网版本中支持了直接调用模块中的函数,而在早期版本中则需要使用脚本。
在前端与 Move 合约交互时,你需要使用区块链提供的客户端库或 API。这些工具通常会处理与区块链通信的细节,并提供调用合约函数或发送脚本的接口。
例如,如果你使用 JavaScript 和 Aptos 的客户端库进行交互,你的代码可能会像这样:
// 初始化客户端库
const aptosClient = new AptosClient(nodeUrl);
// 构造交易,调用模块中的函数
const payload = {
type: 'entry_function_payload',
function: '0x1::ModuleName::function_name',
arguments: [...functionArguments],
type_arguments: [...typeArguments],
};
// 发送交易
const txnResponse = await aptosClient.submitTransaction(account, payload);
在实际开发中,你应该参考你所使用区块链的文档,了解如何与 Move 合约进行交互,以及如何构造和发送交易。
module vs Java 类
这么理解:Module(模块)用于封装数据,和编辑数据,类似 java 的类声明,而 Script(脚本)则是业务逻辑的实现?
是的,在 Move 语言中,你确实可以在模块中编写可以被外部调用的公共函数,这些函数可以执行特定的业务逻辑。然而,脚本和模块中的公共函数在使用场景和目的上有所不同。
-
模块中的公共函数:模块中的公共函数通常用于定义可重用的逻辑,这些逻辑可以被区块链上的其他模块或脚本调用。这些函数可以修改模块内部定义的数据结构和资源。模块一旦部署到区块链上,其代码就变得不可变,除非进行显式的升级操作。
-
脚本:脚本用于执行一次性的、不需要永久存储在区块链上的操作。脚本通常用于初始化模块中定义的资源、执行交易(如转账)、或者调用模块中的公共函数来改变链上状态。脚本在执行后不会留在区块链上,只有它们产生的效果(如状态变更)会被记录。
虽然你可以在模块中定义公共函数来实现特定的业务逻辑,但使用脚本进行交易具有以下优势:
- 灵活性:脚本允许用户在不改变现有模块的基础上构造新的交易。用户可以根据需要编写和执行脚本来与链上模块进行交互。
- 隔离性:脚本在执行时是隔离的,它们不会直接修改模块的持久化状态,而是通过调用模块的公共函数来进行交互。这有助于保护模块的内部状态不被不当操作破坏。
- 安全性:脚本执行完毕后,代码本身不会存储在区块链上,从而不会增加链上的状态复杂性或成为潜在的安全隐患。
总的来说,脚本提供了一种安全、灵活的方式来执行一次性操作,而模块中的公共函数更适合定义可重用的业务逻辑。在实际应用中,通常会结合使用模块和脚本来构建复杂的区块链应用程序。
module vs script
既然,Module(模块)可以暴露方法,我直接将 Script(脚本)的代码在 Module 中书写不也可以吗?
是的,在 Move 语言中,你确实可以在模块中编写可以被外部调用的公共函数,这些函数可以执行特定的业务逻辑。然而,脚本和模块中的公共函数在使用场景和目的上有所不同。
-
模块中的公共函数:模块中的公共函数通常用于定义可重用的逻辑,这些逻辑可以被区块链上的其他模块或脚本调用。这些函数可以修改模块内部定义的数据结构和资源。模块一旦部署到区块链上,其代码就变得不可变,除非进行显式的升级操作。
-
脚本:脚本用于执行一次性的、不需要永久存储在区块链上的操作。脚本通常用于初始化模块中定义的资源、执行交易(如转账)、或者调用模块中的公共函数来改变链上状态。脚本在执行后不会留在区块链上,只有它们产生的效果(如状态变更)会被记录。
虽然你可以在模块中定义公共函数来实现特定的业务逻辑,但使用脚本进行交易具有以下优势:
- 灵活性:脚本允许用户在不改变现有模块的基础上构造新的交易。用户可以根据需要编写和执行脚本来与链上模块进行交互。
- 隔离性:脚本在执行时是隔离的,它们不会直接修改模块的持久化状态 ,而是通过调用模块的公共函数来进行交互。这有助于保护模块的内部状态不被不当操作破坏。
- 安全性:脚本执行完毕后,代码本身不会存储在区块链上,从而不会增加链上的状态复杂性或成为潜在的安全隐患。
总的来说,脚本提供了一种安全、灵活的方式来执行一次性操作,而模块中的公共函数更适合定义可重用的业务逻辑。在实际应用中,通常会结合使用模块和脚本来构建复杂的区块链应用程序。

module vs script
在 Move 语言中,module 和 script 是两种主要的编程构造,它们在 Move 代码中扮演不同的角色。理解它们的区别对于有效地使用 Move 进行区块链开发非常重要。
Move Module
模块是 Move 语言的核心组成部分,用于定义数据结构、函数、常量等。模块通常被部署在区块链上,并可以包含以下元素:
- 资源和结构体:定义数据类型,可以包括 Move 的资源类型。资源是一种特殊的数据类型,其所有权需要明确追踪,不允许被复制或丢弃。
- 函数:可以是公共(public)或私有(private)的,用于执行操作,如数据处理、逻辑判断等。
- 常量:定义可重用的值。