Skip to content

Latest commit

 

History

History
459 lines (348 loc) · 14.1 KB

File metadata and controls

459 lines (348 loc) · 14.1 KB

NULS智能合约测试工具使用说明

简介

NULS智能合约测试工具采用前后端分离架构:

  • 前端: contract-tool.html - 提供友好的用户界面
  • 后端: contract-tool-server.js - Node.js服务器,运行SDK处理合约交易

架构设计

┌─────────────────────────────────────────────────────────────┐
│                         浏览器                               │
│  ┌──────────────────────────────────────────────────────┐   │
│  │            contract-tool.html (前端)                  │   │
│  │  - 用户界面                                          │   │
│  │  - 参数收集                                          │   │
│  │  - 结果展示                                          │   │
│  └────────────┬─────────────────────────────────────────┘   │
└───────────────┼─────────────────────────────────────────────┘
                │ HTTP API
                │
┌───────────────▼─────────────────────────────────────────────┐
│          contract-tool-server.js (后端)                      │
│  - Express服务器                                            │
│  - 调用nuls2-js-sdk                                         │
│  - 交易构建和签名                                            │
│  - RPC通信                                                  │
└─────────────────────────────────────────────────────────────┘

功能特性

  • ✅ 前后端分离架构
  • ✅ 支持4个网络环境(主网、测试网、开发网、自定义)
  • ✅ 自动调用info接口初始化网络参数
  • ✅ 完整的创建智能合约流程
  • ✅ 完整的调用智能合约流程
  • ✅ 动态参数输入
  • ✅ 美观的现代化UI设计
  • ✅ 实时日志输出

使用方法

1. 安装依赖

npm install express cors body-parser

2. 启动后端服务

node contract-tool-server.js

启动成功后会显示:

============================================================
NULS智能合约测试工具服务已启动
============================================================
服务地址: http://localhost:3000
前端页面: http://localhost:3000/contract-tool.html
健康检查: http://localhost:3000/api/health
============================================================
API端点:
  POST /api/config-network    - 配置网络环境
  POST /api/create-contract   - 创建智能合约
  POST /api/call-contract     - 调用智能合约
  POST /api/get-address       - 获取地址信息
  GET  /api/health            - 健康检查
============================================================

3. 打开前端页面

在浏览器中访问: http://localhost:3000/contract-tool.html

4. 选择网络环境

工具启动时默认使用开发网(Dev)环境。你可以点击顶部的网络按钮切换环境:

  • 主网 (Main): https://api.nuls.io/jsonrpc
  • 测试网 (Test): https://beta.api.nuls.io/jsonrpc
  • 开发网 (Dev): http://127.0.0.1:18004/jsonrpc
  • 自定义 (Custom): 输入自定义的RPC地址

切换网络后,页面会自动:

  1. 调用RPC的 info 接口获取网络信息
  2. 配置后端SDK使用对应的网络环境

5. 网络信息显示

页面顶部会显示当前网络的配置信息:

  • Chain ID: 链ID
  • Asset ID: 资产ID
  • 地址前缀: 地址前缀(如NULS、tNULS、ITAC等)
  • 符号: 资产符号

创建合约

必填参数

  1. 私钥: 用于签名交易的私钥(十六进制格式)
  2. 合约代码: 合约编译后的字节码(十六进制字符串)

可选参数

  1. 合约别名: 为合约设置一个别名
  2. 构造函数参数: 按顺序输入构造函数的参数值
    • 支持字符串、数字等基本类型
    • 支持JSON数组格式,如: ["value1","value2"]
  3. 备注: 交易备注信息

操作步骤

  1. 在"创建合约"页签中填写必填参数
  2. 根据合约的构造函数添加参数(可添加多个)
  3. 点击"创建合约"按钮

调用合约

必填参数

  1. 私钥: 用于签名交易的私钥(十六进制格式)
  2. 合约地址: 要调用的合约地址
  3. 方法名: 要调用的合约方法名

