NEO智能合约的部署与调用教程
步骤 | 操作目的 | 环境/工具 | 关键命令或界面路径 | 注意事项 |
---|---|---|---|---|
1 | 安装NEO开发包 | Windows / macOS / Linux | git clone https://github.com/neo-project/neo-devpack-dotnet.git | 确认已装.NET 6 SDK,克隆后执行dotnet restore |
2 | 启动本地私链 | Docker | docker run -d --name neo-privatenet -p 20332-20336:20332-20336/tcp cityofzion/neo-privatenet | 首次拉取镜像约1 GB,等待Status=Healthy再继续 |
3 | 创建钱包文件 | neo-cli | ./neo-cli --command create wallet myWallet.json | 记录密码与WIF私钥,后续需要签名 |
4 | 获取测试Gas | neo-cli | 打开钱包后执行 claim gas | 私链默认有1亿NEO,需先发送给自己再claim |
5 | 编写合约 | C# | 新建类库,继承SmartContract,入口方法加[DisplayName("main")] | 方法必须返回bool或整数,否则无法通过编译 |
6 | 编译合约 | Visual Studio / dotnet CLI | dotnet publish -c Release -o ./artifacts | 生成.abi.json、.nef、.manifest.json三份文件 |
7 | 部署合约 | neo-cli | deploy ./artifacts/MyContract.nef ./artifacts/MyContract.abi.json 0 05 05 | 最后两参数是storage与dynamicCall标志,0关5开 |
8 | 记录脚本哈希 | neo-cli | 部署成功后会返回0x开头的ScriptHash | 复制保存,调用时必须使用 |
9 | 构造调用参数 | neo-cli | buildinvoke 0x3e7e... main [{"type":"String","value":"hello"}] | 参数顺序必须与合约方法签名一致 |
10 | 签名并广播 | neo-cli | sign send | 若钱包未解锁会提示重新open wallet |
11 | 查看结果 | neo-cli | 返回json里"stack"字段即为返回值 | 失败时看"exception"字段定位问题 |
12 | 浏览器验证 | https://dora.coz.io | 输入ScriptHash可查交易、事件日志 | 私链需把浏览器指向本地http://127.0.0.1:8080 |
13 | 升级合约 | neo-cli | update 0x3e7e... ./artifacts/MyContract_v2.nef ./artifacts/MyContract_v2.abi.json | 升级者必须是原合约的Owner |
14 | 销毁合约 | neo-cli | destroy 0x3e7e... | 销毁后链上代码不可恢复,但历史交易仍可查 |
15 | 常见错误速查 | 1) Insufficient GAS→先claim再部署;2) Contract does not exist→ScriptHash大小写或前缀0x漏写;3) Parameter mismatch→abi.json与方法签名不一致 | 遇到NEP-17标准转账失败,先检查_decimals与Symbol方法是否公开 |