快速开始
在本地网络上从零开始部署一个代币,大约需要十分钟。
开始之前
公共网络尚未运行,因此本指南使用你本机上的节点和 gateway。以 CHAIN_ENV=testnet 启动它们(这样会启用水龙头)——参见运行节点。然后:
export NODE_RPC=http://localhost:9933
export GATEWAY=http://localhost:30001. 检查网络
curl -s "$GATEWAY/api/v1/network/status"
curl -s "$NODE_RPC/health"height 应每隔几秒增长一次。单个本地节点上出现 bft_ready: false 是正常的——它表示验证者少于 7 个。
2. 获取钱包
打开 Web 应用(http://localhost:8080),选择 Create wallet,并记下 24 个单词。应用会显示你的 neuro:<15 hex>.human 地址。
或者用 SDK 在你自己的页面中派生:
import { NeuroChain } from './neurochain.js'
const nc = new NeuroChain({ gateway: 'http://localhost:3000' })
const wallet = await nc.walletFromMnemonic('<你的 24 个单词>')
console.log(wallet.address, wallet.publicKey)签名需要加密 WASM 模块,SDK 会在浏览器中加载它。参见 JavaScript SDK → 加密模块。
3. 充值
curl -s -X POST "$NODE_RPC/api/v1/faucet" \
-H 'Content-Type: application/json' \
-d '{"address":"neuro:<15 hex>.human","public_key":"<公钥 hex>"}'水龙头默认发放 50 个测试 NRO,并把你的公钥绑定到该地址。Web 应用中的 Faucet 按钮功能相同。
curl -s "$GATEWAY/api/v1/accounts/neuro:<15 hex>.human"查看 balance_human(NRO)和 nonce。
4. 发送 NRO
当前构建中 SDK 转账不可用
nc.transfer() 把金额作为 JSON 字符串发送,节点会拒绝(Missing from/to/value)。在 SDK 修复之前,请用数字类型的 value 发送转账——参见 JavaScript SDK → 已知问题。
import { toRaw } from './neurochain.js'
const { base_fee } = await nc.gasEstimate()
const gas_price = Math.ceil(base_fee * 1.5) // 保持高于基础费用
const to = 'neuro:<另一个地址>.human'
const value = Number(toRaw('1.5')) // 1.5 NRO 换算为 uNRO,数字类型
const nonce = await nc.nextNonce(wallet.address)
const sig = wallet.sign(to, value, nonce) // { signature, public_key }
const res = await fetch('http://localhost:3000/api/v1/transactions', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ from: wallet.address, to, value, nonce, gas_price, ...sig }),
}).then(r => r.json())
// { tx_hash, status: 'pending', estimated_block, sentinel_score, … }响应中包含交易 hash,状态为 pending;一秒后 GET /api/v1/transactions/:hash 会显示 confirmed。
5. 部署代币
仓库在 neurochain/contracts/nrc20/nrc20.hex 提供了一个已编译的 NRC-20 代币。
const bytecodeHex = (await (await fetch('/nrc20.hex')).text()).trim()
await nc.deployContract({
wallet,
bytecodeHex,
name: 'MyToken',
template: 'nrc20',
initArgs: { name: 'MyToken', symbol: 'MTK', decimals: 6, total_supply: '1000000' },
})部署是一笔发往 neuro:system.deploy 的交易。每个验证者都会对字节码运行 VMGuardian 审计,在 neuro:<10 hex>.app 创建合约,并以你的 initArgs 调用 initialize。total_supply 以整枚代币给出,decimals 必须是数字:节点会把供应量换算为代币的最小单位(6 位小数时 1000000 变为 10¹² 个单位),全部铸造给你。仓库中的 NRC-20 字节码在受信任列表中,因此获得安全分数 100。合约地址可在你的交易历史或 GET /api/v1/contracts 中找到。
6. 读取和调用合约
const token = 'neuro:<10 hex>.app'
// 读取——无需交易,不消耗 gas
await nc.contractQuery(token, 'balance_of', { address: wallet.address })
// → '{"ok":true,"value":1000000000000}' (最小单位)
// 写入——带 JSON 调用数据的签名交易
await nc.contractCall({
wallet,
address: token,
fn: 'transfer',
args: { to: 'neuro:<另一个地址>.human', amount: '250' }, // 整枚代币——由节点换算
gasPrice: Math.ceil(base_fee * 1.5),
})合约从宿主(get_caller())得知是谁调用了它,而不是从参数中获取。参见 ABI 与调用数据。
下一步
- JavaScript SDK——全部方法。
- 部署合约——审计关卡、构造函数和限制。
- NeuroWASM——编写你自己的合约。