可选参数

  1. 方法描述: 方法的描述信息(通常可为空)
  2. 转入NULS数量: 需要转入合约的NULS数量(实际值,如200个NULS则输入200)
  3. 方法参数: 按顺序输入方法的参数值
    • 支持字符串、数字等基本类型
    • 支持JSON数组格式,如: ["address1","address2"]
  4. 备注: 交易备注信息

操作步骤

  1. 在"调用合约"页签中填写必填参数
  2. 如需转入NULS,填写数量(工具会自动乘以10^8)
  3. 根据合约方法添加参数(可添加多个)
  4. 点击"调用合约"按钮

参数说明

参数类型处理

工具会自动处理不同类型的参数:

  • 字符串: 直接输入,如 "hello"
  • 数字: 直接输入,如 100000000
  • 布尔值: 输入 truefalse
  • 数组: 使用JSON格式,如 ["item1","item2"][1,2,3]

多个参数

  • 点击"添加参数"按钮可以添加更多参数输入框
  • 点击"删除"按钮可以删除对应的参数
  • 至少保留一个参数输入框

技术说明

架构优势

采用前后端分离架构的优势:

  1. 安全性: 私钥在后端处理,不会暴露在浏览器中
  2. 兼容性: SDK依赖Node.js环境,后端可以完整使用所有功能
  3. 易维护: 前后端职责清晰,便于升级和维护
  4. 可扩展: 可以轻松添加新的API端点和功能

API端点说明

POST /api/config-network

配置网络环境

请求参数:

{
  "network": "main|test|dev|custom",
  "customUrl": "http://...",
  "chainId": 101
}

POST /api/create-contract

创建智能合约

请求参数:

{
  "privateKey": "...",
  "alias": "...",
  "contractCode": "...",
  "args": [...],
  "remark": "...",
  "chainId": 101,
  "assetId": 1,
  "addressPrefix": "NULS"
}

响应结果:

{
  "success": true,
  "message": "合约创建成功",
  "data": {
    "fromAddress": "...",
    "contractAddress": "...",
    "txHash": "...",
    "logs": [...]
  }
}

POST /api/call-contract

调用智能合约

请求参数:

{
  "privateKey": "...",
  "contractAddress": "...",
  "methodName": "...",
  "methodDesc": "",
  "value": 0,
  "args": [...],
  "remark": "...",
  "chainId": 101,
  "assetId": 1,
  "addressPrefix": "NULS"
}

响应结果:

{
  "success": true,
  "message": "合约调用成功",
  "data": {
    "fromAddress": "...",
    "contractAddress": "...",
    "methodName": "...",
    "txHash": "...",
    "logs": [...]
  }
}

工作流程

创建合约完整流程

前端                          后端                          NULS节点
  │                            │                               │
  ├─ 1. 收集参数 ──────────────>│                               │
  │                            ├─ 2. 导入私钥生成地址          │
  │                            ├─ 3. 获取构造函数 ───────────>│
  │                            │<─────────────────────────────┤
  │                            ├─ 4. 预估gas ─────────────────>│
  │                            │<─────────────────────────────┤
  │                            ├─ 5. 获取余额 ────────────────>│
  │                            │<─────────────────────────────┤
  │                            ├─ 6. 构建交易inputs/outputs   │
  │                            ├─ 7. 组装并签名交易           │
  │                            ├─ 8. 验证交易 ────────────────>│
  │                            │<─────────────────────────────┤
  │                            ├─ 9. 广播交易 ────────────────>│
  │<─ 10. 返回结果 ────────────┤<─────────────────────────────┤

调用合约完整流程

前端                          后端                          NULS节点
  │                            │                               │
  ├─ 1. 收集参数 ──────────────>│                               │
  │                            ├─ 2. 导入私钥生成地址          │
  │                            ├─ 3. 预估gas ─────────────────>│
  │                            │<─────────────────────────────┤
  │                            ├─ 4. 获取余额 ────────────────>│
  │                            │<─────────────────────────────┤
  │                            ├─ 5. 构建交易inputs/outputs   │
  │                            ├─ 6. 组装并签名交易           │
  │                            ├─ 7. 验证交易 ────────────────>│
  │                            │<─────────────────────────────┤
  │                            ├─ 8. 广播交易 ────────────────>│
  │<─ 9. 返回结果 ─────────────┤<─────────────────────────────┤

