Scaffold Move 使用指南 | Move dApp 极速入门(贰拾捌)
2025-01-26 21:02
Leeduckgo
2025-01-26 21:02
订阅此专栏
收藏此文章

Demo Video: https://youtu.be/Erja2sIpR6U

Online: https://scaffold.rootmud.xyz

Github: https://github.com/NonceGeek/scaffold-move

Homepage: https://home.scaffold.rootmud.xyz

💡 感谢 Fynn 助力这个版本的 Scaffold Move ฅ^•ﻌ•^ฅ! 

0x01 什么是 Scaffold Move dApp 脚手架?

💡What is Scaffold-Move?

A modern, clean version of Scaffold-Move with NextJS, Supabase & Deno, strong-AI-powered in the future.

基于 NextJS、Supabase 和 Deno 技术栈的 Scaffold-Move 的现代、干净版本,未来将由强大的人工智能驱动。

灵感来自于Scaffold-ETH,它是 Ethereum 生态中的「经典公共物品类项目」。Scaffold-ETH主页:

https://scaffoldeth.io/

Scaffold 对于任何生态来说都是非常必要的基础型项目,因为 Scaffold 可以降低 dApp 开发者 90% 以上的工作量。然而,Move 生态中的 Scaffold 类项目还在非常早期的阶段。

此外,现有的 Scaffold 项目存在如下的升级空间:

  • 现有的 Scaffold 尚未和 AI 进行强结合,充分发挥 AI 在 Dev 中的能力
  • 现有的 Scaffold 生态尚未出现完善的激励措施,依然是 Web2 的开源模式

NonceGeekDAO 致力于开发多种类型的脚手架,为 Buidlers 提供极速⚡搭建 dApp 的方式:

+-------------------+  
| Scaffold-Move  🪜 |  
+-------------------+ 
+-------------------+
|Scaffold-GPT-Bot 🏗️|   
+-------------------+  
+-------------------+  
|  Scaffold-AO 🔨   |  
+-------------------+  
+-------------------+
|  Scaffold-ETH 🛠️  |
+-------------------+

0x02 Scaffold-Move 快速上手

2.1 合约部署

我们通过 Aptos CLI 和 Movement 网络进行交互。

💡关于 Aptos CLI 的更多用法见文章:

Aptos CLI 使用指南与 REPL 设计建议 | Move dApp 极速入门(六)

2.1.1 安装 Aptos CLI

安装 Aptos CLI。

见:

https://aptos.dev/cli-tools/aptos-cli-tool/install-aptos-cli

一般而言,推荐直接使用预编译工具( precompiled binary )的方式,这样会省去编译中可能遇到的错误。

2.1.2 账户初始化

通过如下方式初始化一个在 porto 测试网上的账户:

$ aptos init --network custom --rest-url https://aptos.testnet.porto.movementlabs.xyz/v1 --profile movement_acct_1

在主网上线后,只要把 --rest-url  替换为主网节点地址即可。

$ aptos init --network custom --rest-url https://aptos.testnet.porto.movementlabs.xyz/v1 --profile movement_acct_1
Configuring for profile movement_acct_1
Configuring for network Custom
Using command line argument for rest URL https://aptos.testnet.porto.movementlabs.xyz/v1
Enter your faucet endpoint [Current: None | No input: Skip (or keep the existing one if present) | 'skip' to not use a faucet]

No faucet url given, skipping faucet...
Enter your private key as a hex literal (0x...) [Current: None | No input: Generate new key (or keep one if present)]

No key given, generating key...
Account 0x6e7c05076c385337c5ea2dc522c7f147bb6ad7f60c16d68f6777bde658d12126 has been initialized locally, but you must transfer coins to it to create the account onchain

