Skip to content

빠른 시작 ​

로컬 네트워크에서 처음부터 토큰 배포까지 약 10분이면 됩니다.

시작하기 전에

공개 네트워크는 아직 운영되지 않으므로, 이 가이드는 여러분의 컴퓨터에서 실행하는 노드와 gateway를 사용합니다. CHAIN_ENV=testnet으로 실행하세요(이 설정으로 faucet이 활성화됩니다) — 노드 실행을 참고하세요. 그다음:

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. 지갑 만들기 ​

웹 앱(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)

서명에는 SDK가 브라우저에서 로드하는 암호화 WASM 모듈이 필요합니다. 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>"}'

faucet은 기본적으로 테스트용 NRO 50개를 지급하고 여러분의 공개 키를 주소에 바인딩합니다. 웹 앱의 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, … }

응답에는 상태가 pending인 트랜잭션 hash가 들어 있습니다. 1초 뒤 GET /api/v1/transactions/:hash를 조회하면 confirmed로 표시됩니다.

5. 토큰 배포 ​

저장소에는 컴파일된 NRC-20 토큰이 neurochain/contracts/nrc20/nrc20.hex에 포함되어 있습니다.

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'

// 조회 — 트랜잭션 없이 실행되며 가스가 들지 않음
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와 호출 데이터를 참고하세요.

다음 단계 ​