后端实现

后端服务器 (contract-tool-server.js) 使用以下模块:

  • Express: Web服务器框架
  • CORS: 跨域资源共享
  • body-parser: 请求体解析
  • nuls2-js-sdk: NULS区块链SDK

后端直接调用SDK的核心模块:

  • src/test/contractCreate.js - 创建合约逻辑
  • src/test/contractCall.js - 调用合约逻辑

系统要求

后端要求

  • Node.js 12.0 或更高版本
  • npm 或 yarn 包管理器
  • 依赖包: express, cors, body-parser

前端要求

  • 现代浏览器(Chrome、Firefox、Safari、Edge等)
  • 支持ES6+特性
  • 支持Fetch API

跨域问题

由于采用了前后端分离架构,跨域问题由后端服务器的CORS中间件处理。

如果仍遇到跨域问题:

  1. 确认后端服务器已启动
  2. 检查前端的 API_BASE_URL 配置是否正确
  3. 确认NULS节点允许来自后端服务器的请求

安全提示

⚠️ 重要:

  • 请勿在不安全的环境中输入私钥
  • 建议使用测试私钥进行测试
  • 生产环境请确保网络连接安全

示例

创建合约示例

私钥: your_private_key_hex
合约别名: my_token
合约代码: 504b03040a0000080000aa7b564e...
参数1: TokenName
参数2: TKN
参数3: 1000000000
参数4: 8
备注: create my token contract

调用合约示例

私钥: your_private_key_hex
合约地址: tNULSeBaN...
方法名: transfer
转入NULS数量: 0
参数1: tNULSeBaN...  (接收地址)
参数2: 1000000      (转账金额)
备注: token transfer

常见问题

1. 后端服务启动失败

问题: 运行 node contract-tool-server.js 报错

解决方案:

# 检查依赖是否安装
npm install

# 检查是否缺少依赖包
npm install express cors body-parser

2. 无法连接到后端服务

问题: 前端显示"API调用失败"

解决方案:

  • 确认后端服务已启动 (运行 node contract-tool-server.js)
  • 检查后端服务地址是否正确 (默认 http://localhost:3000)
  • 测试健康检查接口: curl http://localhost:3000/api/health

3. 无法连接到NULS网络

问题: 显示"加载网络信息失败"

解决方案:

  • 检查NULS节点RPC地址是否可访问
  • 确认RPC地址是否正确
  • 如果使用本地节点,确认节点已启动

4. 创建/调用合约失败

问题: 交易失败或验证失败

解决方案:

  • 检查账户余额是否足够(需要支付手续费和gas费)
  • 确认私钥格式正确(十六进制字符串)
  • 验证参数类型和数量是否匹配合约要求
  • 查看浏览器控制台和后端服务器日志获取详细错误信息

5. 参数格式错误

问题: 参数解析失败

解决方案:

  • 字符串参数直接输入,如: TokenName
  • 数组参数使用JSON格式,如: ["address1","address2"]
  • 数字参数不要加引号,如: 1000000000
  • 地址参数包含正确的前缀

6. 端口被占用

问题: Error: listen EADDRINUSE :::3000

解决方案:

# 查找占用端口的进程
lsof -i:3000

# 或修改服务器端口
# 编辑 contract-tool-server.js 中的 PORT 变量

更新日志

v2.0.0 (2025-11-11)

  • ✨ 重构为前后端分离架构
  • ✨ 新增Node.js后端服务器
  • ✨ 完整实现创建合约功能
  • ✨ 完整实现调用合约功能
  • ✅ 直接集成nuls2-js-sdk
  • ✅ 支持实时日志输出
  • 🔒 提升私钥安全性(后端处理)

v1.0.0 (2025-11-11)

  • 初始版本发布
  • 支持网络环境切换
  • 提供创建和调用合约界面
  • 实现RPC接口调用

反馈与贡献

如有问题或建议,请联系开发团队或提交Issue。

许可证

本工具遵循项目主许可证。