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设计
- ✅ 实时日志输出
npm install express cors body-parsernode 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 - 健康检查
============================================================
在浏览器中访问: http://localhost:3000/contract-tool.html
工具启动时默认使用开发网(Dev)环境。你可以点击顶部的网络按钮切换环境:
- 主网 (Main):
https://api.nuls.io/jsonrpc - 测试网 (Test):
https://beta.api.nuls.io/jsonrpc - 开发网 (Dev):
http://127.0.0.1:18004/jsonrpc - 自定义 (Custom): 输入自定义的RPC地址
切换网络后,页面会自动:
- 调用RPC的
info接口获取网络信息 - 配置后端SDK使用对应的网络环境
页面顶部会显示当前网络的配置信息:
- Chain ID: 链ID
- Asset ID: 资产ID
- 地址前缀: 地址前缀(如NULS、tNULS、ITAC等)
- 符号: 资产符号
- 私钥: 用于签名交易的私钥(十六进制格式)
- 合约代码: 合约编译后的字节码(十六进制字符串)
- 合约别名: 为合约设置一个别名
- 构造函数参数: 按顺序输入构造函数的参数值
- 支持字符串、数字等基本类型
- 支持JSON数组格式,如:
["value1","value2"]
- 备注: 交易备注信息
- 在"创建合约"页签中填写必填参数
- 根据合约的构造函数添加参数(可添加多个)
- 点击"创建合约"按钮
- 私钥: 用于签名交易的私钥(十六进制格式)
- 合约地址: 要调用的合约地址
- 方法名: 要调用的合约方法名
- 方法描述: 方法的描述信息(通常可为空)
- 转入NULS数量: 需要转入合约的NULS数量(实际值,如200个NULS则输入200)
- 方法参数: 按顺序输入方法的参数值
- 支持字符串、数字等基本类型
- 支持JSON数组格式,如:
["address1","address2"]
- 备注: 交易备注信息
- 在"调用合约"页签中填写必填参数
- 如需转入NULS,填写数量(工具会自动乘以10^8)
- 根据合约方法添加参数(可添加多个)
- 点击"调用合约"按钮
工具会自动处理不同类型的参数:
- 字符串: 直接输入,如
"hello" - 数字: 直接输入,如
100000000 - 布尔值: 输入
true或false - 数组: 使用JSON格式,如
["item1","item2"]或[1,2,3]
- 点击"添加参数"按钮可以添加更多参数输入框
- 点击"删除"按钮可以删除对应的参数
- 至少保留一个参数输入框
采用前后端分离架构的优势:
- 安全性: 私钥在后端处理,不会暴露在浏览器中
- 兼容性: SDK依赖Node.js环境,后端可以完整使用所有功能
- 易维护: 前后端职责清晰,便于升级和维护
- 可扩展: 可以轻松添加新的API端点和功能
配置网络环境
请求参数:
{
"network": "main|test|dev|custom",
"customUrl": "http://...",
"chainId": 101
}创建智能合约
请求参数:
{
"privateKey": "...",
"alias": "...",
"contractCode": "...",
"args": [...],
"remark": "...",
"chainId": 101,
"assetId": 1,
"addressPrefix": "NULS"
}响应结果:
{
"success": true,
"message": "合约创建成功",
"data": {
"fromAddress": "...",
"contractAddress": "...",
"txHash": "...",
"logs": [...]
}
}调用智能合约
请求参数:
{
"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中间件处理。
如果仍遇到跨域问题:
- 确认后端服务器已启动
- 检查前端的
API_BASE_URL配置是否正确 - 确认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
问题: 运行 node contract-tool-server.js 报错
解决方案:
# 检查依赖是否安装
npm install
# 检查是否缺少依赖包
npm install express cors body-parser问题: 前端显示"API调用失败"
解决方案:
- 确认后端服务已启动 (运行
node contract-tool-server.js) - 检查后端服务地址是否正确 (默认 http://localhost:3000)
- 测试健康检查接口:
curl http://localhost:3000/api/health
问题: 显示"加载网络信息失败"
解决方案:
- 检查NULS节点RPC地址是否可访问
- 确认RPC地址是否正确
- 如果使用本地节点,确认节点已启动
问题: 交易失败或验证失败
解决方案:
- 检查账户余额是否足够(需要支付手续费和gas费)
- 确认私钥格式正确(十六进制字符串)
- 验证参数类型和数量是否匹配合约要求
- 查看浏览器控制台和后端服务器日志获取详细错误信息
问题: 参数解析失败
解决方案:
- 字符串参数直接输入,如:
TokenName - 数组参数使用JSON格式,如:
["address1","address2"] - 数字参数不要加引号,如:
1000000000 - 地址参数包含正确的前缀
问题: Error: listen EADDRINUSE :::3000
解决方案:
# 查找占用端口的进程
lsof -i:3000
# 或修改服务器端口
# 编辑 contract-tool-server.js 中的 PORT 变量- ✨ 重构为前后端分离架构
- ✨ 新增Node.js后端服务器
- ✨ 完整实现创建合约功能
- ✨ 完整实现调用合约功能
- ✅ 直接集成nuls2-js-sdk
- ✅ 支持实时日志输出
- 🔒 提升私钥安全性(后端处理)
- 初始版本发布
- 支持网络环境切换
- 提供创建和调用合约界面
- 实现RPC接口调用
如有问题或建议,请联系开发团队或提交Issue。
本工具遵循项目主许可证。