본문으로 건너뛰기

Native Program

Nigo Native Program은 PROGRAM_VALIDATED_CELL transaction의 상태 전이 규칙을 검증하는 프로토콜 프로그램입니다. Solidity로 작성하고 EVM bytecode로 실행하지만, 일반 Ethereum smart contract처럼 contract storage를 직접 변경하거나 다른 account를 호출하지 않습니다.

업무 규칙을 Java Core와 storage에 하드코딩하지 않고 versioned artifact와 immutable descriptor로 분리하는 것이 핵심 목적입니다.

일반 EVM contract와의 차이

항목일반 EVM contractNative Program
실행 목적사용자 애플리케이션 상태 변경선언된 StateCell 전이 검증
Revision일반 Osaka profiledescriptor에 고정된 Paris
상태 접근EVM storage와 account hostcanonical context의 input/output
외부 호출허용금지
SLOAD / SSTORE허용금지
Contract 생성허용금지
결과EVM state/log/resultauthorization, state transition과 event 검증 결과

Solidity와 EVM은 결정론적 validator를 작성하고 실행하는 언어·엔진으로 사용됩니다. 원장 상태의 실제 반영은 Core가 Native Program 결과와 transaction의 declared transition을 exact-match한 뒤 수행합니다.

실행 흐름

State-closed validator

Native Program은 필요한 상태를 transaction과 Core가 만든 context로 전달받습니다.

  • chain ID, block height와 timestamp
  • transaction hash, signer와 intent hash
  • input/output StateCell
  • signed asset scope
  • Core가 검증한 Asset/Policy/Supply view
  • method selector와 arguments
  • protocol fee

Runtime은 다음 동작을 사용할 수 없습니다.

  • SLOAD, SSTORE
  • account balance 또는 code 조회
  • 외부 call
  • contract create
  • self-destruct

Runtime을 registry에 설치하기 전에 executable instruction을 검사하고, PUSHn data를 opcode로 잘못 해석하지 않으면서 금지된 동작을 거부합니다.

이 구조는 validator가 Node-local DB나 호출 순서에 따라 다른 결과를 내는 것을 방지하고, transaction input/output에서 접근 집합을 계산할 수 있게 합니다.

Program identity와 revision

Native Program은 stable identity와 immutable revision을 분리합니다.

역할
programIdrevision과 무관한 program identity 및 Program State namespace
revision양의 UINT32 revision 번호
descriptorHash하나의 immutable revision descriptor identity
runtimeCodeHashruntime bytecode의 content address
previousDescriptorHashrevision chain의 이전 descriptor 연결

Transaction의 ProgramInvocation은 다음을 함께 서명합니다.

programId
expectedRevision
expectedDescriptorHash
methodSelector
assetScopes
arguments

Registry의 active revision이 바뀌더라도 transaction이 기대한 revision/hash와 다르면 실행하지 않습니다. PINNED consumer는 exact revision을 사용하고, governance default를 따르는 FOLLOW_GOVERNED consumer는 실행 높이의 available default를 해석합니다.

Registry와 합의 상태

Program identity, revision descriptor, runtime, status, default와 authority schedule은 NATIVE_SYSTEM StateCell에 저장됩니다. Artifact manifest와 classpath/filesystem loader는 이 상태를 genesis 또는 publication 과정에서 생성하기 위한 입력이지, 운영 중 별도 catalog로 합의 상태를 덮어쓰지 않습니다.

Runtime은 code hash 기반 content address로 저장하고, (programId, revision, descriptorHash)를 실행 cache key로 사용합니다. Admission과 실제 block execution에서 revision/hash를 모두 검증합니다.

Program class와 capability

Program class는 publication과 activation 권한의 상한을 정의합니다.

  • USER: public publication 경로로 설치 가능한 일반 validator
  • ASSET_CONTROLLER: Native Asset 전이를 검증하는 privileged program
  • PROTOCOL: protocol-level privileged program

Public USER install은 privileged class나 capability를 만들 수 없습니다. Asset Controller와 Protocol class는 profile에 고정된 governance/activator 정책을 통과해야 합니다.

