脚本是在链上可运行的字节码,它执行一次以执行某些任务。它不代表任何资源的所有权,也不能被合约调用。脚本可以返回任意类型的单个值。
脚本是状态感知的,因为虽然它们没有持久性存储(因为它们只存在于交易期间),但它们可以调用合约并根据返回的值和结果执行操作。
以下是一个调用合约的示例脚本:
script;
use wallet_abi::Wallet;
fn main() {
let contract_address = 0x9299da6c73e6dc03eeabcce242bb347de3f5f56cd1c70926d76526d7ed199b8b;
let caller = abi(Wallet, contract_address);
let amount_to_send = 200;
let recipient_address = Address::from(0x9299da6c73e6dc03eeabcce242bb347de3f5f56cd1c70926d76526d7ed199b8b);
caller
.send_funds {
gas: 10000,
coins: 0,
asset_id: b256::zero(),
}(amount_to_send, recipient_address);
}
类似于断言,脚本依赖于一个 main()
函数作为入口点。您可以从 main()
函数中调用脚本中定义的其他函数,或通过 ABI 转换 调用另一个合约。
脚本的一个示例用例是通过多个去中心化交易所交易资金以获取输入资产价格的路由器,或者通过闪电贷重新调整抵押债务头寸的脚本。
与可以直接调用合约的 EVM 交易不同(但只能调用单个合约),Fuel 交易执行一个脚本,该脚本可能调用零个或多个合约。Rust 和 TypeScript SDK 提供了调用合约方法的函数,就像直接调用合约一样。在底层,SDK 将所有合约调用包装在脚本中,该脚本包含最小的代码,只需进行调用并将脚本数据作为调用参数转发。