---
Aptos CLI is now set up for account 0x6e7c05076c385337c5ea2dc522c7f147bb6ad7f60c16d68f6777bde658d12126 as profile movement_acct_1!  Run `aptos --helpfor more information about commands
{
  "Result""Success"
}

在初始化的时候会让我们输入 faucet endpoint 地址领取测试币,我们填空即可。随后通过如下页面领取测试币:

https://faucet.movementnetwork.xyz/?network=testnet

2.1.3 下载 Scaffold-Move

# 下载源码并进入目录
$ git clone https://github.com/NonceGeek/scaffold-move.git
cd scaffold-move

2.1.4 合约编译与部署

编译合约以生成二进制代码,编译通过后可进行部署。

$ aptos move compile --package-dir ./contracts/hero --named-addresses hero=movement_acct_1
$aptos move compile --package-dir ./contracts/hero --named-addresses hero=movement_acct_1
...
{
  "Result": [
    "6e7c05076c385337c5ea2dc522c7f147bb6ad7f60c16d68f6777bde658d12126::hero"
  ]
}

部署:

$ aptos move publish --package-dir ./contracts/hero --named-addresses hero=movement_acct_1 --profile movement_acct_1
$ aptos move publish --package-dir ./contracts/hero --named-addresses hero=movement_acct_1 --profile movement_acct_1
Compiling, may take a little while to download git dependencies...
...
package size 7437 bytes
Do you want to submit a transaction for a range of [545200 - 817800] Octas at a gas unit price of 100 Octas? [yes/no] >
yes
{
  "Result": {
    "transaction_hash""0x41b176ca7f823bfc57a842202135f458dfa19a0f74f14f9d3852c86d9fcc4c7f",
    "gas_used": 5452,
    "gas_unit_price": 100,
    "sender""6e7c05076c385337c5ea2dc522c7f147bb6ad7f60c16d68f6777bde658d12126",
    "sequence_number": 0,
    "success"true,
    "timestamp_us": 1735302126711277,
    "version": 204080358,
    "vm_status""Executed successfully"
  }
}

在部署后可以在浏览器上查看到结果:

https://explorer.movementlabs.xyz/account/0x6e7c05076c385337c5ea2dc522c7f147bb6ad7f60c16d68f6777bde658d12126/modules/code/hero?network=testnet

image-20241227202427101

2.2 dApp 配置与部署

# install
$ yarn
# modify the configuration
$ vim .env.local
# start with dev mode
$ yarn dev
# buidl
$ yarn build
$ yarn vercel --prod # 推荐部署到 vercel 托管平台上

修改 .env.local 中的 NEXT_PUBLIC_DAPP_ADDRESS 为你部署的合约的地址。

托管到 Vercel:

image-20250126131313386

0x03 dApp 功能介绍

3.1 钱包连接

image-20250126202003345

目前支持了 NightlyPetraOKX三种主流钱包👛。

3.2 钱包、账户与网络信息显示

image-20241228052424898

3.3 签名与签名验证

image-20241228052541631

签名成功提示:

image-20250126202032863

签名 + 验签成功提示:

image-20250126202048844

3.4 资源查看

view balance为例:

image-20250126202426561

源代码:

const getBalance = useCallback(async () => {
  if (!adapter || !aptos) return;
  const account = await adapter.account();
  const balance = await doGetBalance(aptos, account.address.toString());
  toast({
    title: "balance",
    description: balance!.toString(),
  });
}, [aptos, account]);

async function doGetBalance(aptos: Aptos, accountAddress: string{
  const [balance] = await aptos.view({
    payload: {
      function: "0x1::coin::balance",
      typeArguments: ["0x1::aptos_coin::AptosCoin"],
      functionArguments: [accountAddress],
    },
  })
;
  return balance;
}
...
<button
  onClick={getBalance}
  className="px-4 py-2 bg-blue-500 text-white rounded-md hover:bg-blue-600 transition-colors"
  // disabled={!connected || !adapter || !aptos}
>
  View Example: Get Balance
</button>

3.5 函数调用

以调用  transfer  函数为例:

image-20250126202539305

源代码:

const handleTransaction = useCallback(async () => {
  // Docs: https://docs.nightly.app/docs/aptos/solana/connect
  // console.log("info", account, adapter, aptos);
  if (!account?.address) return;
  const network = await adapter?.network();
  if (network?.chainId !== 177) {
    try {
      await adapter?.changeNetwork({ name: Network.TESTNET, chainId: 177 });
    } catch (error) {
      console.error("Failed to change network:", error);
    }
  }
  const aptosConfig = new AptosConfig({
    network: network?.name || Network.TESTNET,
  });
  const aptosClient = new Aptos(aptosConfig);
  const transaction: InputGenerateTransactionPayloadData = {
    function: "0x1::coin::transfer",
    typeArguments: ["0x1::aptos_coin::AptosCoin"],
    functionArguments: [
      "0x960dbc655b847cad38b6dd056913086e5e0475abc27152b81570fd302cb10c38",
      100,
    ],
  }
;

  const userResponse = await signAndSubmitTransaction({
    payload: transaction,
  });

  if (userResponse.status !== UserResponseStatus.APPROVED) {
    throw new Error(userResponse.status);
  }
  // Confirm withdraw in backend
  const hash = (userResponse as unknown as { args: { hash: string } }).args
    .hash;
  try {
    await aptosClient.waitForTransaction({ transactionHash: hash });
  } catch (error) {
    console.error(error);
  }

  toast({
    title: userResponse.status,
    description: "This transaction has been " + userResponse.status,
  });
}, [account]);

...
<button
  onClick={handleTransaction}
  className="px-4 py-2 bg-blue-500 text-white rounded-md hover:bg-blue-600 transition-colors"
  // disabled={!connected || !adapter || !aptos}
>
  Send Transaction Example: Transfer
</button>

0x04 理想的 dApp 脚手架是怎样的?

4.1 充分实践服务 DeveloperGC 的 Web3 激励机制

通过链上协议,进行 开发者贡献 的智能结算与智能分配,鼓励通过开源协作的形式完善 Scaffold 案例,本质上相当于实现 Scaffold-Move-DAO

4.2 AI Friendly

通过自治(Autonomous)的向量数据库,实现资料库从互联网与开发者社区多个渠道自扩充,在此基础上加入 LLM 支持,进一步降低开发者的心力负担与时间成本。

+--------------------+              +---- From Internet
|      VectorDB      |  Data Growth |
|       about        |<-------------+---- From Dev Community
| Contract/dApp Code |              |
+--------------------+              +---- ...
          ↓ Feed
+--------------------+      +----------------+
|        LLM         |----->| Scaffold-Move  |---+--- Generate Contract Code
+--------------------+      +----------------+   |
                                                 +--- Generate dApp Code

最简带属性 NFT 合约实现 | Move 全链游戏开发(贰拾柒)
Move 智能合约生产环境升级实践 | Move dApp 极速入门(贰拾陆)
Aptos Cheatsheets | Move dApp 极速入门(贰拾伍)
Aptos 中文区全球线上黑客松!奖池 $12K+
Aptos Token Object V2 | Move dApp 极速入门(贰拾肆)
可編程交易塊 | Move dApp 極速入門(貳拾叁)
Aptos 密鑰輪換 | Move dApp 極速入門(貳拾貳)
Aptos 对象模型 | Move dApp 极速入门(贰拾壹)
Aptos Moveflow SDK 使用指南 | Move dApp 极速入门(贰拾)
Sui 上简单 Swap 的实现 | Move dApp 极速入门(拾玖)
用 Elixir 交互 Aptos |  Move dApp 极速入门(拾捌)
Sui 链上数据查询 | Move dApp 极速入门(拾柒)
SUI 合约测试攻略 | Move dApp 极速入门(拾陆)
Sui 数据类型详解 | Move dApp 极速入门(十五)
Airdropper Contract in Aptos | Move dApp 极速入门(拾肆)
Sandwich 合约案例实践 | Move dApp 极速入门(拾叁)
Sui  | Move dApp 
Move  | 
Move  | 
scaffold-aptos  | Move dApp 
Aptos NFT  | Move dApp 
 DID Document  | Move dApp 
DID | Move dApp 
Aptos  | Move dApp 
Aptos CLI使REPL | Move dApp 
 DID  | Move dApp 
 | Move dApp 
 | Move dApp
 Move dApp | Move dApp
Hello Move | Move dApp

【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。

Leeduckgo
数据请求中
查看更多

推荐专栏

数据请求中
在 App 打开