Capability는 validator result가 요청할 수 있는 효과를 제한합니다. Bytecode가 canonical result를 반환했다고 해서 descriptor에 없는 authorization, event 또는 state transition capability가 생기지 않습니다.

Built-in Fungible Asset Controller

현재 artifact에는 Native Asset Registry와 세 Controller 계층이 포함됩니다.

Program기능일반 소유자 전송대표 구성
Asset Registrynon-zero Asset ID 등록, descriptor와 zero supply 검증해당 없음Registry
Basic Controllerallowance approve/update/revoke와 transferFromDirect CellNIGO
Mintable ControllerBasic + mint/burnDirect CellBWGC 예제
Managed ControllerMintable + controller-validated transferProgram-validated CellKRWN 예제

대표 자산 이름은 profile 이해를 돕는 표시 정보입니다. 합의 상태는 문자열 대신 exact programId, revision mode, revision과 descriptor hash를 저장합니다.

Controller가 존재한다는 사실만으로 특정 증권·자산 정책이 완료됐다는 의미는 아닙니다. 투자자 자격, 이전 제한, freeze, forced transfer, 권리 행사와 기관 연계는 별도 제품/정책 설계와 검증이 필요합니다.

Lifecycle governance

Governed Program은 canonical lifecycle action을 통해 revision과 authority schedule을 변경할 수 있습니다.

INSTALL
STAGE
ACTIVATE
SET_DEFAULT
DEACTIVATE
ROTATE_AUTHORITY
MIGRATE
ABORT

Action wire는 expected/target revision, descriptor hash, activation height, authority revision, lifecycle nonce와 deadline을 결속합니다. Action hash는 content hash이며 독립 authorization signature가 아닙니다.

고정 Lifecycle Extension은 일반 EVM contract가 governance action을 요청할 수 있는 stateful protocol 경계입니다.

address: 0x4e49474f00000000000000000000000000000001
ABI: requestLifecycle(bytes) -> bytes32

Direct CALL, zero value와 strict ABI만 허용합니다. Authorization은 tx.origin이나 calldata role이 아니라 EVM frame의 msg.sender와 현재 StateCell authority를 exact-match해 판정합니다.

승인된 action의 consumed/produced Cell과 event는 transaction proof journal에 함께 결속되고, 상위 frame이 revert하거나 out-of-gas가 나면 모두 rollback됩니다. State/authority rejection을 contract가 catch하더라도 governance effect만 부분 commit하지 못하도록 transaction-fatal로 처리합니다.

현행 state migration machine이 없는 MIGRATEABORT는 fail-closed합니다.

Public publication

Public USER Program의 artifact 게시와 설치는 별도 Publication Extension을 사용합니다.

address: 0x4e49474f00000000000000000000000000000002
ABI: requestPublication(bytes) -> bytes32
actions: PUBLISH, INSTALL_USER

PUBLISH는 descriptor와 runtime을 content-addressed StateCell에 기록하고, INSTALL_USER는 chain ID, msg.sender와 salt에서 program ID를 파생해 published revision 1을 설치합니다.

Public path는 USER, IMMUTABLE과 허용된 capability 상한만 만들 수 있습니다. Privileged asset/protocol activation 경로와 분리되어 있습니다.

Artifact

각 artifact revision은 다음 파일을 가집니다.

파일역할
runtime.binNigoVM이 실행할 deployed runtime bytecode
manifest.jsoncompiler, identity, revision, hash, capability와 schema manifest
abi.json개발·분석용 Solidity ABI
opcodes.txtruntime opcode 검토 자료

Build는 compiler profile과 source/runtime hash를 고정하고 생성 결과를 exact gate로 검증합니다. 운영 Node는 Solidity source를 다시 컴파일하지 않고 검증된 runtime과 descriptor를 사용합니다.

현재 경계

현재 지원 범위
  • 현행 built-in Program은 immutable revision 1을 기본으로 합니다.
  • Lifecycle scheduling과 publication foundation이 있어도 모든 업무 migration이 구현된 것은 아닙니다.
  • Rust consumer는 canonical vector에 SPECIFIED_NOT_IMPLEMENTED로 분류됩니다.
  • Native Program foundation만으로 regulated asset 또는 STO 업무 규정 준수가 자동 완성되지 않습니다.

다음 문서