Skip to content

快速开始 ​

在本地网络上从零开始部署一个代币,大约需要十分钟。

开始之前

公共网络尚未运行,因此本指南使用你本机上的节点和 gateway。以 CHAIN_ENV=testnet 启动它们(这样会启用水龙头)——参见运行节点。然后:

bash
export NODE_RPC=http://localhost:9933
export GATEWAY=http://localhost:3000

1. 检查网络 ​

bash
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 在你自己的页面中派生:

js
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. 充值 ​

bash
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 按钮功能相同。

bash
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 → 已知问题。

js
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 代币。

js
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. 读取和调用合约 ​

js
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 与调用数据。

下一步 ​